aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2000-08-07 10:56:22 +0000
committerMark Kettenis <kettenis@gnu.org>2000-08-07 10:56:22 +0000
commit8554b7d530743b6f61cf27f58167e1a8d6699f43 (patch)
tree83e5a536011715d99d9732e15cee41842e18a36c /gdb
parent89727b6fbf33f119332b50e906fde555716ac51a (diff)
downloadgdb-8554b7d530743b6f61cf27f58167e1a8d6699f43.zip
gdb-8554b7d530743b6f61cf27f58167e1a8d6699f43.tar.gz
gdb-8554b7d530743b6f61cf27f58167e1a8d6699f43.tar.bz2
* 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).
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/solib.c32
2 files changed, 36 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0c47be7..aad8daa 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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
diff --git a/gdb/solib.c b/gdb/solib.c
index b6cfcaa..a957411 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -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