[PATCH 3/3] ppc64le: Fix record argument of shared library function

Ravi Bangoria ravi.bangoria@linux.vnet.ibm.com
Tue Jul 26 15:59:00 GMT 2016


Hi Frank, Mark,

We already have test cases for probing in shared library.

Before applying patch:
   $ make verbose=1 installcheck RUNTESTFLAGS='exelib.exp -v --debug'

             === systemtap Summary ===

     # of expected passes        10
     # of unexpected failures    64


After applying patch:
   $ make verbose=1 installcheck RUNTESTFLAGS='exelib.exp -v --debug'

             === systemtap Summary ===

     # of expected passes        74


Please review patch.

Regards,
Ravi

On Thursday 21 July 2016 06:47 PM, Ravi Bangoria wrote:
> Symbol table contains module_bias + offset while debuginfo contains
> only offset(entrypc). Subtract module_bias from symbol table entry
> to compare it with entrypc while converting it to local entry point.
>
> Example:
>
>    $ vim shared.c
>      #include "shared.h"
>      #include "sys/sdt.h"
>      unsigned int add(unsigned int a, unsigned int b)
>      {
>          STAP_PROBE1(test, func_count, b);
>          int c;
>          c = a+b;
>          printf("c is %d\n", c);
>          return (a+b);
>      }
>    $ vim shared.h
>      #include<stdio.h>
>      extern unsigned int add(unsigned int a, unsigned int b);
>    $ vim app.c
>      #include <stdio.h>
>      #include "shared.h"
>      #include <sys/sdt.h>
>      #include "shared.h"
>      #include "sys/sdt.h"
>      unsigned int subs(unsigned int a, unsigned int b)
>      {
>          STAP_PROBE1(test, func_count1, a);
>          int c;
>          printf("\n Inside subs()\n");
>          c = a+b+a;
>          printf("c is %d\n", c);
>          return (a+b+a);
>      }
>      int main(void)
>      {
>          unsigned int a = 1;
>          unsigned int b = 2;
>          STAP_PROBE1(test, func_count1, b);
>          unsigned int result = 0;
>
>          result = add(a,b);
>          result = subs(a,b);
>          printf("\n The result is [%u]\n",result);
>          return 0;
>      }
>
>    $ gcc -c -Wall -Werror -fPIC -g -O3 shared.c
>    $ gcc -shared -o libshared.so shared.o
>    $ gcc -Wall app.c -o main -g -O3 -lshared -L/root
>    $ export LD_LIBRARY_PATH="/root":$LD_LIBRARY_PATH
>
>    $ ./stap -w --ldd -ve 'probe process(@2).function("add") \
>          {printf("Input probe hit and value = %d\n", $b); }' \
>          /root/libshared.so -c /root/main
>
>      semantic error: while processing probe process("/root/libshared.so")...
>
>      semantic error: not accessible at this address (pc: 0x107f8)...
>          dieoffset: 0x2c0 from /root/libshared.so
>          function: <unknown> at unknown source
>          alternative locations: [0x7f8,0x827], [0x827,0x86c]
>          source: probe process(@2).function("add") {printf("Input pr...
>
> After applying patch:
>
>    $ ./stap -w --ldd -ve 'probe process(@2).function("add") \
>          {printf("Input probe hit and value = %d\n", $b); }' \
>          /root/libshared.so -c /root/main
>      c is 3
>
>      Inside subs()
>      c is 4
>
>      The result is [4]
>      Input probe hit and value = 2
>
> Reported-by: Athira Rajeev<atrajeev@linux.vnet.ibm.com>
> Signed-off-by: Ravi Bangoria<ravi.bangoria@linux.vnet.ibm.com>
> ---
>   tapsets.cxx | 6 +++++-
>   1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/tapsets.cxx b/tapsets.cxx
> index 1b3a1ea..581a97e 100644
> --- a/tapsets.cxx
> +++ b/tapsets.cxx
> @@ -1432,7 +1432,11 @@ gep_to_lep(dwarf_query *q, Dwarf_Addr gep)
>         addr = sym.st_value;
>   #endif
>
> -      if (addr == gep && (GELF_ST_TYPE(sym.st_info) == STT_FUNC)
> +      /*
> +       * Symbol table contains module_bias + offset. Substract module_bias
> +       * to compare offset with gep.
> +       */
> +      if ((addr - bias) == gep && (GELF_ST_TYPE(sym.st_info) == STT_FUNC)
>             && sym.st_other)
>           return gep + PPC64_LOCAL_ENTRY_OFFSET(sym.st_other);
>       }



More information about the Systemtap mailing list