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);