From: Tom Tromey Date: Thu, 21 Jan 2010 17:12:18 +0000 (+0000) Subject: PR symtab/11198: X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0d5392b8b1b1a362a58e90d4f734ff41c6ab7009;p=binutils-gdb.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3787a30f86e..74d40318428 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2010-01-21 Tom Tromey + + 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 * inflow.c (check_syscall): Guard by #if clause for GO32 and diff --git a/gdb/glibc-tdep.c b/gdb/glibc-tdep.c index 38b8b397548..044dc702097 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 ee730a449a9..287f9de875e 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 800ffd8624f..8759732ed45 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 *);