[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