mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 19:09:31 +08:00
[binutils] Fix printing of .debug_str_offsets
With exec: ... $ clang -gdwarf-5 ./src/gdb/testsuite/gdb.dwarf2/fission-mix*.c ... we have: ... $ readelf -w a.out ... Contents of the .debug_str_offsets section: Length: 0x24 Version: 0x5 Index Offset [String] 0 1d0 clang version 10.0.1 1 1e6 src/gdb/testsuite/gdb.dwarf2/fission-mix-2.c 2 213 /home/vries/gdb_versions/devel 3 232 bar 4 236 x 5 61 int 6 238 s 7 23a func2 8 2c ild/BUILD/glibc-2.26/csu 9 5 sdeps/x86_64/start.S 10 1d0 clang version 10.0.1 11 240 src/gdb/testsuite/gdb.dwarf2/fission-mix.c 12 213 /home/vries/gdb_versions/devel 13 26b foo 14 236 x 15 61 int 16 238 s 17 26f func 18 274 main 19 279 arg ... The section consists of two parts, one for each CU, each with a header, but the printing only reads the first header as a header, and prints the second header as: ... 8 2c ild/BUILD/glibc-2.26/csu 9 5 sdeps/x86_64/start.S ... Fix this in display_debug_str_offsets such that we have: ... 6 238 s 7 23a func2 Length: 0x2c Version: 0x5 Index Offset [String] 0 1d0 clang version 10.0.1 1 240 src/gdb/testsuite/gdb.dwarf2/fission-mix.c ... binutils/ChangeLog: 2021-02-12 Tom de Vries <tdevries@suse.de> * dwarf.c (display_debug_str_offsets): Handle multiple sets of entries.
This commit is contained in:
@ -1,3 +1,8 @@
|
||||
2021-02-12 Tom de Vries <tdevries@suse.de>
|
||||
|
||||
* dwarf.c (display_debug_str_offsets): Handle multiple sets of
|
||||
entries.
|
||||
|
||||
2021-02-12 Tom de Vries <tdevries@suse.de>
|
||||
|
||||
* dwarf.c (process_debug_info): Print DWO ID.
|
||||
|
@ -7379,18 +7379,22 @@ display_debug_str_offsets (struct dwarf_section *section,
|
||||
else
|
||||
entry_length = 4;
|
||||
|
||||
unsigned char *entries_end;
|
||||
if (length == 0)
|
||||
{
|
||||
/* This is probably an old style .debug_str_offset section which
|
||||
just contains offsets and no header (and the first offset is 0). */
|
||||
length = section->size;
|
||||
curr = section->start;
|
||||
entries_end = end;
|
||||
|
||||
printf (_(" Length: %#lx\n"), (unsigned long) length);
|
||||
printf (_(" Index Offset [String]\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
entries_end = curr + length;
|
||||
|
||||
int version;
|
||||
SAFE_BYTE_GET_AND_INC (version, curr, 2, end);
|
||||
if (version != 5)
|
||||
@ -7406,11 +7410,15 @@ display_debug_str_offsets (struct dwarf_section *section,
|
||||
printf (_(" Index Offset [String]\n"));
|
||||
}
|
||||
|
||||
for (idx = 0; length >= entry_length && curr < end; idx++)
|
||||
for (idx = 0; curr < entries_end; idx++)
|
||||
{
|
||||
dwarf_vma offset;
|
||||
const unsigned char * string;
|
||||
|
||||
if (curr + entry_length > entries_end)
|
||||
/* Not enough space to read one entry_length, give up. */
|
||||
return 0;
|
||||
|
||||
SAFE_BYTE_GET_AND_INC (offset, curr, entry_length, end);
|
||||
if (dwo)
|
||||
string = (const unsigned char *)
|
||||
|
Reference in New Issue
Block a user