* solib.c (bfd_lookup_symbol): Fall back on the dynamic symbol
authorMark Kettenis <kettenis@gnu.org>
Mon, 7 Aug 2000 10:56:22 +0000 (10:56 +0000)
committerMark Kettenis <kettenis@gnu.org>
Mon, 7 Aug 2000 10:56:22 +0000 (10:56 +0000)
table if the symbol couldn't be found in the normal symbol table
(i.e. if the shared object in question was stripped).

gdb/ChangeLog
gdb/solib.c

index 0c47be7e05cc33a309fda5a65e555bdd55649dcd..aad8daad8b9106c7b152c6fa3072e4f937c4ccf6 100644 (file)
@@ -1,3 +1,9 @@
+2000-05-21  Mark Kettenis  <kettenis@gnu.org>
+
+       * solib.c (bfd_lookup_symbol): Fall back on the dynamic symbol
+       table if the symbol couldn't be found in the normal symbol table
+       (i.e. if the shared object in question was stripped).
+
 2000-08-06  Kevin Buettner  <kevinb@redhat.com>
 
        * ch-exp.c (parse_opt_name_string): Protoize.  [Thanks to Eli
index b6cfcaa55975ed182842afca4aebd11c202d57e5..a95741125c08e39dd14987c6df99e906419e13fb 100644 (file)
@@ -1,5 +1,5 @@
 /* Handle SunOS and SVR4 shared libraries for GDB, the GNU Debugger.
-   Copyright 1990, 91, 92, 93, 94, 95, 96, 98, 1999
+   Copyright 1990, 91, 92, 93, 94, 95, 96, 98, 1999, 2000
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -528,7 +528,35 @@ bfd_lookup_symbol (bfd *abfd, char *symname)
        }
       do_cleanups (back_to);
     }
-  return (symaddr);
+
+  if (symaddr)
+    return symaddr;
+
+  /* On FreeBSD, the dynamic linker is stripped by default.  So we'll
+     have to check the dynamic string table too.  */
+
+  storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
+
+  if (storage_needed > 0)
+    {
+      symbol_table = (asymbol **) xmalloc (storage_needed);
+      back_to = make_cleanup (free, (PTR) symbol_table);
+      number_of_symbols = bfd_canonicalize_dynamic_symtab (abfd, symbol_table);
+
+      for (i = 0; i < number_of_symbols; i++)
+       {
+         sym = *symbol_table++;
+         if (STREQ (sym->name, symname))
+           {
+             /* Bfd symbols are section relative. */
+             symaddr = sym->value + sym->section->vma;
+             break;
+           }
+       }
+      do_cleanups (back_to);
+    }
+
+  return symaddr;
 }
 
 #ifdef HANDLE_SVR4_EXEC_EMULATORS