aboutsummaryrefslogtreecommitdiff
path: root/binutils/dwarf.c
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2021-02-09 14:27:28 +0100
committerTom de Vries <tdevries@suse.de>2021-02-09 14:27:28 +0100
commit9b87f84a3513c852eca395e3aa47081ef2f12e60 (patch)
tree9b9a922e6b0b01cd8bfb7cfba84109ef4edcac3a /binutils/dwarf.c
parenta57d17732eba20c7ebeaabd023e2f0816fb095f6 (diff)
downloadgdb-9b87f84a3513c852eca395e3aa47081ef2f12e60.zip
gdb-9b87f84a3513c852eca395e3aa47081ef2f12e60.tar.gz
gdb-9b87f84a3513c852eca395e3aa47081ef2f12e60.tar.bz2
[binutils] Handle DW_UT_skeleton/split_compile in process_debug_info
With this exec: ... $ gcc -gsplit-dwarf hello.c -gdwarf-5 ... we run into: ... $ readelf -w a.out > READELF readelf: Warning: CU at offset c7 contains corrupt or unsupported unit type: 4. readelf: Warning: CU at offset c7 contains corrupt or unsupported unit type: 4. ... Fix this by handling DW_UT_skeleton and DW_UT_split_compile in process_debug_info. Note that this just adds the parsing of DWO_id, but not yet any printing of it. Tested on x86_64-linux. binutils/ChangeLog: 2021-02-09 Tom de Vries <tdevries@suse.de> PR binutils/27386 * dwarf.c (process_debug_info): Handling DW_UT_skeleton and DW_UT_split_compile.
Diffstat (limited to 'binutils/dwarf.c')
-rw-r--r--binutils/dwarf.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 19475e6..6797dd1 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -3581,6 +3581,13 @@ process_debug_info (struct dwarf_section * section,
SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
+ if (compunit.cu_unit_type == DW_UT_split_compile
+ || compunit.cu_unit_type == DW_UT_skeleton)
+ {
+ uint64_t dwo_id;
+ SAFE_BYTE_GET_AND_INC (dwo_id, hdrptr, 8, end);
+ }
+
if (this_set == NULL)
{
abbrev_base = 0;
@@ -3684,6 +3691,13 @@ process_debug_info (struct dwarf_section * section,
if (compunit.cu_version < 5)
SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
+ if (compunit.cu_unit_type == DW_UT_split_compile
+ || compunit.cu_unit_type == DW_UT_skeleton)
+ {
+ uint64_t dwo_id;
+ SAFE_BYTE_GET_AND_INC (dwo_id, hdrptr, 8, end);
+ }
+
/* PR 17512: file: 001-108546-0.001:0.1. */
if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8)
{
@@ -3800,7 +3814,9 @@ process_debug_info (struct dwarf_section * section,
if (compunit.cu_unit_type != DW_UT_compile
&& compunit.cu_unit_type != DW_UT_partial
- && compunit.cu_unit_type != DW_UT_type)
+ && compunit.cu_unit_type != DW_UT_type
+ && compunit.cu_unit_type != DW_UT_split_compile
+ && compunit.cu_unit_type != DW_UT_skeleton)
{
warn (_("CU at offset %s contains corrupt or "
"unsupported unit type: %d.\n"),