[readelf] Handle unknown name of main in .gdb_index section
authorTom de Vries <tdevries@suse.de>
Tue, 24 Oct 2023 10:35:08 +0000 (12:35 +0200)
committerTom de Vries <tdevries@suse.de>
Tue, 24 Oct 2023 10:35:08 +0000 (12:35 +0200)
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.

Approved-By: Jan Beulich <jbeulich@suse.com>
binutils/ChangeLog
binutils/dwarf.c

index ecd2154a685cc72df370491120719225bf6a54eb..5833ec048e9a66cd66edbd4d7e1c3fca8a2ae85d 100644 (file)
@@ -1,3 +1,7 @@
+2023-10-24  Tom de Vries  <tdevries@suse.de>
+
+       * dwarf.c (display_gdb_index): Handle unknown name of main.
+
 2023-10-10  Tom de Vries  <tdevries@suse.de>
 
        * dwarf.c (display_lang): New function, factored out of ...
index 584c737b9ecc6f5d3da3fbfbe90b395457b1d607..544ba6dff50e967be5316fbfe7cb2a35da479aa3 100644 (file)
@@ -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;