[RFA] Fix for searching for data symbols
Daniel Jacobowitz
drow@mvista.com
Sat Jan 19 09:33:00 GMT 2002
This patch fixes the problem I described in:
http://sources.redhat.com/ml/gdb/2002-01/msg00223.html
Basically, since we use the bounds of the text segment to search for symbols
in find_pc_*, don't let them return a bogus answer for a symbol we know is
off in data land.
OK to commit, or does anyone prefer a different approach to this?
--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer
2002-01-19 Daniel Jacobowitz <drow@mvista.com>
* symtab.c (find_pc_sect_psymtab): Do not search psymtabs for
data symbols, since we search based on textlow and texthigh.
(find_pc_sect_symtab): Likewise.
Index: symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.51
diff -u -p -r1.51 symtab.c
--- symtab.c 2001/12/21 22:32:37 1.51
+++ symtab.c 2002/01/19 17:29:09
@@ -354,12 +354,22 @@ find_pc_sect_psymtab (CORE_ADDR pc, asec
{
register struct partial_symtab *pst;
register struct objfile *objfile;
+ struct minimal_symbol *msymbol;
+ /* If we know that this is not a text address, return failure. */
+ msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
+ if (msymbol
+ && (msymbol->type == mst_data
+ || msymbol->type == mst_bss
+ || msymbol->type == mst_abs
+ || msymbol->type == mst_file_data
+ || msymbol->type == mst_file_bss))
+ return NULL;
+
ALL_PSYMTABS (objfile, pst)
{
if (pc >= pst->textlow && pc < pst->texthigh)
{
- struct minimal_symbol *msymbol;
struct partial_symtab *tpst;
/* An objfile that has its functions reordered might have
@@ -370,7 +380,6 @@ find_pc_sect_psymtab (CORE_ADDR pc, asec
section == 0) /* can't validate section this way */
return (pst);
- msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
if (msymbol == NULL)
return (pst);
@@ -1385,6 +1394,17 @@ find_pc_sect_symtab (CORE_ADDR pc, asect
register struct partial_symtab *ps;
register struct objfile *objfile;
CORE_ADDR distance = 0;
+ struct minimal_symbol *msymbol;
+
+ /* If we know that this is not a text address, return failure. */
+ msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
+ if (msymbol
+ && (msymbol->type == mst_data
+ || msymbol->type == mst_bss
+ || msymbol->type == mst_abs
+ || msymbol->type == mst_file_data
+ || msymbol->type == mst_file_bss))
+ return NULL;
/* Search all symtabs for the one whose file contains our address, and which
is the smallest of all the ones containing the address. This is designed
More information about the Gdb-patches
mailing list