diff --git a/.gitignore b/.gitignore index 141a176..e7431ce 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ /elfutils-0.188.tar.bz2 /elfutils-0.189.tar.bz2 /elfutils-0.190.tar.bz2 +/elfutils-0.191.tar.bz2 diff --git a/elfutils-0.190-fix-core-noncontig.patch b/elfutils-0.190-fix-core-noncontig.patch deleted file mode 100644 index 0f99a7c..0000000 --- a/elfutils-0.190-fix-core-noncontig.patch +++ /dev/null @@ -1,329 +0,0 @@ -From c791d16b7dcf9d985ebe0e852481142753603353 Mon Sep 17 00:00:00 2001 -From: Aaron Merey -Date: Fri, 8 Dec 2023 16:44:35 -0500 -Subject: [PATCH] libdwfl: Correctly handle corefile non-contiguous segments - -It is possible for segments of different shared libaries to be interleaved -in memory such that the segments of one library are located in between -non-contiguous segments of another library. - -For example, this can be seen with firefox on RHEL 7.9 where multiple -shared libraries could be mapped in between ld-2.17.so segments: - - [...] - 7f0972082000-7f09720a4000 00000000 139264 /usr/lib64/ld-2.17.so - 7f09720a4000-7f09720a5000 00000000 4096 /memfd:mozilla-ipc (deleted) - 7f09720a5000-7f09720a7000 00000000 8192 /memfd:mozilla-ipc (deleted) - 7f09720a7000-7f09720a9000 00000000 8192 /memfd:mozilla-ipc (deleted) - 7f0972134000-7f0972136000 00000000 8192 /usr/lib64/firefox/libmozwayland.so - 7f0972136000-7f0972137000 00002000 4096 /usr/lib64/firefox/libmozwayland.so - 7f0972137000-7f0972138000 00003000 4096 /usr/lib64/firefox/libmozwayland.so - 7f0972138000-7f0972139000 00003000 4096 /usr/lib64/firefox/libmozwayland.so - 7f097213a000-7f0972147000 00000000 53248 /usr/lib64/firefox/libmozsqlite3.so - 7f0972147000-7f097221e000 0000d000 880640 /usr/lib64/firefox/libmozsqlite3.so - 7f097221e000-7f0972248000 000e4000 172032 /usr/lib64/firefox/libmozsqlite3.so - 7f0972248000-7f0972249000 0010e000 4096 /usr/lib64/firefox/libmozsqlite3.so - 7f0972249000-7f097224c000 0010e000 12288 /usr/lib64/firefox/libmozsqlite3.so - 7f097224c000-7f0972250000 00111000 16384 /usr/lib64/firefox/libmozsqlite3.so - 7f0972250000-7f0972253000 00000000 12288 /usr/lib64/firefox/liblgpllibs.so - [...] - 7f09722a3000-7f09722a4000 00021000 4096 /usr/lib64/ld-2.17.so - 7f09722a4000-7f09722a5000 00022000 4096 /usr/lib64/ld-2.17.so - -dwfl_segment_report_module did not account for the possibility of -interleaving non-contiguous segments, resulting in premature closure -of modules as well as failing to report modules. - -Fix this by removing segment skipping in dwfl_segment_report_module. -When dwfl_segment_report_module reported a module, it would return -the index of the segment immediately following the end address of the -current module. Since there's a chance that other modules might fall -within this address range, dwfl_segment_report_module instead returns -the index of the next segment. - -This patch also fixes premature module closure that can occur in -dwfl_segment_report_module when interleaving non-contiguous segments -are found. Previously modules with start and end addresses that overlap -with the current segment would have their build-ids compared with the -current segment's build-id. If there was a mismatch, that module would -be closed. Avoid closing modules in this case when mismatching build-ids -correspond to distinct modules. - -https://sourceware.org/bugzilla/show_bug.cgi?id=30975 - -Signed-off-by: Aaron Merey ---- - libdwfl/dwfl_segment_report_module.c | 37 +++++++++---- - tests/Makefile.am | 8 ++- - tests/dwfl-core-noncontig.c | 82 ++++++++++++++++++++++++++++ - tests/run-dwfl-core-noncontig.sh | 63 +++++++++++++++++++++ - 4 files changed, 176 insertions(+), 14 deletions(-) - create mode 100644 tests/dwfl-core-noncontig.c - create mode 100755 tests/run-dwfl-core-noncontig.sh - -diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c -index 3ef62a7..09ee37b 100644 ---- a/libdwfl/dwfl_segment_report_module.c -+++ b/libdwfl/dwfl_segment_report_module.c -@@ -737,17 +737,34 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - && invalid_elf (module->elf, module->disk_file_has_build_id, - &build_id)) - { -- elf_end (module->elf); -- close (module->fd); -- module->elf = NULL; -- module->fd = -1; -+ /* If MODULE's build-id doesn't match the disk file's -+ build-id, close ELF only if MODULE and ELF refer to -+ different builds of files with the same name. This -+ prevents premature closure of the correct ELF in cases -+ where segments of a module are non-contiguous in memory. */ -+ if (name != NULL && module->name[0] != '\0' -+ && strcmp (basename (module->name), basename (name)) == 0) -+ { -+ elf_end (module->elf); -+ close (module->fd); -+ module->elf = NULL; -+ module->fd = -1; -+ } - } -- if (module->elf != NULL) -+ else if (module->elf != NULL) - { -- /* Ignore this found module if it would conflict in address -- space with any already existing module of DWFL. */ -+ /* This module has already been reported. */ - skip_this_module = true; - } -+ else -+ { -+ /* Only report this module if we haven't already done so. */ -+ for (Dwfl_Module *mod = dwfl->modulelist; mod != NULL; -+ mod = mod->next) -+ if (mod->low_addr == module_start -+ && mod->high_addr == module_end) -+ skip_this_module = true; -+ } - } - if (skip_this_module) - goto out; -@@ -781,10 +798,6 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - } - } - -- /* Our return value now says to skip the segments contained -- within the module. */ -- ndx = addr_segndx (dwfl, segment, module_end, true); -- - /* Examine its .dynamic section to get more interesting details. - If it has DT_SONAME, we'll use that as the module name. - If it has a DT_DEBUG, then it's actually a PIE rather than a DSO. -@@ -929,6 +942,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - ndx = -1; - goto out; - } -+ else -+ ndx++; - - /* We have reported the module. Now let the caller decide whether we - should read the whole thing in right now. */ -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 7fb8efb..9f8f769 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -42,7 +42,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \ - dwfl-bug-addr-overflow arls dwfl-bug-fd-leak \ - dwfl-addr-sect dwfl-bug-report early-offscn \ - dwfl-bug-getmodules dwarf-getmacros dwarf-ranges addrcfi \ -- dwarfcfi \ -+ dwfl-core-noncontig dwarfcfi \ - test-flag-nobits dwarf-getstring rerequest_tag \ - alldts typeiter typeiter2 low_high_pc \ - test-elf_cntl_gelf_getshdr dwflsyms dwfllines \ -@@ -212,7 +212,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \ - $(asm_TESTS) run-disasm-bpf.sh run-low_high_pc-dw-form-indirect.sh \ - run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-readelf.sh \ - run-readelf-dw-form-indirect.sh run-strip-largealign.sh \ -- run-readelf-Dd.sh -+ run-readelf-Dd.sh run-dwfl-core-noncontig.sh - - if !BIARCH - export ELFUTILS_DISABLE_BIARCH = 1 -@@ -632,7 +632,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ - run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-readelf.sh \ - testfile_nvidia_linemap.bz2 \ - testfile-largealign.o.bz2 run-strip-largealign.sh \ -- run-funcretval++11.sh -+ run-funcretval++11.sh \ -+ run-dwfl-core-noncontig.sh testcore-noncontig.bz2 - - - if USE_VALGRIND -@@ -738,6 +739,7 @@ dwfl_bug_fd_leak_LDADD = $(libeu) $(libdw) $(libebl) $(libelf) - dwfl_bug_report_LDADD = $(libdw) $(libebl) $(libelf) - dwfl_bug_getmodules_LDADD = $(libeu) $(libdw) $(libebl) $(libelf) - dwfl_addr_sect_LDADD = $(libeu) $(libdw) $(libebl) $(libelf) $(argp_LDADD) -+dwfl_core_noncontig_LDADD = $(libdw) $(libelf) - dwarf_getmacros_LDADD = $(libdw) - dwarf_ranges_LDADD = $(libdw) - dwarf_getstring_LDADD = $(libdw) -diff --git a/tests/dwfl-core-noncontig.c b/tests/dwfl-core-noncontig.c -new file mode 100644 -index 0000000..04558e2 ---- /dev/null -+++ b/tests/dwfl-core-noncontig.c -@@ -0,0 +1,82 @@ -+/* Test program for dwfl_getmodules bug. -+ Copyright (C) 2008 Red Hat, Inc. -+ This file is part of elfutils. -+ -+ This file is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ elfutils is distributed in the hope that it will be useful, but -+ WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include -+#include -+#include -+#include -+#include ELFUTILS_HEADER(dwfl) -+#include ELFUTILS_HEADER(elf) -+ -+static const Dwfl_Callbacks cb = -+{ -+ NULL, -+ NULL, -+ NULL, -+ NULL, -+}; -+ -+int -+main (int argc, char **argv) -+{ -+ assert (argc == 2); -+ -+ Dwfl *dwfl = dwfl_begin (&cb); -+ -+ int fd = open (argv[1], O_RDONLY); -+ assert (fd != -1); -+ -+ Elf *elf = elf_begin (fd, ELF_C_READ, NULL); -+ (void) dwfl_core_file_report (dwfl, elf, argv[0]); -+ -+ /* testcore-noncontig contains a shared library mapped between -+ non-contiguous segments of another shared library: -+ -+ [...] -+ 7f14e458c000-7f14e45ae000 00000000 139264 /usr/lib64/ld-2.17.so (1) -+ 7f14e4795000-7f14e4798000 00000000 12288 /usr/lib64/firefox/liblgpllibs.so (2) -+ 7f14e4798000-7f14e479d000 00003000 20480 /usr/lib64/firefox/liblgpllibs.so -+ 7f14e479d000-7f14e479f000 00008000 8192 /usr/lib64/firefox/liblgpllibs.so -+ 7f14e479f000-7f14e47a0000 00009000 4096 /usr/lib64/firefox/liblgpllibs.so -+ 7f14e47a0000-7f14e47a1000 0000a000 4096 /usr/lib64/firefox/liblgpllibs.so (3) -+ 7f14e47ad000-7f14e47ae000 00021000 4096 /usr/lib64/ld-2.17.so (4) -+ 7f14e47ae000-7f14e47af000 00022000 4096 /usr/lib64/ld-2.17.so */ -+ -+ /* First segment of the non-contiguous module (1). */ -+ int seg = dwfl_addrsegment (dwfl, 0x7f14e458c000, NULL); -+ assert (seg == 32); -+ -+ /* First segment of the module within the non-contiguous module's address -+ range (2). */ -+ seg = dwfl_addrsegment (dwfl, 0x7f14e4795000, NULL); -+ assert (seg == 33); -+ -+ /* Last segment of the module within the non-contiguous module's -+ address range (3). */ -+ seg = dwfl_addrsegment (dwfl, 0x7f14e47a0000, NULL); -+ assert (seg == 37); -+ -+ /* First segment of non-contiguous module following its address space -+ gap (4). */ -+ seg = dwfl_addrsegment (dwfl, 0x7f14e47ad000, NULL); -+ assert (seg == 40); -+ -+ dwfl_end (dwfl); -+ elf_end (elf); -+ -+ return 0; -+} -diff --git a/tests/run-dwfl-core-noncontig.sh b/tests/run-dwfl-core-noncontig.sh -new file mode 100755 -index 0000000..1245b67 ---- /dev/null -+++ b/tests/run-dwfl-core-noncontig.sh -@@ -0,0 +1,63 @@ -+#! /bin/sh -+# Copyright (C) 2023 Red Hat, Inc. -+# This file is part of elfutils. -+# -+# This file is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# elfutils is distributed in the hope that it will be useful, but -+# WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+. $srcdir/test-subr.sh -+ -+# Test whether libdwfl can handle corefiles containing non-contiguous -+# segments where multiple modules are contained within the address -+# space of some other module. -+ -+# testcore-noncontig was generated from the following program with -+# systemd-coredump on RHEL 7.9 Workstation, kernel -+# 3.10.0-1160.105.1.el7.x86_64. liblgpllibs.so was packaged with -+# firefox-115.4.0-1.el7_9.x86_64.rpm. -+ -+# #include -+# #include -+# -+# int main () { -+# dlopen ("/usr/lib64/firefox/liblgpllibs.so", RTLD_GLOBAL | RTLD_NOW); -+# sleep (60); -+# return 0; -+# } -+# -+# gcc -ldl -o test test.c -+ -+tempfiles out -+testfiles testcore-noncontig -+ -+testrun ${abs_builddir}/dwfl-core-noncontig testcore-noncontig -+ -+# Remove parts of the output that could change depending on which -+# libraries are locally installed. -+testrun ${abs_top_builddir}/src/unstrip -n --core testcore-noncontig \ -+ | sed 's/+/ /g' | cut -d " " -f1,3 | sort > out -+ -+testrun_compare cat out <<\EOF -+0x400000 3a1748a544b40a38b3be3d2d13ffa34a2a5a71c0@0x400284 -+0x7f14e357e000 edf51350c7f71496149d064aa8b1441f786df88a@0x7f14e357e1d8 -+0x7f14e3794000 7615604eaf4a068dfae5085444d15c0dee93dfbd@0x7f14e37941d8 -+0x7f14e3a96000 09cfb171310110bc7ea9f4476c9fa044d85baff4@0x7f14e3a96210 -+0x7f14e3d9e000 e10cc8f2b932fc3daeda22f8dac5ebb969524e5b@0x7f14e3d9e248 -+0x7f14e3fba000 fc4fa58e47a5acc137eadb7689bce4357c557a96@0x7f14e3fba280 -+0x7f14e4388000 7f2e9cb0769d7e57bd669b485a74b537b63a57c4@0x7f14e43881d8 -+0x7f14e458c000 62c449974331341bb08dcce3859560a22af1e172@0x7f14e458c1d8 -+0x7f14e4795000 175efdcef445455872a86a6fbee7567ca16a513e@0x7f14e4795248 -+0x7ffcfe59f000 80d79b32785868a2dc10047b39a80d1daec8923d@0x7ffcfe59f328 -+EOF -+ -+exit 0 --- -2.43.0 - diff --git a/elfutils-0.191-profile-empty-urls.patch b/elfutils-0.191-profile-empty-urls.patch new file mode 100644 index 0000000..dab4d9b --- /dev/null +++ b/elfutils-0.191-profile-empty-urls.patch @@ -0,0 +1,96 @@ +commit 0ba2e4aa9945019a8c6db95d27d142b660a63a79 +Author: Mark Wielaard +Date: Tue Mar 26 21:42:39 2024 +0100 + + config: Make sure profile.sh succeeds with set -e and set -o pipefail + + profile.sh might fail with set -o pipefail because: + + cat /dev/null "${prefix}/etc/debuginfod"/*.urls 2>/dev/null | tr '\n' ' ' + + might fail when there isn't an *.urls file the first command in the + pipe fails (the 2>/dev/null is there to hide that failure). + + This can be fixed by adding || : at the end. + + This works because : always succeeds and produces no outpur which is + what the script expects when the command would fail. + + Also add a new testcase that runs profile.sh with bout set -e + and set -o pipefail. + + * config/profile.sh.in: Add || : at end of pipe. + * tests/run-debuginfod-client-profile.sh: New test. + * tests/Makefile.am (TESTS): Add run-debuginfod-client-profile.sh. + (EXTRA_DIST): Likewise. + + https://sourceware.org/bugzilla/show_bug.cgi?id=31562 + + Signed-off-by: Mark Wielaard + +diff --git a/config/profile.sh.in b/config/profile.sh.in +index 3f4397dcb44d..84d3260ddcfc 100644 +--- a/config/profile.sh.in ++++ b/config/profile.sh.in +@@ -6,7 +6,7 @@ + + if [ -z "$DEBUGINFOD_URLS" ]; then + prefix="@prefix@" +- DEBUGINFOD_URLS=$(cat /dev/null "@sysconfdir@/debuginfod"/*.urls 2>/dev/null | tr '\n' ' ') ++ DEBUGINFOD_URLS=$(cat /dev/null "@sysconfdir@/debuginfod"/*.urls 2>/dev/null | tr '\n' ' ' || :) + [ -n "$DEBUGINFOD_URLS" ] && export DEBUGINFOD_URLS || unset DEBUGINFOD_URLS + unset prefix + fi +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 9315ec3bbe4c..344d6706e16e 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -209,6 +209,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \ + run-disasm-riscv64.sh \ + run-pt_gnu_prop-tests.sh \ + run-getphdrnum.sh run-test-includes.sh \ ++ run-debuginfod-client-profile.sh \ + leb128 read_unaligned \ + msg_tst system-elf-libelf-test system-elf-gelf-test \ + $(asm_TESTS) run-disasm-bpf.sh run-low_high_pc-dw-form-indirect.sh \ +@@ -636,6 +637,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ + testfile_pt_gnu_prop.bz2 testfile_pt_gnu_prop32.bz2 \ + run-getphdrnum.sh testfile-phdrs.elf.bz2 \ + run-test-includes.sh run-low_high_pc-dw-form-indirect.sh \ ++ run-debuginfod-client-profile.sh \ + run-readelf-dw-form-indirect.sh testfile-dw-form-indirect.bz2 \ + run-nvidia-extended-linemap-libdw.sh run-nvidia-extended-linemap-readelf.sh \ + testfile_nvidia_linemap.bz2 \ +diff --git a/tests/run-debuginfod-client-profile.sh b/tests/run-debuginfod-client-profile.sh +new file mode 100755 +index 000000000000..7435ced83f15 +--- /dev/null ++++ b/tests/run-debuginfod-client-profile.sh +@@ -0,0 +1,27 @@ ++#! /bin/sh ++# Copyright (C) 2024 Mark J. Wielaard ++# This file is part of elfutils. ++# ++# This file is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# elfutils is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++. $srcdir/test-subr.sh ++ ++# Make sure the profile.sh or profile.d/debuginfod.sh works even with ++# set -e (any command error is an error) and set -o pipefail (any error ++# in a pipe fails the whole pipe command). ++ ++set -e ++set -o pipefail ++ ++source ${abs_top_builddir}/config/profile.sh diff --git a/elfutils-0.191-riscv-flatten.patch b/elfutils-0.191-riscv-flatten.patch new file mode 100644 index 0000000..a96d339 --- /dev/null +++ b/elfutils-0.191-riscv-flatten.patch @@ -0,0 +1,359 @@ +From e39336df6588c3f9853be7d02819aee262ba2121 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Tue, 19 Mar 2024 22:43:10 +0000 +Subject: [PATCH] riscv: Partial implementation of flatten_aggregate + +dwfl_module_return_value_location would fail on riscv for functions +which return a (small) struct. This patch implements the simplest +cases of flatten_aggregate in backends/riscv_retval.c. It just handles +structs containing one or two members of the same base type which fit +completely or in pieces in one or two general or floating point +registers. + +It also adds a specific test case run-funcretval-struct.sh containing +small structs of ints, longs, floats and doubles. All these testscases +now work for riscv. There is already a slightly more extensive +testcase for this in tests/run-funcretval.sh but that only has a +testcase for aarch64. + + * backends/riscv_retval.c (flatten_aggregate_arg): Implement + for the simple cases where we have a struct with one or two + members of the same base type. + (pass_by_flattened_arg): Likewise. Call either + pass_in_gpr_lp64 or pass_in_fpr_lp64d. + (riscv_return_value_location_lp64ifd): Call + flatten_aggregate_arg including size. + * tests/Makefile.am (TESTS): Add run-funcretval-struct.sh + and run-funcretval-struct-native.sh. + (check_PROGRAMS): Add funcretval_test_struct. + (funcretval_test_struct_SOURCES): New. + (EXTRA_DIST): Add run-funcretval-struct.sh, + funcretval_test_struct_riscv.bz2 and + run-funcretval-struct-native.sh. + * tests/funcretval_test_struct_riscv.bz2: New test binary. + * tests/run-funcretval-struct-native.sh: New test. + * tests/run-funcretval-struct.sh: Likewise. + +https://sourceware.org/bugzilla/show_bug.cgi?id=31142 + +Signed-off-by: Mark Wielaard +--- + backends/riscv_retval.c | 123 ++++++++++++++++++++++--- + tests/Makefile.am | 7 ++ + tests/funcretval_test_struct.c | 86 +++++++++++++++++ + tests/funcretval_test_struct_riscv.bz2 | Bin 0 -> 3821 bytes + tests/run-funcretval-struct-native.sh | 22 +++++ + tests/run-funcretval-struct.sh | 35 +++++++ + 6 files changed, 262 insertions(+), 11 deletions(-) + create mode 100644 tests/funcretval_test_struct.c + create mode 100755 tests/funcretval_test_struct_riscv.bz2 + create mode 100755 tests/run-funcretval-struct-native.sh + create mode 100755 tests/run-funcretval-struct.sh + +Fedora NOTE: Both the riscv specific test files weren't included + (funcretval_test_struct_riscv.bz2 and run-funcretval-struct.sh) + Because it contained a binary test. The native test is included + though. + +diff --git a/backends/riscv_retval.c b/backends/riscv_retval.c +index 0a1e02f81cd2..50c451a4ba32 100644 +--- a/backends/riscv_retval.c ++++ b/backends/riscv_retval.c +@@ -1,6 +1,7 @@ + /* Function return value location for Linux/RISC-V ABI. + Copyright (C) 2018 Sifive, Inc. + Copyright (C) 2013 Red Hat, Inc. ++ Copyright (C) 2024 Mark J. Wielaard + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -105,23 +106,123 @@ pass_in_fpr_lp64d (const Dwarf_Op **locp, Dwarf_Word size) + return size <= 8 ? 1 : 4; + } + ++/* Checks if we can "flatten" the given type, Only handles the simple ++ cases where we have a struct with one or two the same base type ++ elements. */ + static int +-flatten_aggregate_arg (Dwarf_Die *typedie __attribute__ ((unused)), +- Dwarf_Die *arg0 __attribute__ ((unused)), +- Dwarf_Die *arg1 __attribute__ ((unused))) ++flatten_aggregate_arg (Dwarf_Die *typedie, ++ Dwarf_Word size, ++ Dwarf_Die *arg0, ++ Dwarf_Die *arg1) + { +- /* ??? */ ++ int tag0, tag1; ++ Dwarf_Die member; ++ Dwarf_Word encoding0, encoding1; ++ Dwarf_Attribute attr; ++ Dwarf_Word size0, size1; ++ ++ if (size < 8 || size > 16) ++ return 0; ++ ++ if (dwarf_child (typedie, arg0) != 0) ++ return 0; ++ ++ tag0 = dwarf_tag (arg0); ++ while (tag0 != -1 && tag0 != DW_TAG_member) ++ { ++ if (dwarf_siblingof (arg0, arg0) != 0) ++ return 0; ++ tag0 = dwarf_tag (arg0); ++ } ++ ++ if (tag0 != DW_TAG_member) ++ return 0; ++ ++ /* Remember where we are. */ ++ member = *arg0; ++ ++ tag0 = dwarf_peeled_die_type (arg0, arg0); ++ if (tag0 != DW_TAG_base_type) ++ return 0; ++ ++ if (dwarf_attr_integrate (arg0, DW_AT_encoding, &attr) == NULL ++ || dwarf_formudata (&attr, &encoding0) != 0) ++ return 0; ++ ++ if (dwarf_bytesize_aux (arg0, &size0) != 0) ++ return 0; ++ ++ if (size == size0) ++ return 1; /* This one member is the whole size. */ ++ ++ if (size != 2 * size0) ++ return 0; /* We only handle two of the same. */ ++ ++ /* Look for another member with the same encoding. */ ++ if (dwarf_siblingof (&member, arg1) != 0) ++ return 0; ++ ++ tag1 = dwarf_tag (arg1); ++ while (tag1 != -1 && tag1 != DW_TAG_member) ++ { ++ if (dwarf_siblingof (arg1, arg1) != 0) ++ return 0; ++ tag1 = dwarf_tag (arg1); ++ } ++ ++ if (tag1 != DW_TAG_member) ++ return 0; ++ ++ tag1 = dwarf_peeled_die_type (arg1, arg1); ++ if (tag1 != DW_TAG_base_type) ++ return 0; /* We can only handle two equal base types for now. */ ++ ++ if (dwarf_attr_integrate (arg1, DW_AT_encoding, &attr) == NULL ++ || dwarf_formudata (&attr, &encoding1) != 0 ++ || encoding0 != encoding1) ++ return 0; /* We can only handle two of the same for now. */ ++ ++ if (dwarf_bytesize_aux (arg1, &size1) != 0) ++ return 0; ++ ++ if (size0 != size1) ++ return 0; /* We can only handle two of the same for now. */ ++ + return 1; + } + ++/* arg0 and arg1 should be the peeled die types found by ++ flatten_aggregate_arg. */ + static int +-pass_by_flattened_arg (const Dwarf_Op **locp __attribute__ ((unused)), +- Dwarf_Word size __attribute__ ((unused)), +- Dwarf_Die *arg0 __attribute__ ((unused)), +- Dwarf_Die *arg1 __attribute__ ((unused))) ++pass_by_flattened_arg (const Dwarf_Op **locp, ++ Dwarf_Word size, ++ Dwarf_Die *arg0, ++ Dwarf_Die *arg1 __attribute__((unused))) + { +- /* ??? */ +- return -2; ++ /* For now we just assume arg0 and arg1 are the same type and ++ encoding. */ ++ Dwarf_Word encoding; ++ Dwarf_Attribute attr; ++ ++ if (dwarf_attr_integrate (arg0, DW_AT_encoding, &attr) == NULL ++ || dwarf_formudata (&attr, &encoding) != 0) ++ return -1; ++ ++ switch (encoding) ++ { ++ case DW_ATE_boolean: ++ case DW_ATE_signed: ++ case DW_ATE_unsigned: ++ case DW_ATE_unsigned_char: ++ case DW_ATE_signed_char: ++ return pass_in_gpr_lp64 (locp, size); ++ ++ case DW_ATE_float: ++ return pass_in_fpr_lp64d (locp, size); ++ ++ default: ++ return -1; ++ } + } + + int +@@ -158,7 +259,7 @@ riscv_return_value_location_lp64ifd (int fp, Dwarf_Die *functypedie, + provided the floating-point real is no more than FLEN bits wide and + the integer is no more than XLEN bits wide. */ + if (tag == DW_TAG_structure_type +- && flatten_aggregate_arg (&typedie, &arg0, &arg1)) ++ && flatten_aggregate_arg (&typedie, size, &arg0, &arg1)) + return pass_by_flattened_arg (locp, size, &arg0, &arg1); + /* Aggregates larger than 2*XLEN bits are passed by reference. */ + else if (size > 16) +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 9141074fe44c..9315ec3bbe4c 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -284,6 +285,10 @@ funcretval_test__11_SOURCES = funcretval_test++11.cxx + TESTS += run-funcretval++11.sh + endif + ++check_PROGRAMS += funcretval_test_struct ++funcretval_test_struct_SOURCES = funcretval_test_struct.c ++TESTS += run-funcretval-struct-native.sh ++ + EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ + run-ar-N.sh \ + run-show-die-info.sh run-get-files.sh run-get-lines.sh \ +@@ -635,6 +641,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ + testfile_nvidia_linemap.bz2 \ + testfile-largealign.o.bz2 run-strip-largealign.sh \ + run-funcretval++11.sh \ ++ run-funcretval-struct-native.sh \ + test-ar-duplicates.a.bz2 \ + run-dwfl-core-noncontig.sh testcore-noncontig.bz2 \ + testfile-dwarf5-line-clang.bz2 \ +diff --git a/tests/funcretval_test_struct.c b/tests/funcretval_test_struct.c +new file mode 100644 +index 000000000000..df94bde0a42d +--- /dev/null ++++ b/tests/funcretval_test_struct.c +@@ -0,0 +1,86 @@ ++/* Copyright (C) 2024 Mark J. Wielaard ++ This file is part of elfutils. ++ ++ This file is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++typedef struct ++ { ++ int q; ++ int r; ++ } div_t; ++ ++typedef struct ++ { ++ long q; ++ long r; ++ } ldiv_t; ++ ++typedef struct ++ { ++ float x; ++ float y; ++ } point_t; ++ ++typedef struct ++ { ++ double x; ++ double y; ++ } dpoint_t; ++ ++div_t __attribute__((__noinline__)) ++div (int n, int d) ++{ ++ div_t r; ++ r.q = n / d; ++ r.r = n % d; ++ return r; ++} ++ ++ldiv_t __attribute__((__noinline__)) ++ldiv (long n, long d) ++{ ++ ldiv_t r; ++ r.q = n / d; ++ r.r = n % d; ++ return r; ++} ++ ++point_t __attribute__((__noinline__)) ++mkpt (float x, float y) ++{ ++ point_t r; ++ r.x = x; ++ r.y = y; ++ return r; ++} ++ ++dpoint_t __attribute__((__noinline__)) ++dmkpt (double x, double y) ++{ ++ dpoint_t r; ++ r.x = x; ++ r.y = y; ++ return r; ++} ++ ++int ++main (void) ++{ ++ div_t d = div (3, 2); ++ ldiv_t ld = ldiv (3, 2); ++ point_t p = mkpt (3.0f, 1.0f); ++ dpoint_t dp = dmkpt (3.0d, 1.0d); ++ ++ return d.q - (int) p.y + ld.q - (int) dp.y; ++} + +diff --git a/tests/run-funcretval-struct-native.sh b/tests/run-funcretval-struct-native.sh +new file mode 100755 +index 000000000000..798edb3b61b3 +--- /dev/null ++++ b/tests/run-funcretval-struct-native.sh +@@ -0,0 +1,22 @@ ++#! /bin/sh ++# Copyright (C) 2024 Mark J. Wielaard ++# This file is part of elfutils. ++# ++# This file is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# elfutils is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++. $srcdir/test-subr.sh ++ ++# Just run it, we don't know what the native representation is. ++# But it should at least work and not error out. ++testrun $abs_builddir/funcretval -e $abs_builddir/funcretval_test_struct +-- +2.44.0 + diff --git a/elfutils.spec b/elfutils.spec index 68e0e5c..390ab7d 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,13 +1,16 @@ +# Rebuild --with static to enable static subpackages +# This is *not* supported by elfutils maintainers +%bcond_with static + Name: elfutils -Version: 0.190 -%global baserelease 2 +Version: 0.191 +%global baserelease 1 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) and GFDL Source: %{?source_url}%{name}-%{version}.tar.bz2 Source1: elfutils-debuginfod.sysusers -Source2: testcore-noncontig.bz2 Summary: A collection of utilities and DSOs to handle ELF files and DWARF data # Needed for isa specific Provides and Requires. @@ -73,8 +76,6 @@ BuildRequires: gettext-devel %endif # Patches -# RHEL-18913: Fix handling of corefiles with non-contiguous segments. -Patch1: elfutils-0.190-fix-core-noncontig.patch %description Elfutils is a collection of utilities, including stack (to show @@ -116,7 +117,6 @@ Provides: elfutils-devel%{depsuffix} = %{version}-%{release} %endif Requires: elfutils-libs%{depsuffix} = %{version}-%{release} Requires: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} -Obsoletes: elfutils-devel-static < 0.180-5 %description devel The elfutils-devel package contains the libraries to create @@ -124,6 +124,22 @@ applications for handling compiled objects. libdw provides access to the DWARF debugging information. libasm provides a programmable assembler interface. +%if %{with static} +%package devel-static +Summary: Static archives to handle compiled objects +License: GPL-2.0-or-later or LGPL-3.0-or-later +%if 0%{!?_isa:1} +Provides: elfutils-devel-static%{depsuffix} = %{version}-%{release} +%endif +Requires: elfutils-devel%{depsuffix} = %{version}-%{release} +Requires: elfutils-libelf-devel-static%{depsuffix} = %{version}-%{release} +Requires: libzstd-static%{depsuffix} + +%description devel-static +The elfutils-devel-static package contains the static archives +with the code to handle compiled objects. +%endif + %package libelf Summary: Library to read and write ELF files License: GPLv2+ or LGPLv3+ @@ -146,7 +162,6 @@ Provides: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} %endif Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Obsoletes: libelf-devel <= 0.8.2-2 -Obsoletes: elfutils-libelf-devel-static < 0.180-5 %description libelf-devel The elfutils-libelf-devel package contains the libraries to create @@ -154,6 +169,20 @@ applications for handling compiled objects. libelf allows you to access the internals of the ELF object file format, so you can see the different sections of an ELF file. +%if %{with static} +%package libelf-devel-static +Summary: Static archive of libelf +License: GPL-2.0-or-later or LGPL-3.0-or-later +%if 0%{!?_isa:1} +Provides: elfutils-libelf-devel-static%{depsuffix} = %{version}-%{release} +%endif +Requires: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} + +%description libelf-devel-static +The elfutils-libelf-static package contains the static archive +for libelf. +%endif + %if %{provide_yama_scope} %package default-yama-scope Summary: Default yama attach scope sysctl setting @@ -262,8 +291,6 @@ autoreconf -f -v -i # are executable. find . -name \*.sh ! -perm -0100 -print | xargs chmod +x -cp %{SOURCE2} tests - %build # Remove -Wall from default flags. The makefiles enable enough warnings # themselves, and they use -Werror. Appending -Wall defeats the cases where @@ -288,8 +315,10 @@ trap '' EXIT %make_install chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib*.so* +%if %{without static} # We don't want the static libraries rm ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib{elf,dw,asm}.a +%endif # We don't have standard DEBUGINFOD_URLS necessarily, but still ship # the profile.d/debuginfod* files, in case of a site specific server. @@ -387,6 +416,12 @@ fi %{_libdir}/libdw.so %{_libdir}/pkgconfig/libdw.pc +%if %{with static} +%files devel-static +%{_libdir}/libdw.a +%{_libdir}/libasm.a +%endif + %files -f %{name}.lang libelf %license COPYING-GPLV2 COPYING-LGPLV3 %{_libdir}/libelf-%{version}.so @@ -400,6 +435,11 @@ fi %{_libdir}/pkgconfig/libelf.pc %{_mandir}/man3/elf_*.3* +%if %{with static} +%files libelf-devel-static +%{_libdir}/libelf.a +%endif + %if %{provide_yama_scope} %files default-yama-scope %{_sysctldir}/10-default-yama-scope.conf @@ -453,6 +493,17 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Fri Apr 12 2024 Aaron Merey - 0.191-1 +- Upgrade to upstream elfutils 0.191 +- Drop upstreamed patches + elfutils-0.190-fix-core-noncontig.patch + elfutils-0.190-gcc-14.patch + elfutils-0.190-remove-ET_REL-unstrip-test.patch +- Drop testcore-noncontig.bz2 +- Add elfutils-0.191-profile-empty-urls.patch +- Add elfutils-0.191-riscv-flatten.patch +- Add feature flag for reenabling elfutils-libelf-devel-static and elfutils-devel-static + * Fri Dec 8 2023 Aaron Merey - 0.190-2 - Add elfutils-0.190-fix-core-noncontig.patch diff --git a/sources b/sources index 658148d..6091854 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.190.tar.bz2) = 9c4f5328097e028286c42f29e39dc3d80914b656cdfbbe05b639e91bc787ae8ae64dd4d69a6e317ce30c01648ded10281b86a51e718295f4c589df1225a48102 +SHA512 (elfutils-0.191.tar.bz2) = e22d85f25317a79b36d370347e50284c9120c86f9830f08791b7b6a7b4ad89b9bf4c7c71129133b8d193a0edffb2a2c17987b7e48428b9670aff5ce918777e04 diff --git a/testcore-noncontig.bz2 b/testcore-noncontig.bz2 deleted file mode 100644 index 514ad01..0000000 Binary files a/testcore-noncontig.bz2 and /dev/null differ