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

Resolves: RHEL-29197
This commit is contained in:
Aaron Merey 2024-04-12 17:17:01 -04:00
parent fc141358f5
commit d36bf0429d
9 changed files with 517 additions and 409 deletions

1
.gitignore vendored
View File

@ -31,3 +31,4 @@
/elfutils-0.188.tar.bz2
/elfutils-0.189.tar.bz2
/elfutils-0.190.tar.bz2
/elfutils-0.191.tar.bz2

View File

@ -1,329 +0,0 @@
From 0fba72fed595f77ca19a57553096ce3cc81cf8f3 Mon Sep 17 00:00:00 2001
From: Aaron Merey <amerey@redhat.com>
Date: Fri, 24 Nov 2023 14:52:38 -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 <amerey@redhat.com>
---
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, 177 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 3ef62a7d..09ee37b3 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 7fb8efb1..9f8f7698 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 00000000..04558e28
--- /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 <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <assert.h>
+#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 00000000..1245b67f
--- /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 <http://www.gnu.org/licenses/>.
+
+. $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 <unistd.h>
+# #include <dlfcn.h>
+#
+# 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.41.0

View File

@ -1,33 +0,0 @@
From: Sergei Trofimovich <slyich@gmail.com>
Date: Thu, 21 Dec 2023 09:23:30 +0000 (+0000)
Subject: tests: fix build against upcoming `gcc-14` (`-Werror=calloc-transposed-args`)
X-Git-Url: https://sourceware.org/git/?p=elfutils.git;a=commitdiff_plain;h=ae580d48278b9924da7503886b37be34378e1b04;hp=a2194f6b305bf0d0b9dd49dccd0a5c21994c8eea
tests: fix build against upcoming `gcc-14` (`-Werror=calloc-transposed-args`)
`gcc-14` added a new `-Wcalloc-transposed-args` warning recently. It
detected minor infelicity in `calloc()` API usage in `elfutils`:
elfstrmerge.c: In function 'main':
elfstrmerge.c:450:32: error:
'calloc' sizes specified with 'sizeof' in the earlier argument and not in the later argument [-Werror=calloc-transposed-args]
450 | newscnbufs = calloc (sizeof (void *), newshnums);
| ^~~~
elfstrmerge.c:450:32: note: earlier argument should specify number of elements, later size of each element
Signed-off-by: Sergei Trofimovich <slyich@gmail.com>
---
diff --git a/tests/elfstrmerge.c b/tests/elfstrmerge.c
index 56350bb91..4eb58bbb5 100644
--- a/tests/elfstrmerge.c
+++ b/tests/elfstrmerge.c
@@ -447,7 +447,7 @@ main (int argc, char **argv)
}
newshnums = shdrnum - 1;
- newscnbufs = calloc (sizeof (void *), newshnums);
+ newscnbufs = calloc (newshnums, sizeof (void *));
if (newscnbufs == NULL)
fail_errno ("Couldn't allocate memory for new section buffers", NULL);

View File

@ -1,32 +0,0 @@
From 010cacd89b847659b3c666ac963269b06a8c5058 Mon Sep 17 00:00:00 2001
From: Aaron Merey <amerey@redhat.com>
Date: Tue, 28 Nov 2023 16:41:35 -0500
Subject: [PATCH] tests/run-strip-strmerge.sh: remove ET_REL unstrip and
elflint tests
These tests can fail on i386. Remove them for now since stripping and
unstripping an ET_REL file is obscure.
---
tests/run-strip-strmerge.sh | 6 ------
1 file changed, 6 deletions(-)
diff --git a/tests/run-strip-strmerge.sh b/tests/run-strip-strmerge.sh
index aa9c1eb..67543eb 100755
--- a/tests/run-strip-strmerge.sh
+++ b/tests/run-strip-strmerge.sh
@@ -69,11 +69,5 @@ echo elflint $stripped
testrun ${abs_top_builddir}/src/elflint --gnu $stripped
echo elflint $debugfile
testrun ${abs_top_builddir}/src/elflint --gnu -d $debugfile
-echo unstrip
-testrun ${abs_top_builddir}/src/unstrip -o $remerged $stripped $debugfile
-echo elflint $remerged
-testrun ${abs_top_builddir}/src/elflint --gnu $remerged
-echo elfcmp
-testrun ${abs_top_builddir}/src/elfcmp $merged $remerged
exit 0
--
2.41.0

