diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/glibc-tdep.c | 31 | ||||
-rw-r--r-- | gdb/minsyms.c | 31 | ||||
-rw-r--r-- | gdb/symtab.h | 4 |
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 *); |