This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Location lists again
- From: Daniel Berlin <dberlin at dberlin dot org>
- To: Michal Ludvig <mludvig at suse dot cz>
- Cc: gcc at sources dot redhat dot com
- Date: Thu, 13 Feb 2003 11:40:50 -0500
- Subject: Re: Location lists again
On Thursday, February 13, 2003, at 11:28 AM, Michal Ludvig wrote:
Hi Daniel,
I propose a small modification to .debug_loc output. Now it's
generated in a form of:
.section .debug_loc,"",@progbits
.LLST0:
.quad .LVL0-.text # Location list begin address (*.LLST0)
.quad .LVL1-.text # Location list end address (*.LLST0)
.value 0x1 # Location expression size
.byte 0x55 # DW_OP_reg5
[...]
So the address range is recorded as offsets from beginning of .text
section in a given .o file.
Which is correct.
When I link several of .o files together, these offsets don't get
updated to reflect curent position and current offset in the resulting
binary.
They shouldn't. They default to being based off the base address of the
compilation unit they are associated with.
Thus, the reason they subtract .text is because they belong to a
compilation unit whose base address is .text.
"
A location list entry consists of:
1. A beginning address. This address is relative to the applicable
base address of the compilation unit referencing this location list. It
marks the beginning of the address range over which the location is
valid.
"
Would it be possible to change the output to absolute addresses?
Err, no, actually. That would make them invalid.
What I can do (going by the standard) actually won't help you. :(
I can output needless base address selection entries for .text, but
it's still going to display them in readelf as pure offsets, not the
actual addresses.
("The applicable base address of a location list entry is determined by
the closest preceding baseaddress selection entry (see below) in the
same location list. If there is no such selection entry,then the
applicable base address defaults to the base address of the compilation
unit (seeSection 3.1).
In the case of a compilation unit where all of the machine code is
contained in a single contiguous section, no base address selection
entry is needed.")
It doesn't help a debugger to do base selection entries for .text (we
do output them if we need a base address of some other section, which
can happen with -ffunction-sections), since it knows the right base
address anyway.
.section .debug_loc,"",@progbits
.LLST0:
.quad .LVL0 # Location list begin address (*.LLST0)
.quad .LVL1 # Location list end address (*.LLST0)
.value 0x1 # Location expression size
.byte 0x55 # DW_OP_reg5
[...]
This way the addresses would be correctly updated on linking.
They are correct, though readelf -w will only show the offsets, because
it doesn't know what CU they go with (IE debug_loc parsing is
completely removed from debug_info parsing).
When a debugger actually loads them, it is supposed to add the base
address of the CU to each one.
If I manually change the .s file generated from .c, remove '-.text'
and compile it seems to work perfectly.
Thanks in advance!
Michal Ludvig
--
* SuSE CR, s.r.o * mludvig@suse.cz
* (+420) 296.545.373 * http://www.suse.cz