From 159ac52b061c60947a943c102298cd692223274f Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 18 Dec 2013 11:05:54 +0100 Subject: [PATCH] libdwfl: Introduce dwfl_module_getsym_info and dwfl_module_addrinfo. Some arches like ppc64 use function descriptor values instead of function addresses causing matching of names and addresses to fail when using dwfl_module_getsym or dwfl_module_addrsym. Add ebl hook to resolve any function descriptor values found in non-ET_REL modules. The new function dwfl_module_getsym_info doesn't adjust the symbol value in any way, but returns the adjusted and/or resolved address associated with the symbol separately. The new function dwfl_module_addrinfo resolves against both the address associated with the symbol (which could be the function entry address) value and the adjusted st_value. So that it is easy to resolve and match either function descriptors and/or function entry addresses. Since these new functions also return more information they replace the dwfl_module_getsym_elf and dwfl_module_addrsym_elf functions that never made it into a released elfutils version. addr2line and readelf now use the new functions when looking up functions names. addr2line will now also display the section the address was found in when given -x. Extra testcases were added for both addr2line and the dwflsyms testscase. Signed-off-by: Mark Wielaard --- ChangeLog | 6 + NEWS | 5 +- backends/ChangeLog | 7 + backends/Makefile.am | 2 +- backends/ppc64_init.c | 30 +++ backends/ppc64_resolve_sym.c | 63 ++++++ libdw/ChangeLog | 6 + libdw/libdw.map | 4 +- libdwfl/ChangeLog | 31 +++ libdwfl/derelocate.c | 13 +- libdwfl/dwfl_module_addrname.c | 6 +- libdwfl/dwfl_module_addrsym.c | 220 ++++++++++++------- libdwfl/dwfl_module_getsym.c | 63 +++++- libdwfl/libdwfl.h | 80 +++++-- libdwfl/libdwflP.h | 27 ++- libebl/ChangeLog | 9 + libebl/Makefile.am | 2 +- libebl/ebl-hooks.h | 5 + libebl/eblresolvesym.c | 43 ++++ libebl/libebl.h | 6 + libebl/libeblP.h | 5 + src/ChangeLog | 12 ++ src/addr2line.c | 54 ++++- src/readelf.c | 16 +- tests/ChangeLog | 22 ++ tests/Makefile.am | 7 +- tests/dwflsyms.c | 59 +++++- tests/run-addrname-test.sh | 35 +++ tests/run-dwflsyms.sh | 413 ++++++++++++++++++++++++++++++++++++ tests/testfile66.bz2 | Bin 0 -> 741 bytes tests/testfile66.core.bz2 | Bin 0 -> 56448 bytes tests/testfilebazdbgppc64.bz2 | Bin 0 -> 2366 bytes tests/testfilebazdbgppc64.debug.bz2 | Bin 0 -> 2295 bytes tests/testfilebazdbgppc64_pl.bz2 | Bin 0 -> 2775 bytes tests/testfilebazdbgppc64_plr.bz2 | Bin 0 -> 2399 bytes tests/testfilebazdynppc64.bz2 | Bin 0 -> 2327 bytes tests/testfilebazmdbppc64.bz2 | Bin 0 -> 3528 bytes tests/testfilebazminppc64.bz2 | Bin 0 -> 3464 bytes tests/testfilebazminppc64_pl.bz2 | Bin 0 -> 3900 bytes tests/testfilebazminppc64_plr.bz2 | Bin 0 -> 3535 bytes tests/testfilebaztabppc64.bz2 | Bin 0 -> 3697 bytes 41 files changed, 1106 insertions(+), 145 deletions(-) create mode 100644 backends/ppc64_resolve_sym.c create mode 100644 libebl/eblresolvesym.c create mode 100755 tests/testfile66.bz2 create mode 100644 tests/testfile66.core.bz2 create mode 100755 tests/testfilebazdbgppc64.bz2 create mode 100755 tests/testfilebazdbgppc64.debug.bz2 create mode 100755 tests/testfilebazdbgppc64_pl.bz2 create mode 100755 tests/testfilebazdbgppc64_plr.bz2 create mode 100755 tests/testfilebazdynppc64.bz2 create mode 100755 tests/testfilebazmdbppc64.bz2 create mode 100755 tests/testfilebazminppc64.bz2 create mode 100755 tests/testfilebazminppc64_pl.bz2 create mode 100755 tests/testfilebazminppc64_plr.bz2 create mode 100755 tests/testfilebaztabppc64.bz2 diff --git a/ChangeLog b/ChangeLog index 164d551..fe109e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-12-18 Mark Wielaard + + * NEWS (libdwfl): Add dwfl_module_getsym_info and + dwfl_module_addrinfo. + (addr2line): Add -x option. + 2013-12-17 Jan Kratochvil * NEWS (Version 0.158) (libdwfl): Added Dwfl_Thread_Callbacks, diff --git a/NEWS b/NEWS index 3dc3377..49510f7 100644 --- a/NEWS +++ b/NEWS @@ -1,13 +1,16 @@ Version 0.158 libdwfl: dwfl_core_file_report has new parameter executable. - New function dwfl_module_getsymtab_first_global. + New functions dwfl_module_getsymtab_first_global, + dwfl_module_getsym_info and dwfl_module_addrinfo. Added unwinder with type Dwfl_Thread_Callbacks, opaque types Dwfl_Thread and Dwfl_Frame and functions dwfl_attach_state, dwfl_pid, dwfl_thread_dwfl, dwfl_thread_tid, dwfl_frame_thread, dwfl_thread_state_registers, dwfl_thread_state_register_pc, dwfl_getthreads, dwfl_thread_getframes and dwfl_frame_pc. +addr2line: New option -x to show the section an address was found in. + Version 0.157 libdw: Add new functions dwarf_getlocations, dwarf_getlocation_attr diff --git a/backends/ChangeLog b/backends/ChangeLog index 4535789..d5f6b53 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,5 +1,12 @@ 2013-12-18 Mark Wielaard + * Makefile.am (ppc64_SRCS): Add ppc64_resolve_sym.c. + * ppc64_resolve_sym.c: New file. + * ppc64_init.c: Hook resolve_sym_value and find function descriptor + table. + +2013-12-18 Mark Wielaard + * s390_initreg.c (s390_set_initial_registers_tid): Use union to avoid type-punning when assigning a double to a Dwarf_Word. diff --git a/backends/Makefile.am b/backends/Makefile.am index ec9e0a3..8deed2f 100644 --- a/backends/Makefile.am +++ b/backends/Makefile.am @@ -101,7 +101,7 @@ am_libebl_ppc_pic_a_OBJECTS = $(ppc_SRCS:.c=.os) ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c \ ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \ - ppc_cfi.c ppc_initreg.c + ppc_cfi.c ppc_initreg.c ppc64_resolve_sym.c libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS) am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os) diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c index 05f8898..d8f1417 100644 --- a/backends/ppc64_init.c +++ b/backends/ppc64_init.c @@ -31,6 +31,8 @@ # include #endif +#include + #define BACKEND ppc64_ #define RELOC_PREFIX R_PPC64_ #include "libebl_CPU.h" @@ -69,6 +71,34 @@ ppc64_init (elf, machine, eh, ehlen) eh->frame_nregs = (114 - 1) + 32; HOOK (eh, set_initial_registers_tid); HOOK (eh, dwarf_to_regno); + HOOK (eh, resolve_sym_value); + + /* Find the function descriptor .opd table for resolve_sym_value. */ + if (elf != NULL) + { + GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem); + if (ehdr != NULL && ehdr->e_type != ET_REL) + { + /* We could also try through DT_PPC64_OPD and DT_PPC64_OPDSZ. */ + GElf_Shdr opd_shdr_mem, *opd_shdr; + Elf_Scn *scn = NULL; + while ((scn = elf_nextscn (elf, scn)) != NULL) + { + opd_shdr = gelf_getshdr (scn, &opd_shdr_mem); + if (opd_shdr != NULL + && (opd_shdr->sh_flags & SHF_ALLOC) != 0 + && opd_shdr->sh_type == SHT_PROGBITS + && opd_shdr->sh_size > 0 + && strcmp (elf_strptr (elf, ehdr->e_shstrndx, + opd_shdr->sh_name), ".opd") == 0) + { + eh->fd_addr = opd_shdr->sh_addr; + eh->fd_data = elf_getdata (scn, NULL); + break; + } + } + } + } return MODVERSION; } diff --git a/backends/ppc64_resolve_sym.c b/backends/ppc64_resolve_sym.c new file mode 100644 index 0000000..03f6558 --- /dev/null +++ b/backends/ppc64_resolve_sym.c @@ -0,0 +1,63 @@ +/* Resolve symbol values through .opd function descriptors. + Copyright (C) 2013 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#define BACKEND ppc64_ +#include "libebl_CPU.h" + +/* Resolve a function descriptor if addr points into the .opd section. + The .opd section contains function descriptors consisting of 3 addresses. + function, toc and chain. We are just interested in the first. + http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#FUNC-DES + + Returns true if the given address could be resolved, false otherwise. +*/ +bool +ppc64_resolve_sym_value (Ebl *ebl, GElf_Addr *addr) +{ + if (ebl->fd_data != NULL && *addr >= ebl->fd_addr + && *addr + sizeof (Elf64_Addr) <= ebl->fd_addr + ebl->fd_data->d_size) + { + GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (ebl->elf, &ehdr_mem); + if (ehdr != NULL) + { + Elf_Data opd_in, opd_out; + opd_in.d_buf = ebl->fd_data->d_buf + (*addr - ebl->fd_addr); + opd_out.d_buf = addr; + opd_out.d_size = opd_in.d_size = sizeof (Elf64_Addr); + opd_out.d_type = opd_in.d_type = ELF_T_ADDR; + if (elf64_xlatetom (&opd_out, &opd_in, + ehdr->e_ident[EI_DATA]) != NULL) + return true; + } + } + return false; +} diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 8b1e2c0..ef3ed57 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,9 @@ +2013-12-18 Mark Wielaard + + * libdw.map (ELFUTILS_0.158): Remove dwfl_module_addrsym_elf and + dwfl_module_getsym_elf. Add dwfl_module_addrinfo and + dwfl_module_getsym_info. + 2013-12-16 Mark Wielaard * libdw.map (ELFUTILS_0.158): Add dwfl_module_getsymtab_first_global. diff --git a/libdw/libdw.map b/libdw/libdw.map index 342cdfe..92392bc 100644 --- a/libdw/libdw.map +++ b/libdw/libdw.map @@ -284,7 +284,7 @@ ELFUTILS_0.158 { dwfl_thread_getframes; dwfl_frame_pc; - dwfl_module_addrsym_elf; - dwfl_module_getsym_elf; dwfl_module_getsymtab_first_global; + dwfl_module_addrinfo; + dwfl_module_getsym_info; } ELFUTILS_0.157; diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index b3c2b83..c3569aa 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,34 @@ +2013-12-18 Mark Wielaard + + * derelocate.c (__libdwfl_find_section_ndx): New internal function. + * dwfl_module_addrname.c (dwfl_module_addrname): Use + dwfl_module_addrinfo. + * dwfl_module_addrsym.c (dwfl_module_addrsym_elf): Replace with... + (__libdwfl_addrsym): ...this. Use __libdwfl_getsym, use value + for comparisons, not st_value. Fill in off. Search for both value + and the (adjusted) sym.st_value when different. + (dwfl_module_addrsym): Implement using __libdwfl_addrsym. + (dwfl_module_addrinfo): New function. + * dwfl_module_getsym.c (dwfl_module_getsym_elf): Replace with... + (__libdwfl_getsym): ...this. Use ebl_resolve_sym_value if requested + and possible. Adjust sym->st_value only when requested. Fill in addr + if available. + (dwfl_module_getsym_info): New function. + (dwfl_module_getsym): Use __libdwfl_getsym. + * libdwfl.h (dwfl_module_getsym_elf): Removed. + (dwfl_module_getsym_info): New function declaration. + (dwfl_module_addrinfo): Likewise. + (dwfl_module_addrsym): Add documentation describing differences + with addrinfo variants. + (dwfl_module_addrsym_elf): Removed. + * libdwflP.h (__libdwfl_getsym): New internal function declaration. + (__libdwfl_addrsym): Likewise. + (__libdwfl_find_section_ndx): Likewise. + (dwfl_module_addrinfo): New internal declaration. + (dwfl_module_getsym_info): Likewise. + (dwfl_module_addrsym_elf): Removed. + (dwfl_module_getsym_elf): Likewise. + 2013-12-18 Jan Kratochvil * argp-std.c (offline_find_elf): Remove. diff --git a/libdwfl/derelocate.c b/libdwfl/derelocate.c index 56f998c..da67908 100644 --- a/libdwfl/derelocate.c +++ b/libdwfl/derelocate.c @@ -1,5 +1,5 @@ /* Recover relocatibility for addresses computed from debug information. - Copyright (C) 2005-2010 Red Hat, Inc. + Copyright (C) 2005-2010, 2013 Red Hat, Inc. This file is part of elfutils. This file is free software; you can redistribute it and/or modify @@ -330,6 +330,17 @@ find_section (Dwfl_Module *mod, Dwarf_Addr *addr) return -1; } +size_t +internal_function +__libdwfl_find_section_ndx (Dwfl_Module *mod, Dwarf_Addr *addr) +{ + int idx = find_section (mod, addr); + if (unlikely (idx == -1)) + return SHN_UNDEF; + + return elf_ndxscn (mod->reloc_info->refs[idx].scn); +} + int dwfl_module_relocate_address (Dwfl_Module *mod, Dwarf_Addr *addr) { diff --git a/libdwfl/dwfl_module_addrname.c b/libdwfl/dwfl_module_addrname.c index 6ae0123..88a8139 100644 --- a/libdwfl/dwfl_module_addrname.c +++ b/libdwfl/dwfl_module_addrname.c @@ -1,5 +1,5 @@ /* Find debugging and symbol information for a module in libdwfl. - Copyright (C) 2005, 2006, 2007 Red Hat, Inc. + Copyright (C) 2005, 2006, 2007, 2013 Red Hat, Inc. This file is part of elfutils. This file is free software; you can redistribute it and/or modify @@ -31,6 +31,8 @@ const char * dwfl_module_addrname (Dwfl_Module *mod, GElf_Addr addr) { + GElf_Off off; GElf_Sym sym; - return INTUSE(dwfl_module_addrsym) (mod, addr, &sym, NULL); + return INTUSE(dwfl_module_addrinfo) (mod, addr, &off, &sym, + NULL, NULL, NULL); } diff --git a/libdwfl/dwfl_module_addrsym.c b/libdwfl/dwfl_module_addrsym.c index 9e4f067..d205832 100644 --- a/libdwfl/dwfl_module_addrsym.c +++ b/libdwfl/dwfl_module_addrsym.c @@ -1,5 +1,5 @@ /* Find debugging and symbol information for a module in libdwfl. - Copyright (C) 2005-2012 Red Hat, Inc. + Copyright (C) 2005-2013 Red Hat, Inc. This file is part of elfutils. This file is free software; you can redistribute it and/or modify @@ -32,9 +32,10 @@ Never returns symbols at addresses above ADDR. */ const char * -dwfl_module_addrsym_elf (Dwfl_Module *mod, GElf_Addr addr, - GElf_Sym *closest_sym, GElf_Word *shndxp, - Elf **elfp, Dwarf_Addr *biasp) +internal_function +__libdwfl_addrsym (Dwfl_Module *mod, GElf_Addr addr, GElf_Off *off, + GElf_Sym *closest_sym, GElf_Word *shndxp, + Elf **elfp, Dwarf_Addr *biasp, bool adjust_st_value) { int syments = INTUSE(dwfl_module_getsymtab) (mod); if (syments < 0) @@ -43,11 +44,26 @@ dwfl_module_addrsym_elf (Dwfl_Module *mod, GElf_Addr addr, /* Return true iff we consider ADDR to lie in the same section as SYM. */ GElf_Word addr_shndx = SHN_UNDEF; Elf *addr_symelf = NULL; - inline bool same_section (const GElf_Sym *sym, Elf *symelf, GElf_Word shndx) + inline bool same_section (GElf_Addr value, Elf *symelf, GElf_Word shndx) { /* For absolute symbols and the like, only match exactly. */ if (shndx >= SHN_LORESERVE) - return sym->st_value == addr; + return value == addr; + + /* If value might not be st_value, the shndx of the symbol might + not match the section of the value. Explicitly look both up. */ + if (! adjust_st_value) + { + Dwarf_Addr v; + if (addr_shndx == SHN_UNDEF) + { + v = addr; + addr_shndx = __libdwfl_find_section_ndx (mod, &v); + } + + v = value; + return addr_shndx == __libdwfl_find_section_ndx (mod, &v); + } /* Figure out what section ADDR lies in. */ if (addr_shndx == SHN_UNDEF || addr_symelf != symelf) @@ -76,104 +92,133 @@ dwfl_module_addrsym_elf (Dwfl_Module *mod, GElf_Addr addr, /* Keep track of the closest symbol we have seen so far. Here we store only symbols with nonzero st_size. */ const char *closest_name = NULL; + GElf_Addr closest_value = 0; GElf_Word closest_shndx = SHN_UNDEF; Elf *closest_elf = NULL; /* Keep track of an eligible symbol with st_size == 0 as a fallback. */ const char *sizeless_name = NULL; GElf_Sym sizeless_sym = { 0, 0, 0, 0, 0, SHN_UNDEF }; + GElf_Addr sizeless_value = 0; GElf_Word sizeless_shndx = SHN_UNDEF; Elf *sizeless_elf = NULL; /* Keep track of the lowest address a relevant sizeless symbol could have. */ GElf_Addr min_label = 0; + /* Try one symbol and associated value from the search table. */ + inline void try_sym_value (GElf_Addr value, GElf_Sym *sym, + const char *name, GElf_Word shndx, + Elf *elf, bool resolved) + { + /* Even if we don't choose this symbol, its existence excludes + any sizeless symbol (assembly label) that is below its upper + bound. */ + if (value + sym->st_size > min_label) + min_label = value + sym->st_size; + + if (sym->st_size == 0 || addr - value < sym->st_size) + { + /* Return GELF_ST_BIND as higher-is-better integer. */ + inline int binding_value (const GElf_Sym *symp) + { + switch (GELF_ST_BIND (symp->st_info)) + { + case STB_GLOBAL: + return 3; + case STB_WEAK: + return 2; + case STB_LOCAL: + return 1; + default: + return 0; + } + } + + /* This symbol is a better candidate than the current one + if it's closer to ADDR or is global when it was local. */ + if (closest_name == NULL + || closest_value < value + || binding_value (closest_sym) < binding_value (sym)) + { + if (sym->st_size != 0) + { + *closest_sym = *sym; + closest_value = value; + closest_shndx = shndx; + closest_elf = elf; + closest_name = name; + } + else if (closest_name == NULL + && value >= min_label + && same_section (value, + resolved ? mod->main.elf : elf, shndx)) + { + /* Handwritten assembly symbols sometimes have no + st_size. If no symbol with proper size includes + the address, we'll use the closest one that is in + the same section as ADDR. */ + sizeless_sym = *sym; + sizeless_value = value; + sizeless_shndx = shndx; + sizeless_elf = elf; + sizeless_name = name; + } + } + /* When the beginning of its range is no closer, + the end of its range might be. Otherwise follow + GELF_ST_BIND preference. If all are equal prefer + the first symbol found. */ + else if (sym->st_size != 0 + && closest_value == value + && ((closest_sym->st_size > sym->st_size + && (binding_value (closest_sym) + <= binding_value (sym))) + || (closest_sym->st_size >= sym->st_size + && (binding_value (closest_sym) + < binding_value (sym))))) + { + *closest_sym = *sym; + closest_value = value; + closest_shndx = shndx; + closest_elf = elf; + closest_name = name; + } + } + } + /* Look through the symbol table for a matching symbol. */ inline void search_table (int start, int end) { for (int i = start; i < end; ++i) { GElf_Sym sym; + GElf_Addr value; GElf_Word shndx; Elf *elf; - const char *name = INTUSE(dwfl_module_getsym_elf) (mod, i, &sym, - &shndx, &elf, - NULL); + bool resolved; + const char *name = __libdwfl_getsym (mod, i, &sym, &value, + &shndx, &elf, NULL, + &resolved, adjust_st_value); if (name != NULL && name[0] != '\0' && sym.st_shndx != SHN_UNDEF - && sym.st_value <= addr + && value <= addr && GELF_ST_TYPE (sym.st_info) != STT_SECTION && GELF_ST_TYPE (sym.st_info) != STT_FILE && GELF_ST_TYPE (sym.st_info) != STT_TLS) { - /* Even if we don't choose this symbol, its existence excludes - any sizeless symbol (assembly label) that is below its upper - bound. */ - if (sym.st_value + sym.st_size > min_label) - min_label = sym.st_value + sym.st_size; + try_sym_value (value, &sym, name, shndx, elf, resolved); - if (sym.st_size == 0 || addr - sym.st_value < sym.st_size) + /* If this is an addrinfo variant and the value could be + resolved then also try matching the (adjusted) st_value. */ + if (resolved && mod->e_type != ET_REL) { - /* Return GELF_ST_BIND as higher-is-better integer. */ - inline int binding_value (const GElf_Sym *symp) - { - switch (GELF_ST_BIND (symp->st_info)) - { - case STB_GLOBAL: - return 3; - case STB_WEAK: - return 2; - case STB_LOCAL: - return 1; - default: - return 0; - } - } - /* This symbol is a better candidate than the current one - if it's closer to ADDR or is global when it was local. */ - if (closest_name == NULL - || closest_sym->st_value < sym.st_value - || binding_value (closest_sym) < binding_value (&sym)) - { - if (sym.st_size != 0) - { - *closest_sym = sym; - closest_shndx = shndx; - closest_elf = elf; - closest_name = name; - } - else if (closest_name == NULL - && sym.st_value >= min_label - && same_section (&sym, elf, shndx)) - { - /* Handwritten assembly symbols sometimes have no - st_size. If no symbol with proper size includes - the address, we'll use the closest one that is in - the same section as ADDR. */ - sizeless_sym = sym; - sizeless_shndx = shndx; - sizeless_elf = elf; - sizeless_name = name; - } - } - /* When the beginning of its range is no closer, - the end of its range might be. Otherwise follow - GELF_ST_BIND preference. If all are equal prefer - the first symbol found. */ - else if (sym.st_size != 0 - && closest_sym->st_value == sym.st_value - && ((closest_sym->st_size > sym.st_size - && (binding_value (closest_sym) - <= binding_value (&sym))) - || (closest_sym->st_size >= sym.st_size - && (binding_value (closest_sym) - < binding_value (&sym))))) - { - *closest_sym = sym; - closest_shndx = shndx; - closest_elf = elf; - closest_name = name; - } + GElf_Addr adjusted_st_value; + adjusted_st_value = dwfl_adjusted_st_value (mod, elf, + sym.st_value); + if (value != adjusted_st_value && adjusted_st_value <= addr) + try_sym_value (adjusted_st_value, &sym, name, shndx, + elf, false); } } } @@ -196,20 +241,23 @@ dwfl_module_addrsym_elf (Dwfl_Module *mod, GElf_Addr addr, /* If we found nothing searching the global symbols, then try the locals. Unless we have a global sizeless symbol that matches exactly. */ if (closest_name == NULL && first_global > 1 - && (sizeless_name == NULL || sizeless_sym.st_value != addr)) + && (sizeless_name == NULL || sizeless_value != addr)) search_table (1, first_global); /* If we found no proper sized symbol to use, fall back to the best candidate sizeless symbol we found, if any. */ if (closest_name == NULL - && sizeless_name != NULL && sizeless_sym.st_value >= min_label) + && sizeless_name != NULL && sizeless_value >= min_label) { *closest_sym = sizeless_sym; + closest_value = sizeless_value; closest_shndx = sizeless_shndx; closest_elf = sizeless_elf; closest_name = sizeless_name; } + *off = addr - closest_value; + if (shndxp != NULL) *shndxp = closest_shndx; if (elfp != NULL) @@ -218,14 +266,24 @@ dwfl_module_addrsym_elf (Dwfl_Module *mod, GElf_Addr addr, *biasp = dwfl_adjusted_st_value (mod, closest_elf, 0); return closest_name; } -INTDEF (dwfl_module_addrsym_elf) const char * dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr, GElf_Sym *closest_sym, GElf_Word *shndxp) { - return INTUSE(dwfl_module_addrsym_elf) (mod, addr, closest_sym, shndxp, - NULL, NULL); + GElf_Off off; + return __libdwfl_addrsym (mod, addr, &off, closest_sym, shndxp, + NULL, NULL, true); } INTDEF (dwfl_module_addrsym) + +const char +*dwfl_module_addrinfo (Dwfl_Module *mod, GElf_Addr address, + GElf_Off *offset, GElf_Sym *sym, + GElf_Word *shndxp, Elf **elfp, Dwarf_Addr *bias) +{ + return __libdwfl_addrsym (mod, address, offset, sym, shndxp, elfp, bias, + false); +} +INTDEF (dwfl_module_addrinfo) diff --git a/libdwfl/dwfl_module_getsym.c b/libdwfl/dwfl_module_getsym.c index 319f975..917d062 100644 --- a/libdwfl/dwfl_module_getsym.c +++ b/libdwfl/dwfl_module_getsym.c @@ -29,9 +29,10 @@ #include "libdwflP.h" const char * -dwfl_module_getsym_elf (Dwfl_Module *mod, int ndx, - GElf_Sym *sym, GElf_Word *shndxp, - Elf **elfp, Dwarf_Addr *biasp) +internal_function +__libdwfl_getsym (Dwfl_Module *mod, int ndx, GElf_Sym *sym, GElf_Addr *addr, + GElf_Word *shndxp, Elf **elfp, Dwarf_Addr *biasp, + bool *resolved, bool adjust_st_value) { if (unlikely (mod == NULL)) return NULL; @@ -113,6 +114,33 @@ dwfl_module_getsym_elf (Dwfl_Module *mod, int ndx, alloc = unlikely (shdr == NULL) || (shdr->sh_flags & SHF_ALLOC); } + /* In case of an value in an allocated section the main Elf Ebl + might know where the real value is (e.g. for function + descriptors). */ + + char *ident; + GElf_Addr st_value = sym->st_value; + *resolved = false; + if (! adjust_st_value && mod->e_type != ET_REL && alloc + && (GELF_ST_TYPE (sym->st_info) == STT_FUNC + || (GELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC + && (ident = elf_getident (elf, NULL)) != NULL + && ident[EI_OSABI] == ELFOSABI_LINUX))) + { + if (likely (__libdwfl_module_getebl (mod) == DWFL_E_NOERROR)) + { + if (elf != mod->main.elf) + { + st_value = dwfl_adjusted_st_value (mod, elf, st_value); + st_value = dwfl_deadjust_st_value (mod, mod->main.elf, st_value); + } + + *resolved = ebl_resolve_sym_value (mod->ebl, &st_value); + if (! *resolved) + st_value = sym->st_value; + } + } + if (shndxp != NULL) /* Yield -1 in case of a non-SHF_ALLOC section. */ *shndxp = alloc ? shndx : (GElf_Word) -1; @@ -132,7 +160,7 @@ dwfl_module_getsym_elf (Dwfl_Module *mod, int ndx, size_t symshstrndx = SHN_UNDEF; Dwfl_Error result = __libdwfl_relocate_value (mod, elf, &symshstrndx, - shndx, &sym->st_value); + shndx, &st_value); if (unlikely (result != DWFL_E_NOERROR)) { __libdwfl_seterrno (result); @@ -141,10 +169,18 @@ dwfl_module_getsym_elf (Dwfl_Module *mod, int ndx, } else if (alloc) /* Apply the bias to the symbol value. */ - sym->st_value = dwfl_adjusted_st_value (mod, elf, sym->st_value); + st_value = dwfl_adjusted_st_value (mod, + *resolved ? mod->main.elf : elf, + st_value); break; } + if (adjust_st_value) + sym->st_value = st_value; + + if (addr != NULL) + *addr = st_value; + if (unlikely (sym->st_name >= symstrdata->d_size)) { __libdwfl_seterrno (DWFL_E_BADSTROFF); @@ -156,12 +192,25 @@ dwfl_module_getsym_elf (Dwfl_Module *mod, int ndx, *biasp = dwfl_adjusted_st_value (mod, elf, 0); return (const char *) symstrdata->d_buf + sym->st_name; } -INTDEF (dwfl_module_getsym_elf) + +const char * +dwfl_module_getsym_info (Dwfl_Module *mod, int ndx, + GElf_Sym *sym, GElf_Addr *addr, + GElf_Word *shndxp, + Elf **elfp, Dwarf_Addr *bias) +{ + bool resolved; + return __libdwfl_getsym (mod, ndx, sym, addr, shndxp, elfp, bias, + &resolved, false); +} +INTDEF (dwfl_module_getsym_info) const char * dwfl_module_getsym (Dwfl_Module *mod, int ndx, GElf_Sym *sym, GElf_Word *shndxp) { - return dwfl_module_getsym_elf (mod, ndx, sym, shndxp, NULL, NULL); + bool resolved; + return __libdwfl_getsym (mod, ndx, sym, NULL, shndxp, NULL, NULL, + &resolved, true); } INTDEF (dwfl_module_getsym) diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h index 60160b6..007089b 100644 --- a/libdwfl/libdwfl.h +++ b/libdwfl/libdwfl.h @@ -447,39 +447,79 @@ extern int dwfl_module_getsymtab_first_global (Dwfl_Module *mod); Note that since symbols can come from either the main, debug or auxiliary ELF symbol file (either dynsym or symtab) the section index can only be reliably used to compare against special section constants like - SHN_UNDEF or SHN_ABS. */ + SHN_UNDEF or SHN_ABS. It is recommended to use dwfl_module_getsym_info + which doesn't have these deficiencies. */ extern const char *dwfl_module_getsym (Dwfl_Module *mod, int ndx, GElf_Sym *sym, GElf_Word *shndxp) __nonnull_attribute__ (3); -/* Same as dwfl_module_getsym but also returns the ELF file, if not NULL, - that the symbol came from so the section index can be reliably used. - Fills in *BIAS, if not NULL, with the difference between addresses - within the loaded module and those in symbol tables of the ELF file. */ -extern const char *dwfl_module_getsym_elf (Dwfl_Module *mod, int ndx, - GElf_Sym *sym, GElf_Word *shndxp, - Elf **elfp, Dwarf_Addr *bias) - __nonnull_attribute__ (3); +/* Fetch one entry from the module's symbol table and the associated + address value. On errors, returns NULL. If successful, fills in + *SYM, *ADDR and returns the string for st_name. This works like + gelf_getsym. *ADDR is set to the st_value adjusted to an absolute + value based on the module's location, when the symbol is in an + SHF_ALLOC section. For non-ET_REL files, if the arch uses function + descriptors, and the st_value points to one, *ADDR will be resolved + to the actual function entry address. The SYM->ST_VALUE itself + isn't adjusted in any way. Fills in ELFP, if not NULL, with the + ELF file the symbol originally came from. Note that symbols can + come from either the main, debug or auxiliary ELF symbol file + (either dynsym or symtab). If SHNDXP is non-null, it's set with + the section index (whether from st_shndx or extended index table); + in case of a symbol in a non-allocated section, *SHNDXP is instead + set to -1. Fills in BIAS, if not NULL, with the difference between + addresses within the loaded module and those in symbol table of the + ELF file. Note that the address associated with the symbol might + be in a different section than the returned symbol. The section in + the main elf file in which returned ADDR falls can be found with + dwfl_module_address_section. */ +extern const char *dwfl_module_getsym_info (Dwfl_Module *mod, int ndx, + GElf_Sym *sym, GElf_Addr *addr, + GElf_Word *shndxp, + Elf **elfp, Dwarf_Addr *bias) + __nonnull_attribute__ (3, 4); /* Find the symbol that ADDRESS lies inside, and return its name. */ extern const char *dwfl_module_addrname (Dwfl_Module *mod, GElf_Addr address); +/* Find the symbol associated with ADDRESS. Return its name or NULL + when nothing was found. If the architecture uses function + descriptors, and symbol st_value points to one, ADDRESS wil be + matched against either the adjusted st_value or the associated + function entry value as described in dwfl_module_getsym_info. If + OFFSET is not NULL it will be filled in with the difference from + the start of the symbol (or function entry). If SYM is not NULL it + is filled in with the symbol associated with the matched ADDRESS. + The SYM->ST_VALUE itself isn't adjusted in any way. Fills in ELFP, + if not NULL, with the ELF file the symbol originally came from. + Note that symbols can come from either the main, debug or auxiliary + ELF symbol file (either dynsym or symtab). If SHNDXP is non-null, + it's set with the section index (whether from st_shndx or extended + index table). Fills in BIAS, if not NULL, with the difference + between addresses within the loaded module and those in symbol + table of the ELF file. Note that the address matched against the + symbol might be in a different section than the returned symbol. + The section in the main elf file in ADDRESS falls can be found with + dwfl_module_address_section. */ +extern const char *dwfl_module_addrinfo (Dwfl_Module *mod, GElf_Addr address, + GElf_Off *offset, GElf_Sym *sym, + GElf_Word *shndxp, Elf **elfp, + Dwarf_Addr *bias) + __nonnull_attribute__ (3); + /* Find the symbol that ADDRESS lies inside, and return detailed - information as for dwfl_module_getsym (above). */ + information as for dwfl_module_getsym (above). Note that like + dwfl_module_getsym this function also adjusts SYM->ST_VALUE to an + absolute value based on the module's location. ADDRESS is only + matched against this adjusted SYM->ST_VALUE. This means that + depending on architecture this might only match symbols that + represent function descriptor addresses (and not function entry + addresses). For these reasons it is recommended to use + dwfl_module_addrinfo instead. */ extern const char *dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr address, GElf_Sym *sym, GElf_Word *shndxp) __nonnull_attribute__ (3); -/* Same as dwfl_module_addrsym but also returns the ELF file, if not NULL, - that the symbol came from so the section index can be reliably used. - Fills in *BIAS, if not NULL, with the difference between addresses - within the loaded module and those in symbol tables of the ELF file. */ -extern const char *dwfl_module_addrsym_elf (Dwfl_Module *mod, - GElf_Addr address, GElf_Sym *sym, - GElf_Word *shndxp, Elf **elfp, - Dwarf_Addr *bias) - __nonnull_attribute__ (3); - /* Find the ELF section that *ADDRESS lies inside and return it. On success, adjusts *ADDRESS to be relative to the section, and sets *BIAS to the difference between addresses used in diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h index e2e249d..267b021 100644 --- a/libdwfl/libdwflP.h +++ b/libdwfl/libdwflP.h @@ -388,6 +388,23 @@ struct dwfl_arange }; +/* Internal wrapper for old dwfl_module_getsym and new dwfl_module_getsym_info. + adjust_st_value set to true returns adjusted SYM st_value, set to false + it will not adjust SYM at all, but does match against resolved *ADDR. */ +extern const char *__libdwfl_getsym (Dwfl_Module *mod, int ndx, GElf_Sym *sym, + GElf_Addr *addr, GElf_Word *shndxp, + Elf **elfp, Dwarf_Addr *biasp, + bool *resolved, bool adjust_st_value) + internal_function; + +/* Internal wrapper for old dwfl_module_addrsym and new dwfl_module_addrinfo. + adjust_st_value set to true returns adjusted SYM st_value, set to false + it will not adjust SYM at all, but does match against resolved values. */ +extern const char *__libdwfl_addrsym (Dwfl_Module *mod, GElf_Addr addr, + GElf_Off *off, GElf_Sym *sym, + GElf_Word *shndxp, Elf **elfp, + Dwarf_Addr *bias, + bool adjust_st_value) internal_function; extern void __libdwfl_module_free (Dwfl_Module *mod) internal_function; @@ -404,6 +421,12 @@ extern void __libdwfl_getelf (Dwfl_Module *mod) internal_function; extern Dwfl_Error __libdwfl_relocate (Dwfl_Module *mod, Elf *file, bool debug) internal_function; +/* Find the section index in mod->main.elf that contains the given + *ADDR. Adjusts *ADDR to be section relative on success, returns + SHN_UNDEF on failure. */ +extern size_t __libdwfl_find_section_ndx (Dwfl_Module *mod, Dwarf_Addr *addr) + internal_function; + /* Process (simple) relocations in arbitrary section TSCN of an ET_REL file. RELOCSCN is SHT_REL or SHT_RELA and TSCN is its sh_info target section. */ extern Dwfl_Error __libdwfl_relocate_section (Dwfl_Module *mod, Elf *relocated, @@ -638,13 +661,13 @@ INTDECL (dwfl_core_file_report) INTDECL (dwfl_getmodules) INTDECL (dwfl_module_addrdie) INTDECL (dwfl_module_address_section) +INTDECL (dwfl_module_addrinfo) INTDECL (dwfl_module_addrsym) -INTDECL (dwfl_module_addrsym_elf) INTDECL (dwfl_module_build_id) INTDECL (dwfl_module_getdwarf) INTDECL (dwfl_module_getelf) INTDECL (dwfl_module_getsym) -INTDECL (dwfl_module_getsym_elf) +INTDECL (dwfl_module_getsym_info) INTDECL (dwfl_module_getsymtab) INTDECL (dwfl_module_getsymtab_first_global) INTDECL (dwfl_module_getsrc) diff --git a/libebl/ChangeLog b/libebl/ChangeLog index f1aa242..fc6bdd5 100644 --- a/libebl/ChangeLog +++ b/libebl/ChangeLog @@ -1,3 +1,12 @@ +2013-12-18 Mark Wielaard + + * Makefile.am (gen_SOURCES): Add eblresolvesym.c. + * ebl-hooks.h (resolve_sym_value): New entry. + * eblresolvesym.c: New file. + * libebl.h (ebl_resolve_sym_value): New definition. + * libeblP.h (fd_addr): New field. + (fd_data): Likewise. + 2013-12-18 Jan Kratochvil unwinder: s390 and s390x diff --git a/libebl/Makefile.am b/libebl/Makefile.am index fc4f1b6..916af72 100644 --- a/libebl/Makefile.am +++ b/libebl/Makefile.am @@ -55,7 +55,7 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.c \ eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \ ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \ eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \ - eblunwind.c + eblunwind.c eblresolvesym.c libebl_a_SOURCES = $(gen_SOURCES) diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h index 2243895..bfb7f4a 100644 --- a/libebl/ebl-hooks.h +++ b/libebl/ebl-hooks.h @@ -183,5 +183,10 @@ bool EBLHOOK(unwind) (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc, ebl_pid_memory_read_t *readfunc, void *arg, bool *signal_framep); +/* Returns true if the value can be resolved to an address in an + allocated section, which will be returned in *SHNDXP. + (e.g. function descriptor resolving) */ +bool EBLHOOK(resolve_sym_value) (Ebl *ebl, GElf_Addr *addr); + /* Destructor for ELF backend handle. */ void EBLHOOK(destr) (struct ebl *); diff --git a/libebl/eblresolvesym.c b/libebl/eblresolvesym.c new file mode 100644 index 0000000..470f6f0 --- /dev/null +++ b/libebl/eblresolvesym.c @@ -0,0 +1,43 @@ +/* Resolve a symbol value to an allocated section of the Elf file. + Copyright (C) 2013 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +bool +ebl_resolve_sym_value (Ebl *ebl, GElf_Addr *addr) +{ + if (ebl == NULL || ebl->resolve_sym_value == NULL) + return false; + + return ebl->resolve_sym_value (ebl, addr); +} diff --git a/libebl/libebl.h b/libebl/libebl.h index 84c2f4c..50d6baa 100644 --- a/libebl/libebl.h +++ b/libebl/libebl.h @@ -439,6 +439,12 @@ extern bool ebl_unwind (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc, bool *signal_framep) __nonnull_attribute__ (1, 3, 4, 5, 7); +/* Returns true if the value can be resolved to an address in an + allocated section, which will be returned in *ADDR + (e.g. function descriptor resolving) */ +extern bool ebl_resolve_sym_value (Ebl *ebl, GElf_Addr *addr) + __nonnull_attribute__ (2); + #ifdef __cplusplus } #endif diff --git a/libebl/libeblP.h b/libebl/libeblP.h index 4f4137d..f91c2a0 100644 --- a/libebl/libeblP.h +++ b/libebl/libeblP.h @@ -64,6 +64,11 @@ struct ebl Ebl architecture can unwind iff FRAME_NREGS > 0. */ size_t frame_nregs; + /* Function descriptor load address and table as used by + ebl_resolve_sym_value if available for this arch. */ + GElf_Addr fd_addr; + Elf_Data *fd_data; + /* Internal data. */ void *dlhandle; }; diff --git a/src/ChangeLog b/src/ChangeLog index 77e4240..5722a50 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +2013-12-18 Mark Wielaard + + * addr2line.c (options): Add symbol-sections, 'x'. + (show_symbol_sections): New static bool. + (parse_opt): Handle 'x'. + (print_addrsym): Use dwfl_module_addrinfo value.r + Also show section of address with show_symbol_sections. + (find_symbol): Use dwfl_module_getsym_info and set value. + (handle_address): Request value and use it instead of sym.st_value. + * readelf.c (format_dwarf_addr): Use dwfl_module_addrinfo to get + name and offset. + 2013-12-17 Masatake YAMATO Mark Wielaard diff --git a/src/addr2line.c b/src/addr2line.c index 82e80b1..0541fb6 100644 --- a/src/addr2line.c +++ b/src/addr2line.c @@ -61,6 +61,7 @@ static const struct argp_option options[] = N_("Show absolute file names using compilation directory"), 0 }, { "functions", 'f', NULL, 0, N_("Also show function names"), 0 }, { "symbols", 'S', NULL, 0, N_("Also show symbol or section names"), 0 }, + { "symbols-sections", 'x', NULL, 0, N_("Also show symbol and the section names"), 0 }, { "flags", 'F', NULL, 0, N_("Also show line table flags"), 0 }, { "section", 'j', "NAME", 0, N_("Treat addresses as offsets relative to NAME section."), 0 }, @@ -114,6 +115,9 @@ static bool show_functions; /* True if ELF symbol or section info should be shown. */ static bool show_symbols; +/* True if section associated with a symbol address should be shown. */ +static bool show_symbol_sections; + /* If non-null, take address parameters as relative to named section. */ static const char *just_section; @@ -234,6 +238,11 @@ parse_opt (int key, char *arg, struct argp_state *state) show_symbols = true; break; + case 'x': + show_symbols = true; + show_symbol_sections = true; + break; + case 'j': just_section = arg; break; @@ -342,8 +351,9 @@ static void print_addrsym (Dwfl_Module *mod, GElf_Addr addr) { GElf_Sym s; - GElf_Word shndx; - const char *name = dwfl_module_addrsym (mod, addr, &s, &shndx); + GElf_Off off; + const char *name = dwfl_module_addrinfo (mod, addr, &off, &s, + NULL, NULL, NULL); if (name == NULL) { /* No symbol name. Get a section name instead. */ @@ -355,10 +365,34 @@ print_addrsym (Dwfl_Module *mod, GElf_Addr addr) else printf ("(%s)+%#" PRIx64 "\n", name, addr); } - else if (addr == s.st_value) - puts (name); else - printf ("%s+%#" PRIx64 "\n", name, addr - s.st_value); + { + if (off == 0) + printf ("%s", name); + else + printf ("%s+%#" PRIx64 "", name, off); + + // Also show section name for address. + if (show_symbol_sections) + { + Dwarf_Addr ebias; + Elf_Scn *scn = dwfl_module_address_section (mod, &addr, &ebias); + if (scn != NULL) + { + GElf_Shdr shdr_mem; + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); + if (shdr != NULL) + { + Elf *elf = dwfl_module_getelf (mod, &ebias); + GElf_Ehdr ehdr; + if (gelf_getehdr (elf, &ehdr) != NULL) + printf (" (%s)", elf_strptr (elf, ehdr.e_shstrndx, + shdr->sh_name)); + } + } + } + puts (""); + } } static void @@ -401,11 +435,14 @@ find_symbol (Dwfl_Module *mod, { const char *looking_for = ((void **) arg)[0]; GElf_Sym *symbol = ((void **) arg)[1]; + GElf_Addr *value = ((void **) arg)[2]; int n = dwfl_module_getsymtab (mod); for (int i = 1; i < n; ++i) { - const char *symbol_name = dwfl_module_getsym (mod, i, symbol, NULL); + const char *symbol_name = dwfl_module_getsym_info (mod, i, symbol, + value, NULL, NULL, + NULL); if (symbol_name == NULL || symbol_name[0] == '\0') continue; switch (GELF_ST_TYPE (symbol->st_info)) @@ -519,7 +556,8 @@ handle_address (const char *string, Dwfl *dwfl) /* It was symbol[+offset]. */ GElf_Sym sym; - void *arg[2] = { name, &sym }; + GElf_Addr value = 0; + void *arg[3] = { name, &sym, &value }; (void) dwfl_getmodules (dwfl, &find_symbol, arg, 0); if (arg[0] != NULL) error (0, 0, gettext ("cannot find symbol '%s'"), name); @@ -530,7 +568,7 @@ handle_address (const char *string, Dwfl *dwfl) gettext ("offset %#" PRIxMAX " lies outside" " contents of '%s'"), addr, name); - addr += sym.st_value; + addr += value; parsed = true; } break; diff --git a/src/readelf.c b/src/readelf.c index 7ed9f4a..739156c 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -3290,10 +3290,10 @@ format_dwarf_addr (Dwfl_Module *dwflmod, { /* See if there is a name we can give for this address. */ GElf_Sym sym; + GElf_Off off = 0; const char *name = (print_address_names && ! print_unresolved_addresses) - ? dwfl_module_addrsym (dwflmod, address, &sym, NULL) : NULL; - if (name != NULL) - sym.st_value = address - sym.st_value; + ? dwfl_module_addrinfo (dwflmod, address, &off, &sym, NULL, NULL, NULL) + : NULL; const char *scn; if (print_unresolved_addresses) @@ -3314,24 +3314,24 @@ format_dwarf_addr (Dwfl_Module *dwflmod, char *result; if ((name != NULL - ? (sym.st_value != 0 + ? (off != 0 ? (scn != NULL ? (address_size == 0 ? asprintf (&result, gettext ("%s+%#" PRIx64 " <%s+%#" PRIx64 ">"), - scn, address, name, sym.st_value) + scn, address, name, off) : asprintf (&result, gettext ("%s+%#0*" PRIx64 " <%s+%#" PRIx64 ">"), scn, 2 + address_size * 2, address, - name, sym.st_value)) + name, off)) : (address_size == 0 ? asprintf (&result, gettext ("%#" PRIx64 " <%s+%#" PRIx64 ">"), - address, name, sym.st_value) + address, name, off) : asprintf (&result, gettext ("%#0*" PRIx64 " <%s+%#" PRIx64 ">"), 2 + address_size * 2, address, - name, sym.st_value))) + name, off))) : (scn != NULL ? (address_size == 0 ? asprintf (&result, diff --git a/tests/ChangeLog b/tests/ChangeLog index 8561e64..0d91c3b 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,4 +1,26 @@ 2013-12-18 Jan Kratochvil + Mark Wielaard + + * Makefile.am (EXTRA_DIST): Add testfile66.bz2, testfile66.core.bz2 + and testfilebaz*ppc64*.bz2 files. + * dwflsyms.c (list_syms): Remove unused from parameter mod_name. Print + error on dwfl_module_getsymtab error. + (list_syms): Use dwfl_module_getsym and dwfl_module_getsym_info. + Compare values for non-ET_REL. Use dwfl_module_addrinfo. + Also print section of actual value if different from sym. + * run-addrname-test.sh (testfile66, testfile66.core): New tests. + Test addr2line -x by showing different sections for address and + found name in testfile66. + * run-dwflsyms.sh (testfile66, testfile66.core, hello_ppc64.ko, + testfilebaz*ppc64): New tests. + * testfile66.bz2, testfile66.core.bz2, testfilebazdbgppc64.bz2, + testfilebazdbgppc64.debug.bz2, testfilebazdbgppc64_pl.bz2, + testfilebazdbgppc64_plr.bz2, testfilebazdynppc64.bz2, + testfilebazmdbppc64.bz2, testfilebazminppc64.bz2, + testfilebazminppc64_pl.bz2, testfilebazminppc64_plr.bz2, + testfilebaztabppc64.bz2: New test files. + +2013-12-18 Jan Kratochvil unwinder: s390 and s390x * Makefile.am (TESTS): Add run-backtrace-core-s390x.sh and diff --git a/tests/Makefile.am b/tests/Makefile.am index b58e0f5..52eb50a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -213,6 +213,11 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ testfilebaztab.bz2 testfilebasmin.bz2 \ testfilebazdbg_pl.bz2 testfilebazmin_pl.bz2 \ testfilebazdbg_plr.bz2 testfilebazmin_plr.bz2 \ + testfilebazdbgppc64.bz2 testfilebazdbgppc64.debug.bz2 \ + testfilebazdbgppc64_pl.bz2 testfilebazdbgppc64_plr.bz2 \ + testfilebazdynppc64.bz2 testfilebazmdbppc64.bz2 \ + testfilebazminppc64.bz2 testfilebazminppc64_pl.bz2 \ + testfilebazminppc64_plr.bz2 testfilebaztabppc64.bz2 \ run-dwflsyms.sh \ run-unstrip-n.sh testcore-rtlib.bz2 testcore-rtlib-ppc.bz2 \ run-low_high_pc.sh testfile_low_high_pc.bz2 \ @@ -248,7 +253,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ backtrace-subr.sh backtrace.i386.core.bz2 backtrace.i386.exec.bz2 \ backtrace.x86_64.core.bz2 backtrace.x86_64.exec.bz2 \ backtrace.ppc.core.bz2 backtrace.ppc.exec.bz2 \ - run-backtrace-core-ppc.sh \ + run-backtrace-core-ppc.sh testfile66.bz2 testfile66.core.bz2 \ backtrace.s390x.core.bz2 backtrace.s390x.exec.bz2 \ backtrace.s390.core.bz2 backtrace.s390.exec.bz2 \ run-backtrace-core-s390x.sh run-backtrace-core-s390.sh diff --git a/tests/dwflsyms.c b/tests/dwflsyms.c index 10c01f1..49ac334 100644 --- a/tests/dwflsyms.c +++ b/tests/dwflsyms.c @@ -106,13 +106,16 @@ addr_in_section (Elf *elf, GElf_Word shndx, GElf_Addr addr) static int list_syms (struct Dwfl_Module *mod, - void **user __attribute__ ((unused)), - const char *mod_name __attribute__ ((unused)), + void **user __attribute__ ((unused)), const char *mod_name, Dwarf_Addr low_addr __attribute__ ((unused)), void *arg __attribute__ ((unused))) { int syms = dwfl_module_getsymtab (mod); - assert (syms >= 0); + if (syms < 0) + { + printf ("%s: %s\n", mod_name, dwfl_errmsg (-1)); + return DWARF_CB_OK; + } for (int ndx = 0; ndx < syms; ndx++) { @@ -120,12 +123,28 @@ list_syms (struct Dwfl_Module *mod, GElf_Word shndxp; Elf *elf; Dwarf_Addr bias; - const char *name = dwfl_module_getsym_elf (mod, ndx, &sym, &shndxp, - &elf, &bias); + const char *name = dwfl_module_getsym (mod, ndx, &sym, &shndxp); + printf("%4d: %s\t%s\t%s (%" PRIu64 ") %#" PRIx64, ndx, gelf_type (&sym), gelf_bind (&sym), name, sym.st_size, sym.st_value); + /* The info variant doesn't adjust st_value but returns the (possible) + adjusted value separately. */ + GElf_Addr value; + GElf_Sym isym; + name = dwfl_module_getsym_info (mod, ndx, &isym, &value, &shndxp, + &elf, &bias); + + GElf_Ehdr ehdr; + gelf_getehdr (elf, &ehdr); + + // getsym st_values might or might not be adjusted depending on section. + // For ET_REL the adjustment is section relative. + assert (sym.st_value == isym.st_value + || sym.st_value == isym.st_value + bias + || ehdr.e_type == ET_REL); + /* And the reverse, which works for function symbols at least. Note this only works because the st.value is adjusted by dwfl_module_getsym (). */ @@ -134,24 +153,27 @@ list_syms (struct Dwfl_Module *mod, /* Make sure the adjusted value really falls in the elf section. */ assert (addr_in_section (elf, shndxp, sym.st_value - bias)); - GElf_Addr addr = sym.st_value; + GElf_Addr addr = value; GElf_Sym asym; GElf_Word ashndxp; Elf *aelf; Dwarf_Addr abias; - const char *aname = dwfl_module_addrsym_elf (mod, addr, &asym, - &ashndxp, &aelf, &abias); + GElf_Off off; + const char *aname = dwfl_module_addrinfo (mod, addr, &off, &asym, + &ashndxp, &aelf, &abias); /* Make sure the adjusted value really falls in the elf section. */ - assert (addr_in_section (aelf, ashndxp, asym.st_value - abias)); + assert (addr_in_section (aelf, ashndxp, asym.st_value) + || ehdr.e_type == ET_REL); /* Either they are the same symbol (name), the binding of asym is "stronger" (or equal) to sym or asym is more specific (has a lower address) than sym. */ assert ((strcmp (name, aname) == 0 || gelf_bind_order (&asym) >= gelf_bind_order (&sym)) - && asym.st_value <= sym.st_value); + && value <= sym.st_value); + addr = sym.st_value; int res = dwfl_module_relocate_address (mod, &addr); assert (res != -1); if (shndxp < SHN_LORESERVE) @@ -159,6 +181,23 @@ list_syms (struct Dwfl_Module *mod, elf_section_name (elf, shndxp)); else printf(", rel: %#" PRIx64 "", addr); + + /* Print the section of the actual value if different from sym. */ + if (value != isym.st_value + bias && ehdr.e_type != ET_REL) + { + GElf_Addr ebias; + addr = value; + Elf_Scn *scn = dwfl_module_address_section (mod, &addr, &ebias); + GElf_Shdr shdr_mem; + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); + Elf *melf = dwfl_module_getelf (mod, &ebias); + gelf_getehdr (melf, &ehdr); + const char *sname = elf_strptr (melf, ehdr.e_shstrndx, + shdr->sh_name); + printf (" [%#" PRIx64 ", rel: %#" PRIx64 " (%s)]", + value, addr, sname); + } + } printf ("\n"); } diff --git a/tests/run-addrname-test.sh b/tests/run-addrname-test.sh index 8624074..f954ee4 100755 --- a/tests/run-addrname-test.sh +++ b/tests/run-addrname-test.sh @@ -298,6 +298,41 @@ __vdso_time ??:0 EOF +# .section ".text" +# .globl _start +# .section ".opd","aw" +#_start: .quad .L._start,.TOC.@tocbase +# .previous +# .type _start, @function +#.L._start: +# .byte 0x7d, 0x82, 0x10, 0x08 +# .size _start,.-.L._start +testfiles testfile66 testfile66.core +testrun_compare ${abs_top_builddir}/src/addr2line -x -e testfile66 _start 0x2d8 0x2db 0x2dc 0x103d0 0x103d3 0x103d4< testfile.symtab.in <<\EOF + 0: NOTYPE LOCAL (0) 0 + 1: SECTION LOCAL (0) 0x238 + 2: SECTION LOCAL (0) 0x24c + 3: SECTION LOCAL (0) 0x26c + 4: SECTION LOCAL (0) 0x290 + 5: SECTION LOCAL (0) 0x2c0 + 6: SECTION LOCAL (0) 0x3e0 + 7: SECTION LOCAL (0) 0x488 + 8: SECTION LOCAL (0) 0x4a0 + 9: SECTION LOCAL (0) 0x4c0 + 10: SECTION LOCAL (0) 0x820 + 11: SECTION LOCAL (0) 0x850 + 12: SECTION LOCAL (0) 0x8a0 + 13: SECTION LOCAL (0) 0xd30 + 14: SECTION LOCAL (0) 0xd4c + 15: SECTION LOCAL (0) 0xd50 + 16: SECTION LOCAL (0) 0xd70 + 17: SECTION LOCAL (0) 0x1fde0 + 18: SECTION LOCAL (0) 0x1fde8 + 19: SECTION LOCAL (0) 0x1fdf0 + 20: SECTION LOCAL (0) 0x1fdf8 + 21: SECTION LOCAL (0) 0x1fe20 + 22: SECTION LOCAL (0) 0x20000 + 23: SECTION LOCAL (0) 0x20010 + 24: SECTION LOCAL (0) 0x200d8 + 25: SECTION LOCAL (0) 0x20110 + 26: SECTION LOCAL (0) 0x20158 + 27: SECTION LOCAL (0) 0 + 28: SECTION LOCAL (0) 0 + 29: SECTION LOCAL (0) 0 + 30: SECTION LOCAL (0) 0 + 31: SECTION LOCAL (0) 0 + 32: SECTION LOCAL (0) 0 + 33: SECTION LOCAL (0) 0 + 34: FILE LOCAL crtstuff.c (0) 0 + 35: OBJECT LOCAL __JCR_LIST__ (0) 0x1fdf0 + 36: FUNC LOCAL deregister_tm_clones (0) 0x20040, rel: 0x20040 (.opd) [0x910, rel: 0x70 (.text)] + 37: FUNC LOCAL register_tm_clones (0) 0x20050, rel: 0x20050 (.opd) [0x980, rel: 0xe0 (.text)] + 38: FUNC LOCAL __do_global_dtors_aux (0) 0x20060, rel: 0x20060 (.opd) [0x9f0, rel: 0x150 (.text)] + 39: OBJECT LOCAL completed.7711 (1) 0x20158 + 40: OBJECT LOCAL __do_global_dtors_aux_fini_array_entry (0) 0x1fde8 + 41: FUNC LOCAL frame_dummy (0) 0x20070, rel: 0x20070 (.opd) [0xa50, rel: 0x1b0 (.text)] + 42: OBJECT LOCAL __frame_dummy_init_array_entry (0) 0x1fde0 + 43: FILE LOCAL foo.c (0) 0 + 44: FILE LOCAL bar.c (0) 0 + 45: OBJECT LOCAL b1 (4) 0x20004 + 46: FUNC LOCAL foo (76) 0x20090, rel: 0x20090 (.opd) [0xb34, rel: 0x294 (.text)] + 47: FILE LOCAL crtstuff.c (0) 0 + 48: OBJECT LOCAL __FRAME_END__ (0) 0xe18 + 49: OBJECT LOCAL __JCR_END__ (0) 0x1fdf0 + 50: FILE LOCAL (0) 0 + 51: NOTYPE LOCAL __glink_PLTresolve (0) 0xce8 + 52: NOTYPE LOCAL 00000011.plt_call.__libc_start_main@@GLIBC_2.3 (0) 0x8a0 + 53: NOTYPE LOCAL 00000011.plt_call.__cxa_finalize@@GLIBC_2.3 (0) 0x8b4 + 54: NOTYPE LOCAL __init_array_end (0) 0x1fde8 + 55: OBJECT LOCAL _DYNAMIC (0) 0x1fe20 + 56: NOTYPE LOCAL __init_array_start (0) 0x1fde0 + 57: FUNC GLOBAL __libc_csu_fini (16) 0x200c0, rel: 0x200c0 (.opd) [0xcd0, rel: 0x430 (.text)] + 58: FUNC GLOBAL __libc_start_main@@GLIBC_2.3 (0) 0 + 59: NOTYPE WEAK _ITM_deregisterTMCloneTable (0) 0 + 60: NOTYPE WEAK data_start (0) 0x20000 + 61: NOTYPE GLOBAL _edata (0) 0x20110 + 62: FUNC GLOBAL bar (116) 0x200a0, rel: 0x200a0 (.opd) [0xb80, rel: 0x2e0 (.text)] + 63: FUNC GLOBAL _fini (0) 0x20030, rel: 0x20030 (.opd) [0xd30, rel: 0 (.fini)] + 64: NOTYPE GLOBAL __data_start (0) 0x20000 + 65: NOTYPE WEAK __gmon_start__ (0) 0 + 66: OBJECT GLOBAL __dso_handle (0) 0x1fe18 + 67: OBJECT GLOBAL _IO_stdin_used (4) 0xd4c + 68: OBJECT GLOBAL b2 (4) 0x20008 + 69: FUNC WEAK __cxa_finalize@@GLIBC_2.3 (0) 0 + 70: FUNC GLOBAL __libc_csu_init (204) 0x200b0, rel: 0x200b0 (.opd) [0xc00, rel: 0x360 (.text)] + 71: NOTYPE GLOBAL _end (0) 0x20160 + 72: FUNC GLOBAL _start (60) 0x20010, rel: 0x20010 (.opd) [0x8c8, rel: 0x28 (.text)] + 73: NOTYPE GLOBAL __bss_start (0) 0x20110 + 74: FUNC GLOBAL main (128) 0x20080, rel: 0x20080 (.opd) [0xab4, rel: 0x214 (.text)] + 75: NOTYPE WEAK _Jv_RegisterClasses (0) 0 + 76: OBJECT GLOBAL __TMC_END__ (0) 0x20010 + 77: NOTYPE WEAK _ITM_registerTMCloneTable (0) 0 + 78: FUNC GLOBAL _init (0) 0x20020, rel: 0x20020 (.opd) [0x850, rel: 0 (.init)] +EOF + +cat > testfile.symtab_pl.in <<\EOF + 0: NOTYPE LOCAL (0) 0 + 1: SECTION LOCAL (0) 0x8001000238 + 2: SECTION LOCAL (0) 0x800100024c + 3: SECTION LOCAL (0) 0x800100026c + 4: SECTION LOCAL (0) 0x8001000290 + 5: SECTION LOCAL (0) 0x80010002c0 + 6: SECTION LOCAL (0) 0x80010003e0 + 7: SECTION LOCAL (0) 0x8001000488 + 8: SECTION LOCAL (0) 0x80010004a0 + 9: SECTION LOCAL (0) 0x80010004c0 + 10: SECTION LOCAL (0) 0x8001000820 + 11: SECTION LOCAL (0) 0x8001000850 + 12: SECTION LOCAL (0) 0x80010008a0 + 13: SECTION LOCAL (0) 0x8001000d30 + 14: SECTION LOCAL (0) 0x8001000d4c + 15: SECTION LOCAL (0) 0x8001000d50 + 16: SECTION LOCAL (0) 0x8001000d70 + 17: SECTION LOCAL (0) 0x800101fde0 + 18: SECTION LOCAL (0) 0x800101fde8 + 19: SECTION LOCAL (0) 0x800101fdf0 + 20: SECTION LOCAL (0) 0x800101fdf8 + 21: SECTION LOCAL (0) 0x800101fe20 + 22: SECTION LOCAL (0) 0x8001020000 + 23: SECTION LOCAL (0) 0x8001020010 + 24: SECTION LOCAL (0) 0x80010200d8 + 25: SECTION LOCAL (0) 0x8001020110 + 26: SECTION LOCAL (0) 0x8001020158 + 27: SECTION LOCAL (0) 0 + 28: SECTION LOCAL (0) 0 + 29: SECTION LOCAL (0) 0 + 30: SECTION LOCAL (0) 0 + 31: SECTION LOCAL (0) 0 + 32: SECTION LOCAL (0) 0 + 33: SECTION LOCAL (0) 0 + 34: FILE LOCAL crtstuff.c (0) 0 + 35: OBJECT LOCAL __JCR_LIST__ (0) 0x800101fdf0 + 36: FUNC LOCAL deregister_tm_clones (0) 0x8001020040, rel: 0x20040 (.opd) [0x8001000910, rel: 0x70 (.text)] + 37: FUNC LOCAL register_tm_clones (0) 0x8001020050, rel: 0x20050 (.opd) [0x8001000980, rel: 0xe0 (.text)] + 38: FUNC LOCAL __do_global_dtors_aux (0) 0x8001020060, rel: 0x20060 (.opd) [0x80010009f0, rel: 0x150 (.text)] + 39: OBJECT LOCAL completed.7711 (1) 0x8001020158 + 40: OBJECT LOCAL __do_global_dtors_aux_fini_array_entry (0) 0x800101fde8 + 41: FUNC LOCAL frame_dummy (0) 0x8001020070, rel: 0x20070 (.opd) [0x8001000a50, rel: 0x1b0 (.text)] + 42: OBJECT LOCAL __frame_dummy_init_array_entry (0) 0x800101fde0 + 43: FILE LOCAL foo.c (0) 0 + 44: FILE LOCAL bar.c (0) 0 + 45: OBJECT LOCAL b1 (4) 0x8001020004 + 46: FUNC LOCAL foo (76) 0x8001020090, rel: 0x20090 (.opd) [0x8001000b34, rel: 0x294 (.text)] + 47: FILE LOCAL crtstuff.c (0) 0 + 48: OBJECT LOCAL __FRAME_END__ (0) 0x8001000e18 + 49: OBJECT LOCAL __JCR_END__ (0) 0x800101fdf0 + 50: FILE LOCAL (0) 0 + 51: NOTYPE LOCAL __glink_PLTresolve (0) 0x8001000ce8 + 52: NOTYPE LOCAL 00000011.plt_call.__libc_start_main@@GLIBC_2.3 (0) 0x80010008a0 + 53: NOTYPE LOCAL 00000011.plt_call.__cxa_finalize@@GLIBC_2.3 (0) 0x80010008b4 + 54: NOTYPE LOCAL __init_array_end (0) 0x800101fde8 + 55: OBJECT LOCAL _DYNAMIC (0) 0x800101fe20 + 56: NOTYPE LOCAL __init_array_start (0) 0x800101fde0 + 57: FUNC GLOBAL __libc_csu_fini (16) 0x80010200c0, rel: 0x200c0 (.opd) [0x8001000cd0, rel: 0x430 (.text)] + 58: FUNC GLOBAL __libc_start_main@@GLIBC_2.3 (0) 0 + 59: NOTYPE WEAK _ITM_deregisterTMCloneTable (0) 0 + 60: NOTYPE WEAK data_start (0) 0x8001020000 + 61: NOTYPE GLOBAL _edata (0) 0x8001020110 + 62: FUNC GLOBAL bar (116) 0x80010200a0, rel: 0x200a0 (.opd) [0x8001000b80, rel: 0x2e0 (.text)] + 63: FUNC GLOBAL _fini (0) 0x8001020030, rel: 0x20030 (.opd) [0x8001000d30, rel: 0 (.fini)] + 64: NOTYPE GLOBAL __data_start (0) 0x8001020000 + 65: NOTYPE WEAK __gmon_start__ (0) 0 + 66: OBJECT GLOBAL __dso_handle (0) 0x800101fe18 + 67: OBJECT GLOBAL _IO_stdin_used (4) 0x8001000d4c + 68: OBJECT GLOBAL b2 (4) 0x8001020008 + 69: FUNC WEAK __cxa_finalize@@GLIBC_2.3 (0) 0 + 70: FUNC GLOBAL __libc_csu_init (204) 0x80010200b0, rel: 0x200b0 (.opd) [0x8001000c00, rel: 0x360 (.text)] + 71: NOTYPE GLOBAL _end (0) 0x8001020160 + 72: FUNC GLOBAL _start (60) 0x8001020010, rel: 0x20010 (.opd) [0x80010008c8, rel: 0x28 (.text)] + 73: NOTYPE GLOBAL __bss_start (0) 0x8001020110 + 74: FUNC GLOBAL main (128) 0x8001020080, rel: 0x20080 (.opd) [0x8001000ab4, rel: 0x214 (.text)] + 75: NOTYPE WEAK _Jv_RegisterClasses (0) 0 + 76: OBJECT GLOBAL __TMC_END__ (0) 0x8001020010 + 77: NOTYPE WEAK _ITM_registerTMCloneTable (0) 0 + 78: FUNC GLOBAL _init (0) 0x8001020020, rel: 0x20020 (.opd) [0x8001000850, rel: 0 (.init)] +EOF + +cat > testfile.dynsym.in <<\EOF + 0: NOTYPE LOCAL (0) 0 + 1: SECTION LOCAL (0) 0x238 + 2: SECTION LOCAL (0) 0x1fdf0 + 3: FUNC GLOBAL __libc_start_main (0) 0 + 4: NOTYPE WEAK _ITM_deregisterTMCloneTable (0) 0 + 5: NOTYPE WEAK __gmon_start__ (0) 0 + 6: FUNC WEAK __cxa_finalize (0) 0 + 7: NOTYPE WEAK _Jv_RegisterClasses (0) 0 + 8: NOTYPE WEAK _ITM_registerTMCloneTable (0) 0 + 9: NOTYPE GLOBAL _edata (0) 0x20110 + 10: NOTYPE GLOBAL _end (0) 0x20160 + 11: NOTYPE GLOBAL __bss_start (0) 0x20110 +EOF + +cat > testfile.minsym.in <<\EOF + 0: NOTYPE LOCAL (0) 0 + 1: SECTION LOCAL (0) 0x238 + 2: SECTION LOCAL (0) 0x1fdf0 + 3: OBJECT LOCAL __do_global_dtors_aux_fini_array_entry (0) 0x1fde8 + 4: OBJECT LOCAL __frame_dummy_init_array_entry (0) 0x1fde0 + 5: NOTYPE LOCAL __glink_PLTresolve (0) 0xce8 + 6: NOTYPE LOCAL 00000011.plt_call.__libc_start_main@@GLIBC_2.3 (0) 0x8a0 + 7: NOTYPE LOCAL 00000011.plt_call.__cxa_finalize@@GLIBC_2.3 (0) 0x8b4 + 8: NOTYPE LOCAL __init_array_end (0) 0x1fde8 + 9: NOTYPE LOCAL __init_array_start (0) 0x1fde0 + 10: SECTION LOCAL (0) 0x238 + 11: SECTION LOCAL (0) 0x24c + 12: SECTION LOCAL (0) 0x26c + 13: SECTION LOCAL (0) 0x290 + 14: SECTION LOCAL (0) 0x2c0 + 15: SECTION LOCAL (0) 0x3e0 + 16: SECTION LOCAL (0) 0x488 + 17: SECTION LOCAL (0) 0x4a0 + 18: SECTION LOCAL (0) 0x4c0 + 19: SECTION LOCAL (0) 0x820 + 20: SECTION LOCAL (0) 0x850 + 21: SECTION LOCAL (0) 0x8a0 + 22: SECTION LOCAL (0) 0xd30 + 23: SECTION LOCAL (0) 0xd4c + 24: SECTION LOCAL (0) 0xd50 + 25: SECTION LOCAL (0) 0xd70 + 26: SECTION LOCAL (0) 0x1fde0 + 27: SECTION LOCAL (0) 0x1fde8 + 28: SECTION LOCAL (0) 0x1fdf0 + 29: SECTION LOCAL (0) 0x1fdf8 + 30: SECTION LOCAL (0) 0x1fe20 + 31: SECTION LOCAL (0) 0x20000 + 32: SECTION LOCAL (0) 0x20010 + 33: SECTION LOCAL (0) 0x200d8 + 34: SECTION LOCAL (0) 0x20110 + 35: SECTION LOCAL (0) 0x20158 + 36: FUNC GLOBAL __libc_start_main (0) 0 + 37: NOTYPE WEAK _ITM_deregisterTMCloneTable (0) 0 + 38: NOTYPE WEAK __gmon_start__ (0) 0 + 39: FUNC WEAK __cxa_finalize (0) 0 + 40: NOTYPE WEAK _Jv_RegisterClasses (0) 0 + 41: NOTYPE WEAK _ITM_registerTMCloneTable (0) 0 + 42: NOTYPE GLOBAL _edata (0) 0x20110 + 43: NOTYPE GLOBAL _end (0) 0x20160 + 44: NOTYPE GLOBAL __bss_start (0) 0x20110 +EOF + +cat > testfile.minsym_pl.in <<\EOF + 0: NOTYPE LOCAL (0) 0 + 1: SECTION LOCAL (0) 0x8001000238 + 2: SECTION LOCAL (0) 0x800101fdf0 + 3: OBJECT LOCAL __do_global_dtors_aux_fini_array_entry (0) 0x800101fde8 + 4: OBJECT LOCAL __frame_dummy_init_array_entry (0) 0x800101fde0 + 5: NOTYPE LOCAL __glink_PLTresolve (0) 0x8001000ce8 + 6: NOTYPE LOCAL 00000011.plt_call.__libc_start_main@@GLIBC_2.3 (0) 0x80010008a0 + 7: NOTYPE LOCAL 00000011.plt_call.__cxa_finalize@@GLIBC_2.3 (0) 0x80010008b4 + 8: NOTYPE LOCAL __init_array_end (0) 0x800101fde8 + 9: NOTYPE LOCAL __init_array_start (0) 0x800101fde0 + 10: SECTION LOCAL (0) 0x8001000238 + 11: SECTION LOCAL (0) 0x800100024c + 12: SECTION LOCAL (0) 0x800100026c + 13: SECTION LOCAL (0) 0x8001000290 + 14: SECTION LOCAL (0) 0x80010002c0 + 15: SECTION LOCAL (0) 0x80010003e0 + 16: SECTION LOCAL (0) 0x8001000488 + 17: SECTION LOCAL (0) 0x80010004a0 + 18: SECTION LOCAL (0) 0x80010004c0 + 19: SECTION LOCAL (0) 0x8001000820 + 20: SECTION LOCAL (0) 0x8001000850 + 21: SECTION LOCAL (0) 0x80010008a0 + 22: SECTION LOCAL (0) 0x8001000d30 + 23: SECTION LOCAL (0) 0x8001000d4c + 24: SECTION LOCAL (0) 0x8001000d50 + 25: SECTION LOCAL (0) 0x8001000d70 + 26: SECTION LOCAL (0) 0x800101fde0 + 27: SECTION LOCAL (0) 0x800101fde8 + 28: SECTION LOCAL (0) 0x800101fdf0 + 29: SECTION LOCAL (0) 0x800101fdf8 + 30: SECTION LOCAL (0) 0x800101fe20 + 31: SECTION LOCAL (0) 0x8001020000 + 32: SECTION LOCAL (0) 0x8001020010 + 33: SECTION LOCAL (0) 0x80010200d8 + 34: SECTION LOCAL (0) 0x8001020110 + 35: SECTION LOCAL (0) 0x8001020158 + 36: FUNC GLOBAL __libc_start_main (0) 0 + 37: NOTYPE WEAK _ITM_deregisterTMCloneTable (0) 0 + 38: NOTYPE WEAK __gmon_start__ (0) 0 + 39: FUNC WEAK __cxa_finalize (0) 0 + 40: NOTYPE WEAK _Jv_RegisterClasses (0) 0 + 41: NOTYPE WEAK _ITM_registerTMCloneTable (0) 0 + 42: NOTYPE GLOBAL _edata (0) 0x8001020110 + 43: NOTYPE GLOBAL _end (0) 0x8001020160 + 44: NOTYPE GLOBAL __bss_start (0) 0x8001020110 +EOF + +cat testfile.symtab.in \ + | testrun_compare ${abs_builddir}/dwflsyms -e testfilebaztabppc64 + +cat testfile.symtab.in \ + | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbgppc64 + +cat testfile.symtab_pl.in \ + | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbgppc64_pl + +sed s/0x8001/0x4200/g testfile.symtab_pl.in \ + | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbgppc64_plr + +cat testfile.dynsym.in \ + | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdynppc64 + +cat testfile.symtab.in \ + | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazmdbppc64 + +cat testfile.minsym.in \ + | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazminppc64 + +cat testfile.minsym_pl.in \ + | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazminppc64_pl + +sed s/0x8001/0x4200/g testfile.minsym_pl.in \ + | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazminppc64_plr + exit 0 diff --git a/tests/testfile66.bz2 b/tests/testfile66.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..4797590e2f4ad9e618de393bf498e76882eeecbb GIT binary patch literal 741 zcmV00003Mj`5HrqpO;dO&IrX&QP-=BAlO zo}dpG0B8UJ01_l3YM!T&00YVfk5B*y zsA$ok&}aYv01X;6Jxv~8)y1h1g49BdEKx~7+h+t;QTG{U`f_MUC}2%iip2#LeH=}T z>ZZZdMVrd9Z7C%onpDJh8if0G@v5$=Fura)i12QfYBP0Qm0vYStb{2{FPP+oF4~DJ zB+xKhM7UcJ!G&mfgTNL!Lgi5E6p|4cnC&HYP}c!yy#6z{?WVd2O3hl==r1rchtJ{H z!x0P+5S5NhNg1~_SrzPUUbK=H7K&={U@N6Jn~ZI(2-bMG^Pf5pmF8~R4o-dDG{LZ` zzCi34dQHj)9cHYUW{K-xzx2ux@MEXD|2##>}c8DBZ!IVtbbnCeCa+U>3cxRXpD zGJ>$=v3`(MNAe7t*6ehvBNu4v)+S?0R{jw2QH$CT@VQAq5D^rq~Z#RgqaDZN0A~SOq>?Oiw+0~MQzOlyFSbE zr>e@)g+tlq1XWm`@@@}^#c)CkQ2siW~l^mI9EyxxH^FJ#C1%WcWs&3l-|6G)N(2i45(N(L`qb}i}3mh5EMSi zCmtk4NMRYNDu@8W)|V!w!6$*QJsisrjCS-T`eLv@uy$Fpw3aG@ACLI}u}v78F=}KZ XMJ*Sl22CbkU-5S&Q-uizt%z@6@PRxr literal 0 HcmV?d00001 diff --git a/tests/testfile66.core.bz2 b/tests/testfile66.core.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..12e2d4442a18fe2d7074c79b365f1711a38b5dc4 GIT binary patch literal 56448 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 Q<$wHL$rRy2L!*PWNFYxGr2qf` literal 0 HcmV?d00001 diff --git a/tests/testfilebazdbgppc64.bz2 b/tests/testfilebazdbgppc64.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..17e77d6dfc8e706a4c9454406202d601ef6168a2 GIT binary patch literal 2366 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 literal 0 HcmV?d00001 diff --git a/tests/testfilebazdbgppc64_plr.bz2 b/tests/testfilebazdbgppc64_plr.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..70f8e005d1756222a8b0d67d54a198078d611d30 GIT binary patch literal 2399 zcma);`#;l*1I9nQ7?Uwe#!xfN)QFjDXbcBgISsita+sluqY1@aODs0G+`6u%acaV( zlP-=Vx5hZwoJ7<)?wzP_hw|-w|AO!HdOtrrzdS!ZKRj+BOb091U_3pT_7Ha**oN8q zpT1^pWo~U{_S zxa~4h4Sj@_NIImozMpQ^QjEWhauOD+#@rkknva`ju4@oL^Uf3qbz~h@%}lEXG`z1l z)5wW5*fqDP8hY2Twc8bXZz_KKh}?6S$s{vj95NF^rH}v&69c*iAjkj$0ALg(nS{}W zaRDiY`JK*a5}>mkPl0jOxPT6o>dC7;9pB&6f&6%3{|Q}iP1I!y)#SC<@M{C2B$>Qa=d2Kp`;h}qSyNKlsasF^daRyPDtEZ+T=dp%_$mUg}PtsdsK!X^zx_VLmpeFtv(JM(5se zj}cqbub$Ur=CPh>5zPU;EaUnxU z=+U@1dD~EMbaLIO<%6KV(2$iUN-|CF@J%tF9cwQ3{N3OsZ@l5x(PG^2gxlic7@ImE zo5B{|YuAnBLsZ0dF#~T0X=lQI`DFAd@I)b`|87RuP30izRL#dm_J+A>J_s)M!C~Fy zexol(ZwY$F-X~kn(o(vL+F*$UcwnfJ7>iR~dA@0y7#|K`A<%1$iuDX_A<7FkIdNO)h*#9{m+(rx`XAF3L0Jdw(Y&qO}2t?`ogd-nb}$<>7 zX^`$SLb_|f0++c5#}1)@Dj3MF914OX<-;stcq|N}lMiOuljSFv{#I9((=X2$idc{QWDk#vDj8Gt0n8a}N~ zETwO&x${8QR`$Cv@TNTNlu@S)R)wvI>ru0J`OJGtGsZ4Ial(8I)S((Q?mwa&AJ(4K z&PafDjb&vArF$C=7TDOqf8&05j?<&p7a)8NS6oEL64x$ZU{;34>keNoF=|W{y(Pl5 zpRE>4nKf=1_8Ag&hBLn+UsXu_kSL}&2n7c zFL)E@JLw8>#h=h!Ybj6)pREk|>j&AD?AFcxW^?0KZ_8_a$+NdjO*N7Ey6ht&7bvpJ zT6GeKNld(>vflQmdlg+J%5$LN!46QZ(5$?PQl+Vif*Wt|3tH@~6{EdU5u`iD+M4c3 zEP)MZXSz}a@)*_lw!_ZTpJ_qMc&fq|ALQaa`Bf7^$_|3mndWmH@C~FcI81lj%dv>E^7n+koMismUSf?t`+|Oq zbbg?=)zvgH&{AS-6@sq#~7zoSgwgpeGZ|u4K*NeKX*ma%OO(L>yM{Cg^4T*+;=yF@n zi@#NoyRrz%+9EVXgv9r@pw;^$MXYi8sl3{V8~IO`RP5;X$Z|pO@Y&63bN`+hMsdlx z<*xQlwT@g;UW6R~CP>Y4Akts_^;^cJV;`(Izo$CXF|h41IZ}`a#FJ z=D#mi&8kCfM+-KX#EtIf+u|!Rc-ioUTE9f~k__j?)s<2;pADdXoMq!!%l&M3sSjln zSpNg=xSK>7xrO;hiY(>kHO3;yqVu1?Zon_686Sr1k>{r~lCfel_0jB# zH>&k=t)wc8x9(qrmU{U5>HC#5^r&x^zW%41Jy33R-Zyf=*iv?2da3{nZ4-Po`M$~e z`v%+3vE`l<4l}BcpBabZJv6zc$pw`wI~F4BnhlmGvI-zSRYXlInq#ubjuuCE85KUM z4C;oPF$~|qEbnFbmd)!{n*>>_N{+hyeabBDrJ7j7p)B#WonvoDW~L|Jp7x)ydYK$WF5^^8MhCqe`f;{wbEfaF&V$ze zy3mMOLSyzl9;5}H8vTY8{Ytmw2Gj&jQ33K!D=XD~bghg>QGL{XJ~0N)-Yo_m)bf@` zlja79^X7_&Crb$%krMTMdSdb@0Sku@J$`z8d>N6l}AjSkcJh8u5yoFBk Lu=gwZ_fY*8ce^_8 literal 0 HcmV?d00001 diff --git a/tests/testfilebazdynppc64.bz2 b/tests/testfilebazdynppc64.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..2e01699e4e13c90c60c8de9d0bdb2daf03aa303b GIT binary patch literal 2327 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 literal 0 HcmV?d00001 diff --git a/tests/testfilebazminppc64_pl.bz2 b/tests/testfilebazminppc64_pl.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..668634030bce27f634ac0272d2cc24d50f10d367 GIT binary patch literal 3900 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 F{x1Q}7^?sP literal 0 HcmV?d00001 diff --git a/tests/testfilebazminppc64_plr.bz2 b/tests/testfilebazminppc64_plr.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..46102853c1f8caea4484b429f4eb35bff5d0dea0 GIT binary patch literal 3535 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 J5*qKw)?o2@pM(Ga literal 0 HcmV?d00001 diff --git a/tests/testfilebaztabppc64.bz2 b/tests/testfilebaztabppc64.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..03afb8c96091fa81b1c08867ce6589bc339eefaa GIT binary patch literal 3697 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 PAN*a(6yZWa!{7vXTMwbb literal 0 HcmV?d00001 -- 2.7.4