diff options
author | Tom de Vries <tdevries@suse.de> | 2023-10-24 12:35:08 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2023-10-24 12:35:08 +0200 |
commit | 07a9e709114151550177c45dbdc04641dc547189 (patch) | |
tree | 7214d88cbfcb3f2d655614b6de5610840fa4c819 /binutils | |
parent | f87cf663af71e5d78c8d647fa48562102f3b0615 (diff) | |
download | gdb-07a9e709114151550177c45dbdc04641dc547189.zip gdb-07a9e709114151550177c45dbdc04641dc547189.tar.gz gdb-07a9e709114151550177c45dbdc04641dc547189.tar.bz2 |
[readelf] Handle unknown name of main in .gdb_index section
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>
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 4 | ||||
-rw-r--r-- | binutils/dwarf.c | 19 |
2 files changed, 16 insertions, 7 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index ecd2154..5833ec0 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -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 ... diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 584c737..544ba6d 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; |