From: Julian Seward Date: Wed, 2 Oct 2002 10:20:30 +0000 (+0000) Subject: From "Francis Lebourse" : X-Git-Tag: svn/VALGRIND_1_9_4~266 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=83cb487dd029e875673fba105b77735beb03893f;p=thirdparty%2Fvalgrind.git From "Francis Lebourse" : [re the ELF symbol reader] This patch tries to exploit the dynamic symbols of a library if the standard and debug symbols are missing. This way, I avoid the "object doesn't have a symbol table message" message and valgrind is able to print meaningful backtraces (else you have only "in libsomelib.so"), even in the case of stripped libs. Since the check of the .dynsym/.dynstr sections is done before the .symtab/.strtab sections, the previous behavior is preseved for unstripped libraries. MERGE TO STABLE (if it doesn't cause probs with suppression files) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1161 --- diff --git a/coregrind/vg_symtab2.c b/coregrind/vg_symtab2.c index 7ae017064e..66e397f272 100644 --- a/coregrind/vg_symtab2.c +++ b/coregrind/vg_symtab2.c @@ -1420,6 +1420,25 @@ void vg_read_lib_symbols ( SegInfo* si ) /* find the .stabstr and .stab sections */ for (i = 0; i < ehdr->e_shnum; i++) { + + /* As a fallback position, we look first for the dynamic + symbols of a library to increase the chances that we can + say something helpful even if the standard and debug + symbols are missing. */ + + if (0 == VG_(strcmp)(".dynsym",sh_strtab + shdr[i].sh_name)) { + o_symtab = (Elf32_Sym*)(oimage + shdr[i].sh_offset); + o_symtab_sz = shdr[i].sh_size; + vg_assert((o_symtab_sz % sizeof(Elf32_Sym)) == 0); + /* check image overrun here */ + } + if (0 == VG_(strcmp)(".dynstr",sh_strtab + shdr[i].sh_name)) { + o_strtab = (UChar*)(oimage + shdr[i].sh_offset); + o_strtab_sz = shdr[i].sh_size; + /* check image overrun here */ + } + + /* now look for the main symbol and string tables. */ if (0 == VG_(strcmp)(".symtab",sh_strtab + shdr[i].sh_name)) { o_symtab = (Elf32_Sym*)(oimage + shdr[i].sh_offset); o_symtab_sz = shdr[i].sh_size;