[PATCH] [readelf] Handle unknown name of main in .gdb_index section

Tom de Vries tdevries@suse.de
Tue Oct 24 08:01:32 GMT 2023


When compiling hello world and adding a v9 .gdb-index section:
...
$ gcc -g hello.c
$ gdb-add-index a.out
...
readelf shows it as:
...
Shortcut table:
Language of main: unknown: 0
Name of main: ^A
...

The documentation of gdb says about the "Name of main" that:
...
This value must be ignored if the value for the language of main is zero.
...

Implement this approach in display_gdb_index, such that we have instead:
...
Shortcut table:
Language of main: unknown: 0
Name of main: <unknown>
...

Tested on x86_64-linux.
---
 binutils/dwarf.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 584c737b9ec..544ba6dff50 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -10949,16 +10949,21 @@ display_gdb_index (struct dwarf_section *section,
       display_lang (lang);
       printf ("\n");
 
-      uint32_t name_offset = byte_get_little_endian (shortcut_table + 4, 4);
       printf (_("Name of main: "));
-      if (name_offset >= section->size - constant_pool_offset)
+      if (lang == 0)
+	printf (_("<unknown>\n"));
+      else
 	{
-	  printf (_("<corrupt offset: %x>\n"), name_offset);
-	  warn (_("Corrupt name offset of 0x%x found for name of main\n"),
-		name_offset);
+	  uint32_t name_offset = byte_get_little_endian (shortcut_table + 4, 4);
+	  if (name_offset >= section->size - constant_pool_offset)
+	    {
+	      printf (_("<corrupt offset: %x>\n"), name_offset);
+	      warn (_("Corrupt name offset of 0x%x found for name of main\n"),
+		    name_offset);
+	    }
+	  else
+	    printf ("%s\n", constant_pool + name_offset);
 	}
-      else
-	printf ("%s\n", constant_pool + name_offset);
     }
 
   return 1;

base-commit: 8bf3b48f72728208ad09989edfac9e010a62a703
-- 
2.35.3



More information about the Binutils mailing list