[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