[binutils-gdb] [binutils/readelf] Fix handling of DW_MACRO_define_strx in dwo file

Tom de Vries vries@sourceware.org
Wed May 15 07:45:08 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e548840a038fd6e6bb37a3fb0a14fe4a4ad8ada6

commit e548840a038fd6e6bb37a3fb0a14fe4a4ad8ada6
Author: Tom de Vries <tdevries@suse.de>
Date:   Wed May 15 09:45:55 2024 +0200

    [binutils/readelf] Fix handling of DW_MACRO_define_strx in dwo file
    
    When printing a DW_MACRO_define_strx entry in a .debug_macro.dwo section, we
    run into:
    ...
     DW_MACRO_define_strx lineno : 0 macro : <no .debug_str_offsets section>
    ...
    
    Fix this in display_debug_macro by passing the correct dwo argument to a
    fetch_indexed_string call.
    
    That works fine for readelf -w, with with readelf -wm we have:
    ...
     DW_MACRO_define_strx lineno : 0 macro : <no .debug_str_offsets.dwo section>
    ...
    
    Fix this in display_debug_macro by doing load_debug_section_with_follow for
    str_dwo / str_index_dwo sections instead of str / str_index sections when
    handling .debug_macro.dwo.
    
    PR 31735

Diff:
---
 binutils/dwarf.c                                           | 14 +++++++++++---
 .../testsuite/binutils-all/readelf-debug-str-offsets-dw4.d | 11 +++++++++--
 .../testsuite/binutils-all/readelf-debug-str-offsets-dw4.s |  7 +++++++
 3 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 8125c64e1b6..d375148dc26 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -6293,9 +6293,17 @@ display_debug_macro (struct dwarf_section *section,
   if (suffix && strcmp (suffix, ".dwo") == 0)
     is_dwo = true;
 
-  load_debug_section_with_follow (str, file);
+  if (is_dwo)
+    {
+      load_debug_section_with_follow (str_dwo, file);
+      load_debug_section_with_follow (str_index_dwo, file);
+    }
+  else
+    {
+      load_debug_section_with_follow (str, file);
+      load_debug_section_with_follow (str_index, file);
+    }
   load_debug_section_with_follow (line, file);
-  load_debug_section_with_follow (str_index, file);
 
   introduce (section, false);
 
@@ -6504,7 +6512,7 @@ display_debug_macro (struct dwarf_section *section,
 	      READ_ULEB (lineno, curr, end);
 	      READ_ULEB (offset, curr, end);
 	      string = (const unsigned char *)
-		fetch_indexed_string (offset, NULL, offset_size, false, 0);
+		fetch_indexed_string (offset, NULL, offset_size, is_dwo, 0);
 	      if (op == DW_MACRO_define_strx)
 		printf (" DW_MACRO_define_strx ");
 	      else
diff --git a/binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.d b/binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.d
index 23581e70f3e..2f41f2331f2 100644
--- a/binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.d
+++ b/binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.d
@@ -1,6 +1,6 @@
-#name: readelf -ws readelf-debug-str-offsets-dw4
+#name: readelf -wsm readelf-debug-str-offsets-dw4
 #source: readelf-debug-str-offsets-dw4.s
-#readelf: -ws
+#readelf: -wsm
 
 Contents of the .debug_str.dwo section:
 
@@ -12,3 +12,10 @@ Contents of the .debug_str_offsets.dwo section:
        Index   Offset \[String\]
            0 00000000  FIRST
            1 00000006  SECOND
+Contents of the .debug_macro.dwo section:
+
+  Offset:                      0
+  Version:                     4
+  Offset size:                 4
+
+ DW_MACRO_define_strx lineno : 0 macro : FIRST
diff --git a/binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.s b/binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.s
index 108f260cb66..1f16f4571e3 100644
--- a/binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.s
+++ b/binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.s
@@ -4,3 +4,10 @@
 	.section	.debug_str_offsets.dwo,"MS",%progbits,1
 	.4byte 0
 	.4byte 6
+	.section        .debug_macro.dwo,"e",%progbits
+	.2byte  0x4     /* DWARF macro version number.  */
+	.byte   0x0     /* Flags: 32-bit dwarf.  */
+	.byte   0xb     /* Define macro strx.  */
+	.uleb128 0      /* At line number 0.  */
+	.uleb128 0x0    /* .debug_str_offsets.dwo entry 0.  */
+	.byte   0       /* End compilation unit.  */


More information about the Binutils-cvs mailing list