]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[binutils/readelf] Fix handling of DW_MACRO_define_strx in dwo file
authorTom de Vries <tdevries@suse.de>
Wed, 15 May 2024 07:45:55 +0000 (09:45 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 15 May 2024 07:45:55 +0000 (09:45 +0200)
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
binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.d
binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.s

index 8125c64e1b6665fd27b685d4032dd5f595eb17b0..d375148dc26c2dc9714c0aaee43b75866c1911ff 100644 (file)
@@ -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
index 23581e70f3eb52eff7a73ef46cdd5eb33d45b17c..2f41f2331f24f79a73b2a068d1048595d7437209 100644 (file)
@@ -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
index 108f260cb66e0fcd0f3c716c10ae1666e240431d..1f16f4571e30401ccc9d645e4ec3bdb6f7d6e80d 100644 (file)
@@ -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.  */