This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PATCH: binutils/2096: addr2line fails on linux-kernel
- From: "H. J. Lu" <hjl at lucon dot org>
- To: Nick Clifton <nickc at redhat dot com>
- Cc: binutils at sources dot redhat dot com
- Date: Mon, 16 Jan 2006 10:33:18 -0800
- Subject: Re: PATCH: binutils/2096: addr2line fails on linux-kernel
- References: <20051231202544.GA16637@lucon.org> <20060114171925.GA16501@lucon.org> <43CBCCE9.5030406@redhat.com>
On Mon, Jan 16, 2006 at 04:42:17PM +0000, Nick Clifton wrote:
> Hi H.J.
>
> >Could someone comment on this patch
> >
> >http://sourceware.org/ml/binutils/2005-12/msg00290.html
>
> Sorry - it was in my queue, but I am behind in my replies. Anyway:
>
>
> > 2005-12-31 H.J. Lu <hongjiu.lu@intel.com>
> >
> > PR binutils/2096
> > * dwarf2.c (comp_unit_contains_address): Update comment.
> > (_bfd_dwarf2_find_nearest_line): Return TRUE only if both
> > comp_unit_contains_address and comp_unit_find_nearest_line
> > return TRUE.
>
>
> This patch is OK, but please could you extend the comment at the start
> of the comp_unit_contains_address() function - as I understand it the
> reason that we need to consult the line info table is that we cannot
> always trust the compilation unit header information. In particular
> compilation units which contain hand coded assembler may be unreliable.
> Yes ? If so, please could you add a sentence to this effect into the
> comment ?
>
>
> > 2005-12-31 H.J. Lu <hongjiu.lu@intel.com>
> >
> > PR binutils/2096
> > * dwarf2.c (_bfd_dwarf2_find_nearest_line): Use section's vma,
> > instead of lvm for ELF.
>
> This patch I am not so sure about. Why would we want to use the LMA (or
> LVM) values for non-ELF formats ? Shouldn't we always be using the VMA
> values ? I am assuming here that the debug info is always going to
> relate to the run-time addresses of the executable, not the load-time
> addresses. Can you think of a situation where the load-time addresses
> might be used.
>
> Assuming that you agree with me, please could you submit a revised patch
> which changes this function over to using VMAs instead of LMAs for all
> targets, not just ELF based ones.
>
Here is the updated patch. I combined 2 into 1.
H.J.
----
2006-01-16 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/2096
* dwarf2.c (comp_unit_contains_address): Update comment.
(_bfd_dwarf2_find_nearest_line): Use section's vma, instead of
lvm. Return TRUE only if both comp_unit_contains_address and
comp_unit_find_nearest_line return TRUE.
(_bfd_dwarf2_find_line): Use section's vma, instead of lvm.
--- bfd/dwarf2.c.addr 2005-12-31 08:46:11.000000000 -0800
+++ bfd/dwarf2.c 2006-01-16 10:23:06.000000000 -0800
@@ -2006,7 +2006,11 @@ parse_comp_unit (bfd *abfd,
return unit;
}
-/* Return TRUE if UNIT contains the address given by ADDR. */
+/* Return TRUE if UNIT may contain the address given by ADDR. When
+ there are functions written entirely with inline asm statements, the
+ range info in the compilation unit header may not be correct. We
+ need to consult the line info table to see if a compilation unit
+ really contains the given address. */
static bfd_boolean
comp_unit_contains_address (struct comp_unit *unit, bfd_vma addr)
@@ -2210,9 +2214,9 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd
stash = *pinfo;
addr = offset;
if (section->output_section)
- addr += section->output_section->lma + section->output_offset;
+ addr += section->output_section->vma + section->output_offset;
else
- addr += section->lma;
+ addr += section->vma;
*filename_ptr = NULL;
*functionname_ptr = NULL;
*linenumber_ptr = 0;
@@ -2293,16 +2297,16 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd
/* Check the previously read comp. units first. */
for (each = stash->all_comp_units; each; each = each->next_unit)
- if (comp_unit_contains_address (each, addr))
- return comp_unit_find_nearest_line (each, addr, filename_ptr,
- functionname_ptr, linenumber_ptr,
- stash);
+ if (comp_unit_contains_address (each, addr)
+ && comp_unit_find_nearest_line (each, addr, filename_ptr,
+ functionname_ptr,
+ linenumber_ptr, stash))
+ return TRUE;
/* Read each remaining comp. units checking each as they are read. */
while (stash->info_ptr < stash->info_ptr_end)
{
bfd_vma length;
- bfd_boolean found;
unsigned int offset_size = addr_size;
bfd_byte *info_ptr_unit = stash->info_ptr;
@@ -2358,25 +2362,14 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd
unit->high == 0), we need to consult the line info
table to see if a compilation unit contains the given
address. */
- if (each->arange.high > 0)
- {
- if (comp_unit_contains_address (each, addr))
- return comp_unit_find_nearest_line (each, addr,
- filename_ptr,
- functionname_ptr,
- linenumber_ptr,
- stash);
- }
- else
- {
- found = comp_unit_find_nearest_line (each, addr,
- filename_ptr,
- functionname_ptr,
- linenumber_ptr,
- stash);
- if (found)
- return TRUE;
- }
+ if ((each->arange.high == 0
+ || comp_unit_contains_address (each, addr))
+ && comp_unit_find_nearest_line (each, addr,
+ filename_ptr,
+ functionname_ptr,
+ linenumber_ptr,
+ stash))
+ return TRUE;
}
}
}
@@ -2419,9 +2412,9 @@ _bfd_dwarf2_find_line (bfd *abfd,
addr = symbol->value;
if (section->output_section)
- addr += section->output_section->lma + section->output_offset;
+ addr += section->output_section->vma + section->output_offset;
else
- addr += section->lma;
+ addr += section->vma;
*filename_ptr = NULL;
stash = *pinfo;