--- ltrace-0.5.orig/elf.c +++ ltrace-0.5/elf.c @@ -464,8 +464,7 @@ if (strcmp(xptr->name, PLTs_initialized_by_here) == 0) { if (lte->ehdr.e_entry) { add_library_symbol ( - elf_plt2addr (lte, (void*)(long) - lte->ehdr.e_entry), + opd2addr (lte, lte->ehdr.e_entry), PLTs_initialized_by_here, lib_tail, 1, 0); fprintf (stderr, "WARNING: Using e_ent" --- ltrace-0.5.orig/ltrace.1 +++ ltrace-0.5/ltrace.1 @@ -30,7 +30,7 @@ .TP .I \-C, \-\-demangle Decode (demangle) low-level symbol names into user-level names. -Besides removing any initial underscore prepended by the system, +Besides removing any initial underscore prefix used by the system, this makes C++ function names readable. .TP .I \-d, \-\-debug --- ltrace-0.5.orig/options.h +++ ltrace-0.5/options.h @@ -20,6 +20,7 @@ extern int opt_C; /* Demanglelow-level symbol names into user-level names */ extern int opt_n; /* indent trace output according to program flow */ extern int opt_T; /* show the time spent inside each call */ +extern int opt_o; /* output to a specific file */ struct opt_p_t { pid_t pid; --- ltrace-0.5.orig/options.c +++ ltrace-0.5/options.c @@ -42,6 +42,7 @@ #endif int opt_n = 0; /* indent trace output according to program flow */ int opt_T = 0; /* show the time spent inside each call */ +int opt_o = 0; /* output to a specific file */ /* List of pids given to option -p: */ struct opt_p_t *opt_p = NULL; /* attach to process with a given pid */ @@ -274,6 +275,7 @@ opt_n = atoi(optarg); break; case 'o': + opt_o++; output = fopen(optarg, "w"); if (!output) { fprintf(stderr, --- ltrace-0.5.orig/etc/ltrace.conf +++ ltrace-0.5/etc/ltrace.conf @@ -444,3 +444,81 @@ int SYS_removexattr(string,string); int SYS_lremovexattr(string,string); int SYS_fremovexattr(int,string); +int SYS_chdir(string); +int SYS_fchdir(int); +int SYS_chmod(string,octal); +int SYS_fchmod(int,octal); +int SYS_chown(string,int,int); +int SYS_fchown(int,int,int); +int SYS_lchown(string,int,int); +int SYS_chroot(string); +int SYS_dup(int); +int SYS_dup2(int,int); +int SYS_fdatasync(int); +int SYS_fsync(int); +int SYS_getpriority(int,int); +int SYS_setpriority(int,int,int); +int SYS_getrlimit(int,addr); +int SYS_setrlimit(int,addr); +int SYS_gettimeofday(addr,addr); +int SYS_settimeofday(addr,addr); +int SYS_setfsgid(int); +int SYS_setfsuid(int); +int SYS_getuid(void); +int SYS_setuid(int); +int SYS_getgid(void); +int SYS_setgid(int); +int SYS_getsid(int); +int SYS_setsid(int); +int SYS_setreuid(int,int); +int SYS_setregid(int,int); +int SYS_geteuid(void); +int SYS_getegid(void); +int SYS_setpgid(int,int); +int SYS_getresuid(addr,addr,addr); +int SYS_setresuid(int,int,int); +int SYS_getresgid(addr,addr,addr); +int SYS_setresgid(int,int,int); +int SYS_kill(int,int); +int SYS_link(string,string); +int SYS_madvise(addr,ulong,int); +int SYS_mkdir(string,octal); +int SYS_mknod(string,octal,int); +int SYS_msync(addr,ulong,int); +int SYS_nice(int); +int SYS_poll(addr,uint,int); +int SYS_readdir(uint,addr,uint); +int SYS_readlink(string,string,ulong); +int SYS_reboot(int,int,int,addr); +int SYS_rename(string,string); +int SYS_rmdir(string); +int SYS_sigaltstack(addr,addr); +int SYS_statfs(string,addr); +int SYS_fstatfs(int,addr); +int SYS_fstat(int,addr); +int SYS_lstat(string,addr); +int SYS_stime(addr); +int SYS_symlink(string, string); +int SYS_sysinfo(addr); +int SYS_syslog(int,string,int); +int SYS_truncate(string,long); +int SYS_ftruncate(int,long); +int SYS_mount(string,string,string,ulong,addr); +int SYS_umount(string); +int SYS_umount2(string,int); +int SYS_unlink(string); +int SYS_utime(string,addr); +long SYS_lseek(int,long,int); +addr SYS_signal(int,addr); +int SYS_sigaction(int,addr,addr); +int SYS_pause(void); +int SYS_sigpending(addr); +int SYS_sigprocmask(int,addr,addr); +int SYS_sigqueue(int,int,addr); +int SYS_sigsuspend(addr); +int SYS_wait(addr); +int SYS_waitpid(int,addr,int); +ulong SYS_readv(int,addr,int); +ulong SYS_writev(int,addr,int); +int SYS_mprotect(addr,int,int); +int SYS_access(string,octal); --- ltrace-0.5.orig/ltrace.c +++ ltrace-0.5/ltrace.c @@ -54,6 +54,9 @@ { exiting = 1; debug(1, "Received interrupt signal; exiting..."); + if (opt_o) { + fclose(output); + } signal(SIGINT, SIG_IGN); signal(SIGTERM, SIG_IGN); signal(SIGALRM, signal_alarm); @@ -74,6 +77,9 @@ if (opt_c) { show_summary(); } + if (opt_o) { + fclose(output); + } } static void guess_cols(void) --- ltrace-0.5.orig/sysdeps/linux-gnu/ppc/arch.h +++ ltrace-0.5/sysdeps/linux-gnu/ppc/arch.h @@ -4,9 +4,12 @@ #define LT_ELFCLASS ELFCLASS32 #define LT_ELF_MACHINE EM_PPC + #ifdef __powerpc64__ // Says 'ltrace' is 64 bits, says nothing about target. #define LT_ELFCLASS2 ELFCLASS64 #define LT_ELF_MACHINE2 EM_PPC64 +#define ARCH_SUPPORTS_OPD +#endif #define PLT_REINITALISATION_BP "_start" @@ -16,6 +19,3 @@ #if (PPC_NOP_LENGTH != BREAKPOINT_LENGTH) #error "Length of the breakpoint value not equal to the length of a nop instruction" #endif - - -#endif