[binutils-gdb] [binutils] Fix printing of .debug_str_offsets
Tom de Vries
vries@sourceware.org
Fri Feb 12 03:43:12 GMT 2021
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=95abb3944c6a97aeddfe91ef09405cf0b9e8142b
commit 95abb3944c6a97aeddfe91ef09405cf0b9e8142b
Author: Tom de Vries <tdevries@suse.de>
Date: Fri Feb 12 04:43:03 2021 +0100
[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.
Diff:
---
binutils/ChangeLog | 5 +++++
binutils/dwarf.c | 10 +++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 3b638c0d90f..cd6b573ef76 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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.
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index c96613f37e6..e55a7daa8fe 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -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 *)
More information about the Binutils-cvs
mailing list