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