Dwarf reader error from ld

Eric DeVolder devolder@evsx.com
Thu Jan 13 06:47:00 GMT 2000


Ian Lance Taylor wrote:

>    Date: Wed, 12 Jan 2000 18:42:44 -0600
>    From: Eric DeVolder <devolder@evsx.com>
>
>    I'm porting binutils (and tweaking gcc) to a new 64bit architecture. I'm
>    getting the following error message from ld during linking when it
>    attempts to use a module in a library archive (libgcc.a in this case):
>
>    -------------------------------------
>    /usr/local/comp/e3/gcc/e3-elf/bin/ld: Dwarf Error: found dwarf version
>    '0' in compilation unit 'ta?}H
>                        Xs ', this reader only handles version 2
>    information.
>
> These errors are appearing when the linker tries to get line number
> information for an error report.

In following thru on your suggestion below, it really appears as if the 7 byte
header is missing (2byte ver, 4 byte abbrev table offset, 1 byte addr_size)
from the generated asm source. In looking at parse_comp_unit() in dwarf2.c, the
first thing it does is look for this header, and if it fails the sanity check,
it displays the error message above. (By the way, there is a code error here in
that the call to bfd_error_handler() is using the variable 'unit' before it is
assigned a value, thus the garbage printed for compilation unit in the above
error message.)

Dumping the .debug_info section confirms this theory:

Contents of section .debug_abbrev:
 0000 01110103 081b0825 08130b00 00022e00  .......%........
 0010 3f0c0308 3a0b3b05 11011201 400a0000  ?...:.;.....@...
 0020 00                                   .
Contents of section .debug_info:
 0000 92000000 00000000 02000000 00000000  ................
 0010 00000801 2e2e2f2e 2e2f6763 632f6763  ....../../gcc/gc
 0020 632f6c69 62676363 322e6300 2f757372  c/libgcc2.c./usr
 0030 2f6c6f63 616c2f64 65766f6c 6465722f  /local/devolder/
 0040 63726f73 73676363 2f6f626a 2d65332d  crossgcc/obj-e3-
 0050 656c662f 67636300 474e5520 4320322e  elf/gcc.GNU C 2.
 0060 39352e32 20313939 39313032 34202872  95.2 19991024 (r
 0070 656c6561 73652900 0102015f 5f6d756c  elease)....__mul
 0080 64693300 01250100 00000000 00000000  di3..%..........
 0090 00000000 00000001 5500               ........U.
Contents of section .debug_line:
Contents of section .debug_pubnames:
 0000 2b000000 00000000 02000000 00000000  +...............
 0010 00009a00 00000000 00007900 00000000  ..........y.....
 0020 00005f5f 6d756c64 69330000 00000000  ..__muldi3......
 0030 000000                               ...
Contents of section .debug_aranges:
 0000 38000000 00000000 02000000 00000000  8...............
 0010 00000800 04000000 00000000 00000000  ................
 0020 00000000 00000000 00000000 00000000  ................
 0030 00000000 00000000 00000000 00000000  ................

>From what I have learned, I would expect the first seven bytes of the
.debug_info section to contain:

0x02 0x00  (version, little endian)
0xXX 0xXX 0xXX 0xXX (abbrev table offset)
0x08 (addr size)

The first seven bytes clearly don't match this. In fact, the contents of the
.debug_info contain exactly what the asm source says:

    .section    .debug_info
    .8byte  0x92
    .2byte  0x2
    .8byte  $Ldebug_abbrev0
    .byte   0x8
    .byte   0x1
    .ascii "../../gcc/gcc/libgcc2.c\0"

    .ascii "/usr/local/devolder/crossgcc/obj-e3-elf/gcc\0"

    .ascii "GNU C 2.95.2 19991024 (release)\0"

    .byte   0x1
    .byte   0x2
    .byte   0x1
    .ascii "__muldi3\0"

    .byte   0x1
    .2byte  0x125
    .8byte  $LFB1
    .8byte  $LFE1
    .byte   0x1
    .byte   0x55
    .byte   0x0

So, I'm going to pursuit why the Dwarf header is being omitted. (I'm going to
start with the ASM_FILE_START macro in gcc).

>
>
>    libgcc1-test.o(.text+0xf8): undefined reference to `__divsi3'
>
> These errors mean that these symbols are not defined anywhere.  This
> has nothing to do with any DWARF issue.

yeah, i know...

>    As far as I can tell, the source file looks okay [snippet of gcc -S
>    below]. Admittedly, I'm not very familiar with Dwarf2, so i an be
>    thrashed if this is the problem...
>
> Do you override find_nearest_line in your BFD backend?  If you don't,
> the linker will think it should be reading 4 byte addresses from the
> DWARF debugging info.  You are giving it 8 byte addresses, so that
> won't work.  You can pass the last argument of
> _bfd_dwarf2_find_nearest_line as 8 to tell it to use 8 byte addresses.

No. I looked at this function, but there is no argument that says what addr
size is. Perhaps this is because I'm still on 2.9.1.

> I'm not sure why the DWARF information itself does not record this.

I think this is exactly the problem that I'm witnessing. Somehow gcc+dwarf
isn't emitting the header.

>    Because it is assembling ok, it appears as if binutils is correctly
>    handling Dwarf2 (ptr size is 8).
>
> This doesn't really prove anything.  The assembler does not parse the
> DWARF information at all.  It just writes it to the file.
>
> Ian

Thanks a bunch! I'll post an update of what I find.

Eric



More information about the Binutils mailing list