diff options
author | Tom de Vries <tdevries@suse.de> | 2024-05-15 09:45:55 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2024-05-15 09:45:55 +0200 |
commit | e548840a038fd6e6bb37a3fb0a14fe4a4ad8ada6 (patch) | |
tree | 285c51997321bcdf92be6901dbde5ae342e0e8d9 | |
parent | 7e4f1f4bc7ffe26524a6eb0685bd22863cdfde1e (diff) | |
download | binutils-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.c | 14 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/readelf-debug-str-offsets-dw4.d | 11 | ||||
-rw-r--r-- | binutils/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 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. */ |