I tried to use readelf to read the debug info for gdb test-case
gdb.dwarf2/debug-names-tu-dwarf5.exp, and ran into some trouble reading the
.debug_names section:
...
$ readelf -w debug-names-tu-dwarf5
...
Symbol table:
[ 1] #
eddb6232 _start: <0><1> DW_TAG_subprogram DW_IDX_compile_unit=0
[ 2] #
53a2ae86 struct_with_int_member:readelf: Warning: Unrecognized form: 0
readelf: Error: end of data encountered whilst reading LEB
<0x3><2> DW_TAG_structure_type DW_IDX_type_unit=0 DW_IDX_GNU_language=0 DW_IDX_type_unitreadelf: Warning: Unrecognized form: 0
readelf: Error: end of data encountered whilst reading LEB
...
The .debug_names abbreviation table contains a DW_FORM_implicit_const entry:
...
.uleb128 0x2003 /* DW_IDX_GNU_language */
.uleb128 0x21 /* DW_FORM_implicit_const */
.sleb128 0x0002 /* DW_FORM_implicit_const value: DW_LANG_C */
...
and readelf doesn't support this.
Add support for DW_FORM_implicit_const in display_debug_names, such that we
get the expected:
...
Symbol table:
[ 1] #
eddb6232 _start: <0><1> DW_TAG_subprogram DW_IDX_compile_unit=0
[ 2] #
53a2ae86 struct_with_int_member: <0x3><2> DW_TAG_structure_type \
DW_IDX_type_unit=0 DW_IDX_GNU_language=2
...
READ_ULEB (form, abbrevptr, abbrev_table_end);
if (xindex == 0 && form == 0)
break;
+
+ if (form == DW_FORM_implicit_const)
+ {
+ int64_t implicit_const;
+ READ_SLEB (implicit_const, abbrevptr, abbrev_table_end);
+ }
}
}
if (tagno >= 0)
printf (" %s", get_IDX_name (xindex));
- entryptr = read_and_display_attr_value (0, form, 0,
+
+ int64_t implicit_const = 0;
+ if (form == DW_FORM_implicit_const)
+ READ_SLEB (implicit_const, abbrevptr, abbrev_table_end);
+
+ entryptr = read_and_display_attr_value (0, form, implicit_const,
unit_start, entryptr,
unit_end, 0,
offset_size,