PATCH: PR 990: "nm -l" doesn't work well on relocatable files

H. J. Lu hjl@lucon.org
Tue Jun 7 02:25:00 GMT 2005


On Mon, Jun 06, 2005 at 10:21:49AM -0700, H. J. Lu wrote:
> On Mon, Jun 06, 2005 at 03:12:49PM +0100, Nick Clifton wrote:
> > Hi H. J.
> > 
> > >bfd/
> > >
> > >2005-06-05  H.J. Lu  <hongjiu.lu@intel.com>
> > >
> > >	PR 990
> > >	* bfd.c (bfd_find_line): New.
> > >
> > >	* dwarf2.c (comp_unit): Add variable_table.
> > >	(funcinfo): Add file, line, and sec.
> > >	(varinfo): New.
> > >	(lookup_symbol_in_function_table): New.
> > >	(lookup_symbol_in_variable_table): New.
> > >	(scan_unit_for_functions): Renamed to ...
> > >	(scan_unit_for_symbols): This. Handle DW_TAG_entry_point and
> > >	DW_TAG_variable.
> > >	(comp_unit_find_nearest_line): Updated.
> > >	(comp_unit_find_line): New.
> > >	(_bfd_dwarf2_find_line): New.
> > >
> > >	* elf-bfd.h (_bfd_elf_find_line): New.
> > >	(_bfd_generic_find_line): New. Defined.
> > >
> > >	* elf.c (_bfd_elf_find_line): New.
> > >
> > >	* libbfd-in.h (_bfd_dwarf2_find_line): New.
> > >	(_bfd_generic_find_line): New.
> > >
> > >	* bfd-in2.h: Regenerated.
> > >	* libbfd.h: Likewise.
> > >
> > >	* libbfd.c (_bfd_generic_find_line): New.
> > >
> > >	* targets.c (BFD_JUMP_TABLE_SYMBOLS): Initialize _bfd_find_line
> > >	with _bfd_generic_find_line.
> > >	(bfd_target): Add _bfd_find_line.
> > >
> > >binutils/
> > >
> > >2005-06-05  H.J. Lu  <hongjiu.lu@intel.com>
> > >
> > >	PR 990
> > >	* nm.c (print_symbol): Call bfd_find_line before
> > >	bfd_find_nearest_line.
> > 
> > Approved - please apply - but please could you also fix up the 
> > formatting of the comments - some of them do not follow the GNU Coding 
> > Standards.
> > 
> 
> This is a followup patch to check address for variabl.
> 
> 

I need to deal with bad dwarf2 info.


H.J.
---
2005-06-06  H.J. Lu  <hongjiu.lu@intel.com>

	* dwarf2.c (varinfo): Add addr.
	(lookup_symbol_in_variable_table): Also check addr.
	(scan_unit_for_symbols): Set addr for variable.
	(comp_unit_find_line): Updated.

--- bfd/dwarf2.c.addr	2005-06-06 08:45:04.000000000 -0700
+++ bfd/dwarf2.c	2005-06-06 18:13:02.000000000 -0700
@@ -719,6 +719,7 @@ struct varinfo
   int line;
   int tag;
   char *name;
+  bfd_vma addr;
   /* Where the symbol is defined */
   asection *sec;
   /* Is this a stack variable? */
@@ -1500,6 +1501,7 @@ lookup_symbol_in_function_table (struct 
 static bfd_boolean
 lookup_symbol_in_variable_table (struct comp_unit *unit,
 				 asymbol *sym,
+				 bfd_vma addr,
 				 const char **filename_ptr,
 				 unsigned int *linenumber_ptr)
 {
@@ -1509,6 +1511,9 @@ lookup_symbol_in_variable_table (struct 
 
   for (each = unit->variable_table; each; each = each->prev_var)
     if (each->stack == 0
+	&& each->file != NULL
+	&& each->name != NULL
+	&& each->addr == addr
 	&& (!each->sec || each->sec == sec)
 	&& strcmp (name, each->name) == 0)
       break;
@@ -1754,21 +1759,23 @@ scan_unit_for_symbols (struct comp_unit 
 		  break;
 
 		case DW_AT_location:
-		  if (var->stack)
+		  switch (attr.form)
 		    {
-		      switch (attr.form)
+		    case DW_FORM_block:
+		    case DW_FORM_block1:
+		    case DW_FORM_block2:
+		    case DW_FORM_block4:
+		      if (*attr.u.blk->data == DW_OP_addr)
 			{
-			case DW_FORM_block:
-			case DW_FORM_block1:
-			case DW_FORM_block2:
-			case DW_FORM_block4:
-			  if (*attr.u.blk->data == DW_OP_addr)
-			    var->stack = 0;
-			  break;
-
-			default:
-			  break;
+			  var->stack = 0;
+			  var->addr = bfd_get ((attr.u.blk->size - 1) * 8,
+					       unit->abfd,
+					       attr.u.blk->data + 1);
 			}
+		      break;
+		    
+		    default:
+		      break;
 		    }
 		  break;
 
@@ -2078,7 +2085,8 @@ comp_unit_find_line (struct comp_unit *u
 					    filename_ptr,
 					    linenumber_ptr);
   else
-    return lookup_symbol_in_variable_table (unit, sym, filename_ptr,
+    return lookup_symbol_in_variable_table (unit, sym, addr,
+					    filename_ptr,
 					    linenumber_ptr);
 }
 



More information about the Binutils mailing list