aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/glibc-tdep.c31
-rw-r--r--gdb/minsyms.c31
-rw-r--r--gdb/symtab.h4
4 files changed, 45 insertions, 30 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 3787a30..74d4031 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2010-01-21 Tom Tromey <tromey@redhat.com>
+
+ PR symtab/11198:
+ * symtab.h (lookup_minimal_symbol_and_objfile): Declare.
+ * minsyms.c (lookup_minimal_symbol_and_objfile): New function.
+ * glibc-tdep.c (find_minsym_and_objfile): Remove.
+ (glibc_skip_solib_resolver): Use
+ lookup_minimal_symbol_and_objfile.
+
2010-01-21 Kai Tietz <kai.tietz@onevision.com>
* inflow.c (check_syscall): Guard by #if clause for GO32 and
diff --git a/gdb/glibc-tdep.c b/gdb/glibc-tdep.c
index 38b8b39..044dc70 100644
--- a/gdb/glibc-tdep.c
+++ b/gdb/glibc-tdep.c
@@ -28,35 +28,6 @@
/* Calling functions in shared libraries. */
-/* Find the minimal symbol named NAME, and return both the minsym
- struct and its objfile. This probably ought to be in minsym.c, but
- everything there is trying to deal with things like C++ and
- SOFUN_ADDRESS_MAYBE_TURQUOISE, ... Since this is so simple, it may
- be considered too special-purpose for general consumption. */
-
-static struct minimal_symbol *
-find_minsym_and_objfile (char *name, struct objfile **objfile_p)
-{
- struct objfile *objfile;
-
- ALL_OBJFILES (objfile)
- {
- struct minimal_symbol *msym;
-
- ALL_OBJFILE_MSYMBOLS (objfile, msym)
- {
- if (SYMBOL_LINKAGE_NAME (msym)
- && strcmp (SYMBOL_LINKAGE_NAME (msym), name) == 0)
- {
- *objfile_p = objfile;
- return msym;
- }
- }
- }
-
- return 0;
-}
-
/* See the comments for SKIP_SOLIB_RESOLVER at the top of infrun.c.
This function:
1) decides whether a PLT has sent us into the linker to resolve
@@ -85,7 +56,7 @@ glibc_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
struct objfile *objfile;
struct minimal_symbol *resolver
- = find_minsym_and_objfile ("_dl_runtime_resolve", &objfile);
+ = lookup_minimal_symbol_and_objfile ("_dl_runtime_resolve", &objfile);
if (resolver)
{
diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index ee730a4..287f9de 100644
--- a/gdb/minsyms.c
+++ b/gdb/minsyms.c
@@ -693,6 +693,37 @@ lookup_minimal_symbol_by_pc (CORE_ADDR pc)
{
return lookup_minimal_symbol_by_pc_section (pc, NULL);
}
+
+/* Find the minimal symbol named NAME, and return both the minsym
+ struct and its objfile. This only checks the linkage name. Sets
+ *OBJFILE_P and returns the minimal symbol, if it is found. If it
+ is not found, returns NULL. */
+
+struct minimal_symbol *
+lookup_minimal_symbol_and_objfile (const char *name,
+ struct objfile **objfile_p)
+{
+ struct objfile *objfile;
+ unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
+
+ ALL_OBJFILES (objfile)
+ {
+ struct minimal_symbol *msym;
+
+ for (msym = objfile->msymbol_hash[hash];
+ msym != NULL;
+ msym = msym->hash_next)
+ {
+ if (strcmp (SYMBOL_LINKAGE_NAME (msym), name) == 0)
+ {
+ *objfile_p = objfile;
+ return msym;
+ }
+ }
+ }
+
+ return 0;
+}
/* Return leading symbol character for a BFD. If BFD is NULL,
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 800ffd8..8759732 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -1158,6 +1158,10 @@ extern struct minimal_symbol *lookup_minimal_symbol_by_pc_name
extern struct minimal_symbol *lookup_minimal_symbol_by_pc (CORE_ADDR);
+extern struct minimal_symbol *
+ lookup_minimal_symbol_and_objfile (const char *,
+ struct objfile **);
+
extern struct minimal_symbol
*lookup_minimal_symbol_by_pc_section (CORE_ADDR, struct obj_section *);