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 ..@.......v...@.
  0x00000040 00000000 b7064000 00000000 02007708 ......@.......w.


Is this is a known bug or issue or am I missing something?

Reply via email to