https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86456
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
Looks like binutils 2.30 readelf still isn't happy with dwarf5 produced for
LTO.
readelf: Error: Internal error: DWARF version is not 2, 3 or 4.
readelf: Warning: DIE at offset 0x12f refers to abbreviation number 90 which
does not exist
readelf: Error: Internal error: DWARF version is not 2, 3 or 4.
readelf: Warning: DIE at offset 0x12f refers to abbreviation number 90 which
does not exist
readelf: Error: Internal error: DWARF version is not 2, 3 or 4.
readelf: Warning: DIE at offset 0x12f refers to abbreviation number 90 which
does not exist
readelf: Warning: Unable to load/parse the .debug_info section, so cannot
interpret the .debug_loc section.
readelf: Warning: Unable to load/parse the .debug_info section, so cannot
interpret the .debug_ranges section.
the obvious error part is
Compilation Unit @ offset 0x100:
Length: 0x47 (32-bit)
Version: 5
Abbrev Offset: 0x90
Pointer Size: 8
<0><10c>: Abbrev Number: 1 (DW_TAG_compile_unit)
<10d> DW_AT_producer : (indirect string, offset: 0x236): GNU GIMPLE
9.0.0 20180716 (experimental) -mtune=generic -march=x86-64 -mtune=generic
-march=x86-64 -g -gdwarf-5 -fno-openmp -fno-openacc -fltrans
<111> DW_AT_language : 29 (C11)
<112> DW_AT_name : (indirect string, offset: 0x229): <artificial>
<116> DW_AT_comp_dir : (indirect string, offset: 0x1ac):
/abuild/rguenther/obj-sccvn-g/gcc
<11a> DW_AT_low_pc : 0x4004b2
<122> DW_AT_high_pc : 0xb
<12a> DW_AT_stmt_list : 0x11d
<1><12e>: Abbrev Number: 2 (DW_TAG_imported_unit)
<12f> DW_AT_import : <0x0> [Abbrev Number: 42]
<1><12f>: Abbrev Number: 90
Contents of the .debug_abbrev section:
you can see the import looks garbled.
2 DW_TAG_imported_unit [no children]
DW_AT_import DW_FORM_ref_addr
DW_AT value: 0 DW_FORM value: 0
but the dwarf-4 variant which looks fine has the same abbrev.
<1><12c>: Abbrev Number: 2 (DW_TAG_imported_unit)
<12d> DW_AT_import : <0xd9> [Abbrev Number: 1]
I can see we output the import "offset" with size 4 (but -gdwarf-4 works).
The assembly looks good as far as I can see:
.Ldebug_info0:
.long 0x47 # Length of Compilation Unit Info
.value 0x5 # DWARF version number
.byte 0x1 # DW_UT_compile
.byte 0x8 # Pointer Size (in bytes)
.long .Ldebug_abbrev0 # Offset Into Abbrev. Section
.uleb128 0x1 # (DIE (0xc) DW_TAG_compile_unit)
.long .LASF0 # DW_AT_producer: "GNU GIMPLE 9.0.0 20180716
(experimental) -mtune=generic -march=x86-64 -mtune=generic -march=x86-64 -g
-gdwarf-5 -fno-openmp -fno-openacc -fltrans"
.byte 0x1d # DW_AT_language
.long .LASF1 # DW_AT_name: "<artificial>"
.long .LASF2 # DW_AT_comp_dir: "/abuild/rguenther/obj-sccvn-g/gcc"
.quad .Ltext0 # DW_AT_low_pc
.quad .Letext0-.Ltext0 # DW_AT_high_pc
.long .Ldebug_line0 # DW_AT_stmt_list
.uleb128 0x2 # (DIE (0x2e) DW_TAG_imported_unit)
.long t.c.ca3ae4e6+12 # DW_AT_import
.uleb128 0x3 # (DIE (0x33) DW_TAG_subprogram)
.long t.c.ca3ae4e6+30 # DW_AT_abstract_origin
.quad .LFB0 # DW_AT_low_pc
...
.Ldebug_abbrev0:
.uleb128 0x1 # (abbrev code)
.uleb128 0x11 # (TAG: DW_TAG_compile_unit)
.byte 0x1 # DW_children_yes
.uleb128 0x25 # (DW_AT_producer)
.uleb128 0xe # (DW_FORM_strp)
.uleb128 0x13 # (DW_AT_language)
.uleb128 0xb # (DW_FORM_data1)
.uleb128 0x3 # (DW_AT_name)
.uleb128 0xe # (DW_FORM_strp)
.uleb128 0x1b # (DW_AT_comp_dir)
.uleb128 0xe # (DW_FORM_strp)
.uleb128 0x11 # (DW_AT_low_pc)
.uleb128 0x1 # (DW_FORM_addr)
.uleb128 0x12 # (DW_AT_high_pc)
.uleb128 0x7 # (DW_FORM_data8)
.uleb128 0x10 # (DW_AT_stmt_list)
.uleb128 0x17 # (DW_FORM_sec_offset)
.byte 0
.byte 0
.uleb128 0x2 # (abbrev code)
.uleb128 0x3d # (TAG: DW_TAG_imported_unit)
.byte 0 # DW_children_no
.uleb128 0x18 # (DW_AT_import)
.uleb128 0x10 # (DW_FORM_ref_addr)
.byte 0
.byte 0
.uleb128 0x3 # (abbrev code)
.uleb128 0x2e # (TAG: DW_TAG_subprogram)
it's somewhat weird. Even more so since gdb seems to be just happy ...
readelf is happy when not using LTO but -gdwarf-5 though...