[PATCH 3/3] [binutils/readelf] Fix handling of DW_MACRO_define_strx in dwo file

Tom de Vries tdevries@suse.de
Tue May 14 10:55:22 GMT 2024


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
---
 binutils/dwarf.c                                   | 14 +++++++++++---
 .../binutils-all/readelf-debug-str-offsets-dw4.d   | 11 +++++++++--
 .../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 f49989dc536..cdf73a7bc50 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 68f64dde234..c28750bbe24 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.  */
-- 
2.35.3



More information about the Binutils mailing list