]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
From "Francis Lebourse" <flebourse@jetmultimedia.fr>:
authorJulian Seward <jseward@acm.org>
Wed, 2 Oct 2002 10:20:30 +0000 (10:20 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 2 Oct 2002 10:20:30 +0000 (10:20 +0000)
[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

coregrind/vg_symtab2.c

index 7ae017064ebb3742979c366d34d01c03eee9040a..66e397f272ecca8f0952b653d55fbbf2354519cc 100644 (file)
@@ -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;