[binutils-gdb] [binutils] Handle implicit const in .debug_names

Tom de Vries via Binutils-cvs <[email protected]>
Newsgroups gmane.comp.gnu.binutils.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1678d7d3d2e4cf83cda5a96334a0326573ad0f7c

commit 1678d7d3d2e4cf83cda5a96334a0326573ad0f7c
Author: Tom de Vries <[email protected]>
Date:   Fri May 22 15:11:56 2026 +0200

    [binutils] Handle implicit const in .debug_names
    
    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
    ...

Diff:
---
 binutils/dwarf.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 42386154b49..4720dd717fa 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -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,
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.