I'm running into an issue with start/end values of debug_loc entries
being absolute addresses instead of offsets when a file is compiled
with -gdwarf-2 and -gstrict-dwarf and there are virtual methods in
that file. gcc 4.4.7, but I've seen it under 4.8'ish.
I'm new enough to dwarf stuff to not be 100% sure that this is a bug
vs. I'm just missing a field somewhere that indicates that these
debug_loc entries are in a different format.... but on the other hand,
readelf also seems confused about this.
An example file:
#include <stdio.h>
struct class1
{
class1() { printf("blah\n"); }
virtual ~class1() { }
};
int main()
{
class1 c1;
return 0;
}
# g++ -gdwarf-2 -gstrict-dwarf -o foo foo.cpp
# readelf -W -w -x .debug_loc foo > foo.debuginfo
from the foo.debuginfo file:
The compile_unit shows 0x400664 as its lowpc:
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
< c> DW_AT_producer : (indirect string, offset: 0xab): GNU
C++ 4.4.7 20120313 (Red Hat 4.4.7-17)
<10> DW_AT_language : 4 (C++)
<11> DW_AT_name : (indirect string, offset: 0x29): foo.cpp
<15> DW_AT_comp_dir : (indirect string, offset: 0x41): <snipped>
<19> DW_AT_low_pc : 0x400664
<21> DW_AT_high_pc : 0x400693
<29> DW_AT_stmt_list : 0x0
But the debug_loc section shows start addresses in the 0x80000 range:
Contents of the .debug_loc section:
Offset Begin End Expression
00000000 0000000000800cf8 0000000000800cf9 (DW_OP_breg7: 8)
00000000 0000000000800cf9 0000000000800cfc (DW_OP_breg7: 16)
00000000 0000000000800cfc 0000000000800d1a (DW_OP_breg6: 16)
00000000 0000000000800d1a 0000000000800d1b (DW_OP_breg7: 8)
00000000 <End of list>
(800cf8 == lowpc 0x400664 + 0x400694)
Hex dump of section '.debug_loc':
0x00000000 94064000 00000000 95064000 00000000 ..@.......@.....
0x00000010 02007708 95064000 00000000 98064000 ..w...@.......@.
0x00000020 00000000 02007710 98064000 00000000 ......w...@.....
0x00000030 b6064000 00000000 02007610 b6064000 [email protected]...@.
0x00000040 00000000 b7064000 00000000 02007708 [email protected].
Is this is a known bug or issue or am I missing something?