Reapplying delayed breakpoints init. Wild guess, might cure brew build on

ppc32.
This commit is contained in:
Petr Machata 2006-07-14 23:50:23 +00:00
parent 8b29a3cdc5
commit 2a58041f7b
2 changed files with 67 additions and 26 deletions

View File

@ -41,30 +41,6 @@ Index: elf.c
lte->ehdr.e_entry),
PLTs_initialized_by_here,
lib_tail, 1, 0);
Index: sysdeps/linux-gnu/breakpoint.c
===================================================================
--- sysdeps/linux-gnu/breakpoint.c (revision 45)
+++ sysdeps/linux-gnu/breakpoint.c (working copy)
@@ -9,6 +9,8 @@
#include "output.h"
#include "debug.h"
+#include <errno.h>
+
static unsigned char break_insn[] = BREAKPOINT_VALUE;
#ifdef ARCH_HAVE_ENABLE_BREAKPOINT
@@ -28,6 +30,10 @@ void enable_breakpoint(pid_t pid, struct
long a =
ptrace(PTRACE_PEEKTEXT, pid, sbp->addr + i * sizeof(long),
0);
+ if (a == -1 && errno) {
+ perror ("ptrace");
+ return;
+ }
for (j = 0;
j < sizeof(long)
&& i * sizeof(long) + j < BREAKPOINT_LENGTH; j++) {
Index: sysdeps/linux-gnu/ppc/plt.c
===================================================================
--- sysdeps/linux-gnu/ppc/plt.c (revision 45)
@ -196,3 +172,68 @@ Index: breakpoints.c
}
proc->callstack_depth = 0;
proc->breakpoints_enabled = -1;
Index: wait_for_something.c
===================================================================
--- wait_for_something.c (revision 45)
+++ wait_for_something.c (working copy)
@@ -48,6 +48,18 @@ struct event *wait_for_something(void)
fprintf(stderr, "signal from wrong pid %u ?!?\n", pid);
exit(1);
}
+#ifdef __powerpc__
+ static int bp_initialized = 0;
+ if (!bp_initialized) {
+ /* This is a hack to do delayed initialization of
+ breakpoints for ppc32's secure PLT. We don't have
+ pid in hand until here, and we need pid to ptrace
+ the binary. */
+ debug(1, "delayed breakpoints_init ahead");
+ breakpoints_init (event.proc);
+ bp_initialized = 1;
+ }
+#endif
get_arch_dep(event.proc);
event.proc->instruction_pointer = NULL;
debug(3, "signal from pid %u", pid);
Index: sysdeps/linux-gnu/breakpoint.c
===================================================================
--- sysdeps/linux-gnu/breakpoint.c (revision 45)
+++ sysdeps/linux-gnu/breakpoint.c (working copy)
@@ -9,6 +9,8 @@
#include "output.h"
#include "debug.h"
+#include <errno.h>
+
static unsigned char break_insn[] = BREAKPOINT_VALUE;
#ifdef ARCH_HAVE_ENABLE_BREAKPOINT
@@ -24,20 +26,27 @@ void enable_breakpoint(pid_t pid, struct
debug(1, "enable_breakpoint(%d,%p)", pid, sbp->addr);
+ unsigned char orig[BREAKPOINT_LENGTH];
for (i = 0; i < 1 + ((BREAKPOINT_LENGTH - 1) / sizeof(long)); i++) {
long a =
ptrace(PTRACE_PEEKTEXT, pid, sbp->addr + i * sizeof(long),
0);
+ if (a == -1 && errno) {
+ perror ("ptrace");
+ return;
+ }
for (j = 0;
j < sizeof(long)
&& i * sizeof(long) + j < BREAKPOINT_LENGTH; j++) {
unsigned char *bytes = (unsigned char *)&a;
- sbp->orig_value[i * sizeof(long) + j] = bytes[j];
+ orig[i * sizeof(long) + j] = bytes[j];
bytes[j] = break_insn[i * sizeof(long) + j];
}
ptrace(PTRACE_POKETEXT, pid, sbp->addr + i * sizeof(long), a);
}
+ if (memcmp (orig, break_insn, BREAKPOINT_LENGTH) != 0)
+ memcpy (sbp->orig_value, orig, BREAKPOINT_LENGTH);
}
#endif /* ARCH_HAVE_ENABLE_BREAKPOINT */

View File

@ -1,7 +1,7 @@
Summary: Tracks runtime library calls from dynamically linked executables.
Name: ltrace
Version: 0.5
Release: 1.0.45svn.2
Release: 1.0.45svn.3
Source: ltrace-0.5.tar.gz
Patch2: ltrace-opd.patch
Patch3: ltrace-ppc32fc5.patch
@ -56,7 +56,7 @@ rm -rf $RPM_BUILD_ROOT
%config /etc/ltrace.conf
%changelog
* Fri Jul 14 2006 Petr Machata <pmachata@redhat.com> - 0.5-1.0.45svn.2
* Fri Jul 14 2006 Petr Machata <pmachata@redhat.com> - 0.5-1.0.45svn.3
- adding .gnu.hash patch to support new ELF hash table section
- adding testsuite patch to silent some bogus failures