[Ltrace-devel] [PATCH] Check return value of PTRACE_PEEKTEXT for ppc64
Edjunior Barbosa Machado
emachado at linux.vnet.ibm.com
Thu Dec 15 02:17:36 UTC 2011
Hi,
the current upstream version of ltrace shows an ugly testsuite result on ppc64:
# of expected passes 23
# of unexpected failures 74
Taking a closer look, I noticed ltrace is unable to track mostly of the library calls on PowerPC 64-bit. This seems to be happening due to a failure in a PTRACE_PEEKTEXT call in the function sym2addr(), which returns -1 ('No such process', according to perror()) that is saved as a valid address for a breakpoint. The following patch ignores this error and sets addr = 0, which means this address will be checked again in the future. This patch fixes mostly of the failures in the testsuite on ppc64:
# of expected passes 88
# of unexpected failures 9
Please let me know if you have any comments or concerns.
Thanks!
--
Edjunior Barbosa Machado
IBM Linux Technology Center
diff --git a/sysdeps/linux-gnu/ppc/plt.c b/sysdeps/linux-gnu/ppc/plt.c
index 668f63d..9308678 100644
--- a/sysdeps/linux-gnu/ppc/plt.c
+++ b/sysdeps/linux-gnu/ppc/plt.c
@@ -1,5 +1,6 @@
#include <gelf.h>
#include <sys/ptrace.h>
+#include <errno.h>
#include "common.h"
GElf_Addr
@@ -42,7 +43,15 @@ sym2addr(Process *proc, struct library_symbol *sym) {
// non-secure case, the PLT is executable code and we can put the
// break-point right in the PLT.
- pt_ret = ptrace(PTRACE_PEEKTEXT, proc->pid, addr, 0);
+ if ((pt_ret = ptrace(PTRACE_PEEKTEXT, proc->pid, addr, 0)) == -1) {
+ // ptrace might return -1 (No such process) on PowerPC-64 when
+ // the process is not initialized yet. Return 0 for now and the
+ // address will be collected again in the future.
+ if (errno == ESRCH)
+ return 0;
+ else
+ perror("PTRACE_PEEKTEXT");
+ }
#if SIZEOF_LONG == 8
if (proc->mask_32bit) {
More information about the Ltrace-devel
mailing list