aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2024-05-15 09:45:55 +0200
committerTom de Vries <tdevries@suse.de>2024-05-15 09:45:55 +0200
commite548840a038fd6e6bb37a3fb0a14fe4a4ad8ada6 (patch)
tree285c51997321bcdf92be6901dbde5ae342e0e8d9
parent7e4f1f4bc7ffe26524a6eb0685bd22863cdfde1e (diff)
downloadbinutils-e548840a038fd6e6bb37a3fb0a14fe4a4ad8ada6.zip
binutils-e548840a038fd6e6bb37a3fb0a14fe4a4ad8ada6.tar.gz
binutils-e548840a038fd6e6bb37a3fb0a14fe4a4ad8ada6.tar.bz2
[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
-rw-r--r--binutils/dwarf.c14
-rw-r--r--binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.d11
-rw-r--r--binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.s7
3 files changed, 27 insertions, 5 deletions
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 8125c64..d375148 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 23581e7..2f41f23 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 108f260..1f16f45 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. */