]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[binutils] Handle implicit const in .debug_names
authorTom de Vries <tdevries@suse.de>
Fri, 22 May 2026 13:11:56 +0000 (15:11 +0200)
committerTom de Vries <tdevries@suse.de>
Fri, 22 May 2026 13:11:56 +0000 (15:11 +0200)
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
...

binutils/dwarf.c

index 42386154b496b63b98d250cb2c24d14dbf8fb464..4720dd717fadeb8cdce5ebe3bbfceca6761f2e90 100644 (file)
@@ -12132,6 +12132,12 @@ display_debug_names (struct dwarf_section *section, void *file)
              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);
+               }
            }
        }
 
@@ -12222,7 +12228,12 @@ display_debug_names (struct dwarf_section *section, void *file)
 
                  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,