Add 0006-pr32157-handle-dwarf5-DW_UT_type-unit-type-2.patch

Related: #RHEL-86686
This commit is contained in:
Martin Cermak 2025-04-17 15:04:22 +02:00
parent c3cf993cd3
commit 16bac5cf5e
2 changed files with 119 additions and 1 deletions

View File

@ -0,0 +1,114 @@
commit a359559d4a7696a415cfec5f924363d26cb9a4eb
Author: Mark Wielaard <mark@klomp.org>
Date: Sat Sep 28 23:39:29 2024 +0200
debugedit: Handle DWARF5 DW_UT_type (Unit type 2) in ET_EXE/DYN
Handle DW_UT_type as if it is a DW_UT_compile unit by skipping the
type id and offset in the header. Which are the only differences with
DW_UT_compile. And the id and offset don't need to be rewritten. This
doesn't handle debug types in objects or partial linked (ET_REL) files
that contain COMDAT sections (because debugedit doesn't handle more
than one debug_info section). Add a testcase for foobarbaz.exe.
https://sourceware.org/bugzilla/show_bug.cgi?id=32157
Signed-off-by: Mark Wielaard <mark@klomp.org>
diff --git a/tests/debugedit.at b/tests/debugedit.at
index 9432e30..55f9b54 100644
--- a/tests/debugedit.at
+++ b/tests/debugedit.at
@@ -510,9 +510,9 @@ AT_CLEANUP
# ===
# Make sure -fdebug-types-section has updated strings in executable.
-# Currently only works with DWARF4
+# DWARF4
# ===
-AT_SETUP([debugedit .debug_types exe])
+AT_SETUP([debugedit .debug_types exe DWARF4])
AT_KEYWORDS([debugtypes] [debugedit])
DEBUGEDIT_SETUP([-fdebug-types-section -gdwarf-4])
@@ -537,6 +537,37 @@ readelf --debug-dump=info ./foobarbaz.exe \
AT_CLEANUP
+# ===
+# Make sure -fdebug-types-section has updated strings in executable.
+# DWARF5
+# ===
+AT_SETUP([debugedit .debug_types exe DWARF5])
+AT_KEYWORDS([debugtypes] [debugedit])
+DEBUGEDIT_SETUP([-fdebug-types-section -gdwarf-5])
+AT_SKIP_IF([test "$GDWARF_5_FLAG" = "no"])
+AT_SKIP_IF([! $READELF --debug-dump=info ./foobarbaz.exe | grep -F -q 'DW_TAG_type_unit'])
+
+AT_DATA([expout],
+[st1
+stb
+stf
+stringp1
+stringp_bar
+stringp_baz
+stringp_foo
+stz
+])
+
+AT_CHECK([[debugedit -b $(pwd) -d /foo/bar/baz ./foobarbaz.exe]])
+AT_CHECK([[
+$READELF --debug-dump=info ./foobarbaz.exe \
+ | awk '/Abbrev Number:.*DW_TAG_type_unit/{p=1}{if(p)print}/^$/{p=0}' \
+ | sed -n 's/^.*> *DW_AT_name *:.* \(stringp[^ ]*\|st.\)$/\1/p' \
+ | sort
+]],[0],[expout])
+
+AT_CLEANUP
+
# foo.o and bar.o are build with relative paths and so will use the
# comp_dir (from .debug_info). But bar.o is build from sources with
# an absolute path, so the .debug_line Directory Table should contain
diff --git a/tools/debugedit.c b/tools/debugedit.c
index 64be05c..939db62 100644
--- a/tools/debugedit.c
+++ b/tools/debugedit.c
@@ -2602,10 +2602,13 @@ edit_info (DSO *dso, int phase, struct debug_section *sec)
int cu_ptr_size = 0;
+ uint8_t unit_type = DW_UT_compile;
if (cu_version >= 5)
{
- uint8_t unit_type = read_8 (ptr);
- if (unit_type != DW_UT_compile && unit_type != DW_UT_partial)
+ unit_type = read_8 (ptr);
+ if (unit_type != DW_UT_compile
+ && unit_type != DW_UT_partial
+ && unit_type != DW_UT_type)
{
error (0, 0, "%s: Unit type %u unhandled", dso->filename,
unit_type);
@@ -2615,7 +2618,12 @@ edit_info (DSO *dso, int phase, struct debug_section *sec)
cu_ptr_size = read_8 (ptr);
}
- unsigned char *header_end = (cu_start + 23 + (cu_version < 5 ? 0 : 1));
+ unsigned char *header_end = (cu_start + 23
+ + (cu_version < 5
+ ? 0
+ : (unit_type != DW_UT_type
+ ? 1 /* unit */
+ : 1 + 8 + 4))); /* unit, id, off */
if (header_end > endsec)
{
error (0, 0, "%s: %s CU header too small", dso->filename, sec->name);
@@ -2653,7 +2661,7 @@ edit_info (DSO *dso, int phase, struct debug_section *sec)
return 1;
}
- if (sec != &debug_sections[DEBUG_INFO])
+ if (sec != &debug_sections[DEBUG_INFO] || unit_type == DW_UT_type)
ptr += 12; /* Skip type_signature and type_offset. */
abbrev = read_abbrev (dso,

View File

@ -1,6 +1,6 @@
Name: debugedit
Version: 5.0
Release: 9%{?dist}
Release: 10%{?dist}
Summary: Tools for debuginfo creation
License: GPLv3+ and GPLv2+ and LGPLv2+
URL: https://sourceware.org/debugedit/
@ -47,6 +47,7 @@ Patch6: 0005-writable.patch
patch7: 0001-debug_str_offsets-header-version-and-padding-are-2-b.patch
patch8: 0001-debugedit-Handle-unused-.debug_str_offsets-entries.patch
Patch9: 0001-find-debuginfo-Fix-skip_mini-.gnu_debugdata-handling.patch
Patch10: 0006-pr32157-handle-dwarf5-DW_UT_type-unit-type-2.patch
%description
The debugedit project provides programs and scripts for creating
@ -90,6 +91,9 @@ make check %{?_smp_mflags}
%{_mandir}/man1/find-debuginfo.1*
%changelog
* Thu Apr 17 2025 Martin Cermak <mcermak@redhat.com> - 5.0-10
- Add 0006-pr32157-handle-dwarf5-DW_UT_type-unit-type-2.patch
* Tue Apr 15 2025 Mark Wielaard <mjw@redhat.com> - 5.0-9
- Add 0001-find-debuginfo-Fix-skip_mini-.gnu_debugdata-handling.patch