Use the .debug_dwp section in a Dwarf Elf file to find the Dwarf
Package (dwp) file. For now only by file path, because there is no
convention yet for how to resolve the .debug_dwp id.
Add a testcase that uses a not convential dwp file name.
* libdw/libdw_find_split_unit.c (try_dwp_file): Call
dwelf_dwarf_debug_dwp to find a potential dwp file. Use
__libdw_filepath to resolve it. Use TEMP_FAILURE_RETRY to
open it. Use dwarf_begin_type DWARF_T_DWO to create the
Dwarf object.
* tests/testfile-main-split.bz2: New testfile.
* tests/testfile-dwp-main-split.bz2: Likewise.
* tests/Makefile.am (EXTRA_DIST): Add testfile-main-split.bz2
and testfile-dwp-main-split.bz2.
* tests/run-readelf-info-plus.sh: Add testcase with
testfile-main-split and testfile-dwp-main-split.
Signed-off-by: Mark Wielaard <[email protected]>
---
libdw/libdw_find_split_unit.c | 53 +++++++++++++++++++++---------
tests/Makefile.am | 1 +
tests/run-readelf-info-plus.sh | 51 ++++++++++++++++++++++++++++
tests/testfile-dwp-main-split.bz2 | Bin 0 -> 600 bytes
tests/testfile-main-split.bz2 | Bin 0 -> 2645 bytes
5 files changed, 90 insertions(+), 15 deletions(-)
create mode 100644 tests/testfile-dwp-main-split.bz2
create mode 100755 tests/testfile-main-split.bz2
diff --git a/libdw/libdw_find_split_unit.c b/libdw/libdw_find_split_unit.c
index 92a32f10a8c5..3ccf844108ab 100644
--- a/libdw/libdw_find_split_unit.c
+++ b/libdw/libdw_find_split_unit.c
@@ -32,6 +32,7 @@
#include "libdwP.h"
#include "libelfP.h"
+#include "libdwelfP.h"
#include "eu-search.h"
#include <limits.h>
@@ -91,7 +92,27 @@ try_dwp_file (Dwarf_CU *cu)
{
if (cu->dbg->dwp_dwarf == NULL)
{
- if (cu->dbg->elfpath != NULL)
+ uint8_t is_dwp;
+ const char *filename;
+ const uint8_t *dwp_id;
+ int dwp_fd = -1;
+
+ ssize_t idlen = INTUSE(dwelf_dwarf_debug_dwp) (cu->dbg, NULL, &is_dwp,
+ &filename, &dwp_id);
+ if (idlen >= 0 && filename != NULL && is_dwp == 0 && *filename != '\0')
+ {
+ /* XXX we need to set standards where/how to find id based
+ dwp files, including debuginfod support. For now only use
+ the file path. */
+ char *path = __libdw_filepath (cu->dbg->debugdir, NULL, filename);
+ if (path != NULL)
+ {
+ dwp_fd = TEMP_FAILURE_RETRY (open (path, O_RDONLY));
+ free (path);
+ }
+ }
+
+ if (dwp_fd == -1 && cu->dbg->elfpath != NULL)
{
/* The DWARF 5 standard says "the package file is typically placed in
the same directory as the application, and is given the same name
@@ -105,23 +126,25 @@ try_dwp_file (Dwarf_CU *cu)
}
memcpy (dwp_path, cu->dbg->elfpath, elfpath_len);
strcpy (dwp_path + elfpath_len, ".dwp");
- int dwp_fd = open (dwp_path, O_RDONLY);
+ dwp_fd = TEMP_FAILURE_RETRY (open (dwp_path, O_RDONLY));
free (dwp_path);
- if (dwp_fd != -1)
+ }
+
+ if (dwp_fd != -1)
+ {
+ Dwarf *dwp_dwarf = INTUSE(dwarf_begin_type) (dwp_fd, DWARF_C_READ,
+ DWARF_T_DWO);
+ /* There's no way to know whether we got the correct file until
+ we look up the unit, but it should at least be a dwp file. */
+ if (dwp_dwarf != NULL
+ && (dwp_dwarf->sectiondata[IDX_debug_cu_index] != NULL
+ || dwp_dwarf->sectiondata[IDX_debug_tu_index] != NULL))
{
- Dwarf *dwp_dwarf = dwarf_begin (dwp_fd, DWARF_C_READ);
- /* There's no way to know whether we got the correct file until
- we look up the unit, but it should at least be a dwp file. */
- if (dwp_dwarf != NULL
- && (dwp_dwarf->sectiondata[IDX_debug_cu_index] != NULL
- || dwp_dwarf->sectiondata[IDX_debug_tu_index] != NULL))
- {
- cu->dbg->dwp_dwarf = dwp_dwarf;
- cu->dbg->dwp_fd = dwp_fd;
- }
- else
- close (dwp_fd);
+ cu->dbg->dwp_dwarf = dwp_dwarf;
+ cu->dbg->dwp_fd = dwp_fd;
}
+ else
+ close (dwp_fd);
}
if (cu->dbg->dwp_dwarf == NULL)
cu->dbg->dwp_dwarf = (Dwarf *) -1;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2a76d52bdb70..dd16182952a6 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -373,6 +373,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \
run-nm-syms.sh testfilesyms32.bz2 testfilesyms64.bz2 \
run-nm-self.sh run-readelf-self.sh run-readelf-info-plus.sh \
+ testfile-main-split.bz2 testfile-dwp-main-split.bz2 \
run-srcfiles-self.sh \
run-readelf-compressed.sh \
run-readelf-compressed-zstd.sh \
diff --git a/tests/run-readelf-info-plus.sh b/tests/run-readelf-info-plus.sh
index ee1db0213ad9..a26947e1ed97 100755
--- a/tests/run-readelf-info-plus.sh
+++ b/tests/run-readelf-info-plus.sh
@@ -28,4 +28,55 @@ cp testfile-world5.dwo testfile-hello5.dwo
testrun ${abs_top_builddir}/src/readelf --debug-dump=info+
testfile-splitdwarf-5
+# dwp that isn't called testfile-main-split.dwp
+# echo "int main () { return 42; }" > main.c
+# gcc -g -O2 -gsplit-dwarf -o testfile-main-split main.c
+# eu-dwp -e testfile-main-split -o testfile-dwp-main-split
+# rm testfile-main-split-main.dwo
+
+testfiles testfile-main-split testfile-dwp-main-split
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info+
testfile-main-split <<\EOF
+
+DWARF section [28] '.debug_info' at offset 0x22f8:
+ [Offset]
+ Compilation unit at offset 0:
+ Version: 5, Abbreviation section offset: 0, Address size: 8, Offset size: 4
+ Unit type: skeleton (4), Unit id: 0x9a565c0d42a52e75
+ [ 14] skeleton_unit abbrev: 1
+ ranges (sec_offset) range list [ c]
+ low_pc (addr) 000000000000000000
+ stmt_list (sec_offset) 0
+ dwo_name (strp) "testfile-main-split-main.dwo"
+ comp_dir (strp) "/tmp"
+ GNU_pubnames (flag_present) yes
+ addr_base (sec_offset) address base [ 8]
+ Split compilation unit at offset 0:
+ Version: 5, Abbreviation section offset: 0, Address size: 8, Offset size: 4
+ Unit type: split_compile (5), Unit id: 0x9a565c0d42a52e75
+ { 14} compile_unit abbrev: 1
+ producer (strx) "GNU C23 16.1.1 20260515 (Red Hat
16.1.1-2) -mtune=generic -march=x86-64 -mtls-dialect=gnu2 -g -gsplit-dwarf -O2"
+ language (data1) C11 (29)
+ language_name (data1) C (3)
+ language_version (data4) 202311
+ name (strx) "main.c"
+ comp_dir (strx) "/tmp"
+ { 1e} subprogram abbrev: 2
+ external (flag_present) yes
+ name (strx) "main"
+ decl_file (data1) main.c (1)
+ decl_line (data1) 1
+ decl_column (data1) 5
+ prototyped (flag_present) yes
+ type (ref4) { 32}
+ low_pc (addrx) [0] 0x0000000000400360 <main>
+ high_pc (data8) 6 (0x0000000000400366)
+ frame_base (exprloc)
+ [ 0] call_frame_cfa
+ call_all_calls (flag_present) yes
+ { 32} base_type abbrev: 3
+ byte_size (data1) 4
+ encoding (data1) signed (5)
+ name (string) "int"
+EOF
+
exit 0
diff --git a/tests/testfile-dwp-main-split.bz2
b/tests/testfile-dwp-main-split.bz2
new file mode 100644
index
0000000000000000000000000000000000000000..c1da1c3fac9d028637a5c3bfff1c5c9d13c42dd7
GIT binary patch
literal 600
zcmV-e0;l~#T4*^jL0KkKStWD#mjD5jfAjzT|9Vd2|9ju{lT^Rw|J9%YW>pFR5C9PX
z5r9Aet_ZUc1j;gDBh+ms)W|(Spn5}UXblY>pc)2h05tVIO&+JH(X|95)ds;&MpM+x
z)iP<3ra;pK(<4R#WYEBdKm!SaG8_Oj(?9``007Vc0MGyfAOIQ~05L)o^qMp=0000Q
z4FC-^0B8UJGyrH2(MYH`FcMJQK?KHhgWG|?sf9uWL==W4h5}!eN;|aAi1Ftk$k}PA
zj<ztGs!P1A$Am;kH8fQ=HDT`Q?CL~_6l4UXOr!uKg#Z!;VgOg*Fo_WuNEE2aL8xA~
z;iL?701=Q~M)i0odf%f!L7>4-p+{Zn6Q%!iWJ!U9!b(8PlI&FC`vX_9XS3Jw*+Pm6
zw{M`=*aad3MNzM(S=zYGL`6WvzF}gRqrAZ2rXmDemK+s30y99H4By@G@FDk)ze%I2
z@W|X&YolIZG@3RaZ`VER4(slDKFqdBWl0W}6o?>Xz+l)F@P)G`7_FKhSb(ZTtN}S-
zZ|(%VO=;_sRaOQME%JfoZJ8Vp(Jn-TPeN@El9+W-X3`fyi2r6@9LUykSG`6p!}JNS
z))d6h!z~9^e9!~6bo_A%_JqnXMQka=<46o4%@WC>^-k<~kF1AEMR6a1JDm0qL0|<G
zCn3czqYs0GiIfNpz*@IB7i2?K6U-V5W=Iq<5-VaNWYY*PjDu!eE0h%$rGmN*77<rZ
mM8YR-y8761xbBc6c1&TMq;tT*)BJM(i@744C`b~y`^$jTWdZI0
literal 0
HcmV?d00001
diff --git a/tests/testfile-main-split.bz2 b/tests/testfile-main-split.bz2
new file mode 100755
index
0000000000000000000000000000000000000000..457d47c75c382f40c6c1da4dddd572cb672ab9d6
GIT binary patch
literal 2645
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
DH4?6w
literal 0
HcmV?d00001
--
2.55.0