This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[PATCH 3/3] ppc64le: Fix record argument of shared library function
- From: Ravi Bangoria <ravi dot bangoria at linux dot vnet dot ibm dot com>
- To: systemtap at sourceware dot org
- Cc: hemant at linux dot vnet dot ibm dot com, mjw at redhat dot com, atrajeev at linux dot vnet dot ibm dot com, Ravi Bangoria <ravi dot bangoria at linux dot vnet dot ibm dot com>
- Date: Thu, 21 Jul 2016 18:47:16 +0530
- Subject: [PATCH 3/3] ppc64le: Fix record argument of shared library function
- Authentication-results: sourceware.org; auth=none
- References: <1469107036-4239-1-git-send-email-ravi.bangoria@linux.vnet.ibm.com>
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);
}
--
2.1.4