diff --git a/ltrace-0.4-exec.patch b/ltrace-0.4-exec.patch new file mode 100644 index 0000000..6526ea8 --- /dev/null +++ b/ltrace-0.4-exec.patch @@ -0,0 +1,19 @@ +--- process_event.c 2006-02-20 16:48:07.000000000 -0500 ++++ process_event.fix 2006-07-04 04:20:27.000000000 -0400 +@@ -239,7 +239,6 @@ static void process_sysret(struct event + sysname(event->proc, event->e_un.sysnum)); + } + if (exec_p(event->proc, event->e_un.sysnum)) { +- if (gimme_arg(LT_TOF_SYSCALLR, event->proc, -1) == 0) { + pid_t saved_pid; + event->proc->mask_32bit = 0; + event->proc->personality = 0; +@@ -251,8 +250,6 @@ static void process_sysret(struct event + event->proc->pid = 0; + breakpoints_init(event->proc); + event->proc->pid = saved_pid; +- } else +- enable_all_breakpoints(event->proc); + } + continue_process(event->proc->pid); + } diff --git a/ltrace-0.4-fork.patch b/ltrace-0.4-fork.patch new file mode 100644 index 0000000..ada2fbc --- /dev/null +++ b/ltrace-0.4-fork.patch @@ -0,0 +1,199 @@ +diff -Naurp ltrace-0.4/ltrace.h ltrace-0.4-Getmsg/ltrace.h +--- ltrace-0.4/ltrace.h 2006-02-20 16:48:07.000000000 -0500 ++++ ltrace-0.4-Getmsg/ltrace.h 2006-07-18 02:23:36.000000000 -0400 +@@ -12,6 +12,7 @@ + #include "sysdep.h" + + #define MAX_LIBRARY 30 ++#define TRACE_FORK 1 + + #if defined HAVE_LIBIBERTY || defined HAVE_LIBSUPC__ + # define USE_DEMANGLE +@@ -170,7 +171,7 @@ extern void show_summary(void); + + /* Arch-dependent stuff: */ + extern char *pid2name(pid_t pid); +-extern void trace_set_options(struct process *proc, pid_t pid); ++extern void trace_set_options(struct process *proc, pid_t pid, int option); + extern void trace_me(void); + extern int trace_pid(pid_t pid); + extern void untrace_pid(pid_t pid); +@@ -198,5 +199,5 @@ extern void *plt2addr(struct process *, + #if 0 /* not yet */ + extern int umoven(struct process *proc, void *addr, int len, void *laddr); + #endif +- ++extern ulong get_child_pid(pid_t pid); + #endif +diff -Naurp ltrace-0.4/proc.c ltrace-0.4-Getmsg/proc.c +--- ltrace-0.4/proc.c 2006-02-20 16:48:07.000000000 -0500 ++++ ltrace-0.4-Getmsg/proc.c 2006-07-17 06:00:36.000000000 -0400 +@@ -22,10 +22,11 @@ struct process *open_program(char *filen + } + proc->filename = filename; + proc->breakpoints_enabled = -1; ++ proc->pid = 0; ++ breakpoints_init(proc); + if (pid) { + proc->pid = pid; + } +- breakpoints_init(proc); + + proc->next = list_of_processes; + list_of_processes = proc; +@@ -37,11 +38,13 @@ void open_pid(pid_t pid, int verbose) + struct process *proc; + char *filename; + ++#if 0 + if (trace_pid(pid) < 0) { + fprintf(stderr, "Cannot attach to pid %u: %s\n", pid, + strerror(errno)); + return; + } ++#endif + + filename = pid2name(pid); + +@@ -54,7 +57,6 @@ void open_pid(pid_t pid, int verbose) + return; + } + #endif +- + proc = open_program(filename, pid); +- proc->breakpoints_enabled = 1; ++ proc->breakpoints_enabled = -1; + } +diff -Naurp ltrace-0.4/process_event.c ltrace-0.4-Getmsg/process_event.c +--- ltrace-0.4/process_event.c 2006-02-20 16:48:07.000000000 -0500 ++++ ltrace-0.4-Getmsg/process_event.c 2006-07-18 03:05:16.000000000 -0400 +@@ -223,16 +223,6 @@ static void process_sysret(struct event + if (opt_T || opt_c) { + calc_time_spent(event->proc); + } +- if (fork_p(event->proc, event->e_un.sysnum)) { +- if (opt_f) { +- pid_t child = +- gimme_arg(LT_TOF_SYSCALLR, event->proc, -1); +- if (child > 0) { +- open_pid(child, 0); +- } +- } +- enable_all_breakpoints(event->proc); +- } + callstack_pop(event->proc); + if (opt_S) { + output_right(LT_TOF_SYSCALLR, event->proc, +diff -Naurp ltrace-0.4/sysdeps/linux-gnu/trace.c ltrace-0.4-Getmsg/sysdeps/linux-gnu/trace.c +--- ltrace-0.4/sysdeps/linux-gnu/trace.c 2006-02-20 16:48:07.000000000 -0500 ++++ ltrace-0.4-Getmsg/sysdeps/linux-gnu/trace.c 2006-07-18 02:49:35.000000000 -0400 +@@ -90,7 +90,7 @@ int trace_pid(pid_t pid) + return 0; + } + +-void trace_set_options(struct process *proc, pid_t pid) ++void trace_set_options(struct process *proc, pid_t pid, int option) + { + #ifndef PTRACE_SETOPTIONS + #define PTRACE_SETOPTIONS 0x4200 +@@ -101,10 +101,21 @@ void trace_set_options(struct process *p + #ifndef PTRACE_O_TRACESYSGOOD + #define PTRACE_O_TRACESYSGOOD 0x00000001 + #endif ++#ifndef PTRACE_O_TRACEFORK ++#define PTRACE_O_TRACEFORK 0x00000002 ++#endif ++ ++ ulong setoptions = 0; ++ + if (proc->tracesysgood & 0x80) + return; +- if (ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD) < 0 && +- ptrace(PTRACE_OLDSETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD) < 0) { ++ ++ setoptions |= PTRACE_O_TRACESYSGOOD; ++ if (TRACE_FORK == option){ ++ setoptions |= PTRACE_O_TRACEFORK; ++ } ++ if (ptrace(PTRACE_SETOPTIONS, pid, 0, setoptions) < 0 && ++ ptrace(PTRACE_OLDSETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD) < 0){ + perror("PTRACE_SETOPTIONS"); + return; + } +@@ -175,3 +186,18 @@ int umovestr(struct process *proc, void + *(char *)(laddr + offset) = '\0'; + return 0; + } ++ ++ulong get_child_pid(pid_t pid) ++{ ++#ifndef PTRACE_GETEVENTMSG ++#define PTRACE_GETEVENTMSG 0x4201 ++#endif ++ ulong child_pid = 9999; ++ ++ if( ptrace(PTRACE_GETEVENTMSG, pid, 0, &child_pid) < 0) { ++ perror("PTRACE_GETEVENTMSG"); ++ return 0; ++ } ++ return child_pid; ++} ++ +diff -Naurp ltrace-0.4/wait_for_something.c ltrace-0.4-Getmsg/wait_for_something.c +--- ltrace-0.4/wait_for_something.c 2006-02-20 16:48:07.000000000 -0500 ++++ ltrace-0.4-Getmsg/wait_for_something.c 2006-07-18 02:32:26.000000000 -0400 +@@ -14,15 +14,17 @@ + #include "options.h" + #include "debug.h" + ++#define FORK_MASK 0x00010000 + static struct event event; + + /* This should also update `current_process' */ + + static struct process *pid2proc(int pid); ++void verify(int sig_status); + + struct event *wait_for_something(void) + { +- pid_t pid; ++ pid_t pid, child_pid; + int status; + int tmp; + +@@ -54,7 +56,11 @@ struct event *wait_for_something(void) + if (event.proc->breakpoints_enabled == -1) { + enable_all_breakpoints(event.proc); + event.thing = LT_EV_NONE; +- trace_set_options(event.proc, event.proc->pid); ++ if(opt_f){ ++ trace_set_options(event.proc, event.proc->pid, TRACE_FORK); ++ }else{ ++ trace_set_options(event.proc, event.proc->pid, 0); ++ } + continue_process(event.proc->pid); + return &event; + } +@@ -92,6 +98,17 @@ struct event *wait_for_something(void) + event.e_un.signum = WSTOPSIG(status); + return &event; + } ++ if((WSTOPSIG(status) == SIGTRAP) && (status & FORK_MASK)) { ++ event.thing = LT_EV_NONE; ++ event.e_un.signum = WSTOPSIG(status); ++ child_pid = (pid_t) get_child_pid(event.proc->pid); ++ if (child_pid){ ++ open_pid(child_pid,0); ++ } ++ enable_all_breakpoints(event.proc); ++ continue_after_signal(event.proc->pid, event.e_un.signum); ++ return &event; ++ } + event.thing = LT_EV_BREAKPOINT; + if (!event.proc->instruction_pointer) { + event.proc->instruction_pointer = +@@ -115,3 +132,4 @@ static struct process *pid2proc(pid_t pi + } + return NULL; + } ++ diff --git a/ltrace-0.5-a2bp.patch b/ltrace-0.5-a2bp.patch new file mode 100644 index 0000000..1ae822b --- /dev/null +++ b/ltrace-0.5-a2bp.patch @@ -0,0 +1,22 @@ +diff -Bburp ltrace-0.5/breakpoints.c ltrace-0.5-pm/breakpoints.c +--- ltrace-0.5/breakpoints.c 2006-08-30 08:03:25.000000000 -0400 ++++ ltrace-0.5-pm/breakpoints.c 2006-08-30 08:02:39.000000000 -0400 +@@ -20,6 +20,10 @@ + + struct breakpoint *address2bpstruct(struct process *proc, void *addr) + { ++ if (!proc->breakpoints) { ++ proc->breakpoints = ++ dict_init(dict_key2hash_int, dict_key_cmp_int); ++ } + return dict_find_entry(proc->breakpoints, addr); + } + +@@ -33,7 +39,6 @@ insert_breakpoint(struct process *proc, + if (!proc->breakpoints) { + proc->breakpoints = + dict_init(dict_key2hash_int, dict_key_cmp_int); +- /* atexit(brk_dict_clear); *//* why bother to do this on exit? */ + } + + if (!addr) diff --git a/ltrace-0.5-attach.patch b/ltrace-0.5-attach.patch new file mode 100644 index 0000000..f22ea40 --- /dev/null +++ b/ltrace-0.5-attach.patch @@ -0,0 +1,11 @@ +--- ltrace-0.5/proc.c 2006-02-20 16:48:07.000000000 -0500 ++++ ltrace-0.5-pm/proc.c 2006-09-04 07:14:50.000000000 -0400 +@@ -55,6 +55,6 @@ void open_pid(pid_t pid, int verbose) + } + #endif + +- proc = open_program(filename, pid); +- proc->breakpoints_enabled = 1; ++ proc = open_program(filename, 0); ++ proc->pid = pid; + } diff --git a/ltrace-0.5-ppc-symval.patch b/ltrace-0.5-ppc-symval.patch new file mode 100644 index 0000000..94235ae --- /dev/null +++ b/ltrace-0.5-ppc-symval.patch @@ -0,0 +1,25 @@ +diff -Burp ltrace-0.5-orig/elf.c ltrace-0.5/elf.c +--- ltrace-0.5-orig/elf.c 2006-08-30 02:38:17.000000000 +0200 ++++ ltrace-0.5/elf.c 2006-08-30 03:42:30.000000000 +0200 +@@ -478,10 +478,17 @@ struct library_symbol *read_elf(struct p + + name = lte->dynstr + sym.st_name; + if (in_load_libraries(name, lte)) { +- addr = arch_plt_sym_val(lte, i, &rela); +- add_library_symbol(addr, name, &library_symbols, +- (PLTS_ARE_EXECUTABLE(lte) +- ? LS_TOPLT_EXEC : LS_TOPLT_POINT), ++ enum toplt pltt; ++ if (lte->ehdr.e_machine == EM_PPC) { ++ addr = sym.st_value; ++ pltt = LS_TOPLT_EXEC; ++ } ++ else { ++ addr = arch_plt_sym_val(lte, i, &rela); ++ pltt = (PLTS_ARE_EXECUTABLE(lte) ++ ? LS_TOPLT_EXEC : LS_TOPLT_POINT); ++ } ++ add_library_symbol(addr, name, &library_symbols, pltt, + ELF64_ST_BIND(sym.st_info) == STB_WEAK); + if (!lib_tail) + lib_tail = &(library_symbols->next); diff --git a/ltrace-ppc32fc5.patch b/ltrace-ppc32fc5.patch index 39c4380..30ff28d 100644 --- a/ltrace-ppc32fc5.patch +++ b/ltrace-ppc32fc5.patch @@ -120,33 +120,6 @@ Index: sysdeps/linux-gnu/ppc/arch.h - - -#endif -Index: process_event.c -=================================================================== ---- process_event.c (revision 45) -+++ process_event.c (working copy) -@@ -263,7 +263,7 @@ static void process_breakpoint(struct ev - struct breakpoint *sbp, *nxtbp; - - debug(2, "event: breakpoint (%p)", event->e_un.brk_addr); -- if ((sbp = event->proc->breakpoint_being_enabled) != 0) { -+ if ((sbp = event->proc->breakpoint_being_enabled) != NULL) { - #ifdef __powerpc__ - char nop_inst[] = PPC_NOP; - if (memcmp(sbp->orig_value, nop_inst, PPC_NOP_LENGTH) == 0) { -@@ -344,8 +344,11 @@ static void process_breakpoint(struct ev - event->proc->stack_pointer = get_stack_pointer(event->proc); - event->proc->return_addr = - get_return_addr(event->proc, event->proc->stack_pointer); -- output_left(LT_TOF_FUNCTION, event->proc, sbp->libsym->name); -- callstack_push_symfunc(event->proc, sbp->libsym); -+ if (!sbp->libsym->is_weak || event->proc->return_addr == NULL) { -+ debug (2, "libsym name=%s", sbp->libsym->name); -+ output_left(LT_TOF_FUNCTION, event->proc, sbp->libsym->name); -+ callstack_push_symfunc(event->proc, sbp->libsym); -+ } - #ifdef PLT_REINITALISATION_BP - if (event->proc->need_to_reinitialize_breakpoints - && (strcmp(sbp->libsym->name, PLTs_initialized_by_here) == Index: breakpoints.c =================================================================== --- breakpoints.c (revision 45) diff --git a/ltrace.spec b/ltrace.spec index 320c77b..4ea4965 100644 --- a/ltrace.spec +++ b/ltrace.spec @@ -1,13 +1,17 @@ Summary: Tracks runtime library calls from dynamically linked executables. Name: ltrace Version: 0.5 -Release: 4.45svn%{?dist} +Release: 5.45svn%{?dist} Source: ltrace-0.5.tar.gz +Patch0: ltrace-0.4-exec.patch +Patch1: ltrace-0.4-fork.patch Patch2: ltrace-0.5-opd.patch Patch3: ltrace-ppc32fc5.patch Patch4: ltrace-0.5-gnuhash.patch Patch5: ltrace-0.5-testsuite.patch -Patch6: ltrace-0.5-ppc32-2.patch +Patch6: ltrace-0.5-ppc-symval.patch +Patch7: ltrace-0.5-a2bp.patch +Patch8: ltrace-0.5-attach.patch License: GPL Group: Development/Debuggers ExclusiveArch: %{ix86} x86_64 ia64 ppc ppc64 s390 s390x alpha sparc @@ -27,11 +31,14 @@ execution of processes. %prep %setup -q +%patch0 -p0 +%patch1 -p1 %patch2 -p1 %patch3 -p0 %patch4 -p1 %patch5 -p1 %patch6 -p1 +%patch8 -p1 sed -i -e 's/-o root -g root//' Makefile.in %build @@ -59,9 +66,11 @@ rm -rf $RPM_BUILD_ROOT %config /etc/ltrace.conf %changelog -* Wed Aug 28 2006 Petr Machata - 0.5-4.45svn -- enabling testsuite in hunt for testsuite fail on ppc -- first take on ppc32 testsuite problems... +* Mon Sep 4 2006 Petr Machata - 0.5-5.45svn +- fix plt handling on ppc32 (symval patch) +- fix attaching to process (attach patch) +- add fork & exec patches from IBM +- adjust weak symbol handling (ppc32fc5 patch) * Wed Aug 23 2006 Petr Machata - 0.5-3.45svn - use "{X}.{release}svn" release string per naming guidelines