View File

@ -0,0 +1,96 @@
commit 0ba2e4aa9945019a8c6db95d27d142b660a63a79
Author: Mark Wielaard <mark@klomp.org>
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 <mark@klomp.org>
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 <http://www.gnu.org/licenses/>.
+
+. $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

View File

@ -0,0 +1,359 @@
From e39336df6588c3f9853be7d02819aee262ba2121 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mark@klomp.org>
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 <mark@klomp.org>
---
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 <mark@klomp.org>
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 <mark@klomp.org>
+ 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 <http://www.gnu.org/licenses/>. */
+
+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 <mark@klomp.org>
+# 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 <http://www.gnu.org/licenses/>.
+
+. $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

View File

@ -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 6
Version: 0.191
%global baserelease 1
Release: %{baserelease}%{?dist}
URL: http://elfutils.org/
%global source_url ftp://sourceware.org/pub/elfutils/%{version}/
License: GPL-3.0-or-later and (GPL-2.0-or-later or LGPL-3.0-or-later) and GFDL-1.3-no-invariants-or-later
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.
@ -75,12 +78,6 @@ BuildRequires: gettext-devel
# For s390x... FDO package notes are bogus.
Patch1: elfutils-0.186-fdo-swap.patch
# PR30975: Fix handling of corefiles with non-contiguous .so segments.
Patch2: elfutils-0.190-fix-core-noncontig.patch
# Remove obscure tests that can fail on i386.
Patch3: elfutils-0.190-remove-ET_REL-unstrip-test.patch
# tests: fix build against gcc-14 (-Werror=calloc-transposed-args)
Patch4: elfutils-0.190-gcc-14.patch
%description
Elfutils is a collection of utilities, including stack (to show
@ -126,7 +123,6 @@ Recommends: elfutils-debuginfod-client-devel%{depsuffix} = %{version}-%{release}
%else
Requires: elfutils-debuginfod-client-devel%{depsuffix} = %{version}-%{release}
%endif
Obsoletes: elfutils-devel-static < 0.180-5
%description devel
The elfutils-devel package contains the libraries to create
@ -134,6 +130,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: GPL-2.0-or-later or LGPL-3.0-or-later
@ -156,7 +168,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
@ -164,6 +175,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
@ -265,8 +290,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
@ -293,8 +316,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
%find_lang %{name}
@ -385,6 +410,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
@ -398,6 +429,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
@ -451,13 +487,23 @@ exit 0
%systemd_postun_with_restart debuginfod.service
%changelog
* Thu Apr 11 2024 Aaron Merey <amerey@redhat.com> - 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
* Wed Jan 24 2024 Fedora Release Engineering <releng@fedoraproject.org> - 0.190-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Fri Jan 19 2024 Fedora Release Engineering <releng@fedoraproject.org> - 0.190-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Tue Nov 28 2023 Aaron Merey <amerey@fedoraproject.org> - 0.190-4
- Add elfutils-0.190-remove-ET_REL-unstrip-test.patch

View File

@ -1 +1 @@
SHA512 (elfutils-0.190.tar.bz2) = 9c4f5328097e028286c42f29e39dc3d80914b656cdfbbe05b639e91bc787ae8ae64dd4d69a6e317ce30c01648ded10281b86a51e718295f4c589df1225a48102
SHA512 (elfutils-0.191.tar.bz2) = e22d85f25317a79b36d370347e50284c9120c86f9830f08791b7b6a7b4ad89b9bf4c7c71129133b8d193a0edffb2a2c17987b7e48428b9670aff5ce918777e04

Binary file not shown.