- 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)
This commit is contained in:
parent
7a6178741d
commit
311c7f7f06
19
ltrace-0.4-exec.patch
Normal file
19
ltrace-0.4-exec.patch
Normal file
@ -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);
|
||||
}
|
||||
199
ltrace-0.4-fork.patch
Normal file
199
ltrace-0.4-fork.patch
Normal file
@ -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;
|
||||
}
|
||||
+
|
||||
22
ltrace-0.5-a2bp.patch
Normal file
22
ltrace-0.5-a2bp.patch
Normal file
@ -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)
|
||||
11
ltrace-0.5-attach.patch
Normal file
11
ltrace-0.5-attach.patch
Normal file
@ -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;
|
||||
}
|
||||
25
ltrace-0.5-ppc-symval.patch
Normal file
25
ltrace-0.5-ppc-symval.patch
Normal file
@ -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);
|
||||
@ -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)
|
||||
|
||||
19
ltrace.spec
19
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 <pmachata@redhat.com> - 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 <pmachata@redhat.com> - 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 <pmachata@redhat.com> - 0.5-3.45svn
|
||||
- use "{X}.{release}svn" release string per naming guidelines
|
||||
|
||||
Loading…
Reference in New Issue
Block a user