Compare commits

..

31 Commits

Author SHA1 Message Date
6d85771392
Bump release
Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2024-03-20 18:48:47 +02:00
20f9b4f6cc
Test a patch from mjw
Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2024-03-20 18:25:01 +02:00
bc0bd89ecf
Fix changelog
Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2024-02-21 13:02:49 +02:00
a8e7bfe7ac
Revert "Do not ignore tests failures on riscv64"
This reverts commit 4c7ab54e63.
2024-02-21 13:02:04 +02:00
4c7ab54e63
Do not ignore tests failures on riscv64
Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2024-02-21 12:16:43 +02:00
fe762d8d53
Merge remote-tracking branch 'up/main' into main-riscv64
Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2024-02-21 12:16:12 +02:00
Fedora Release Engineering
fc141358f5 Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-24 10:15:47 +00:00
Yaakov Selkowitz
30c0ab2617 Fix build with GCC 14
https://sourceware.org/git/?p=elfutils.git;h=ae580d48278b9924da7503886b37be34378e1b04
2024-01-19 14:25:33 -05:00
Fedora Release Engineering
ea7ed5a10d Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-19 17:59:24 +00:00
87d70ca74b
Remove already applied patch
Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2023-12-07 14:15:02 +02:00
3ab1a29afa
Backport f2c522567ad63ac293535fba9704895e685ab5bc
See https://sourceware.org/bugzilla/show_bug.cgi?id=30047 for more
details.

Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2023-12-07 13:26:21 +02:00
de40b01d44
Merge remote-tracking branch 'up/main' into main-riscv64
Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2023-12-07 13:24:05 +02:00
Aaron Merey
0aecb034b0 0.190-4 - Add elfutils-0.190-remove-ET_REL-unstrip-test.patch 2023-11-28 17:12:38 -05:00
ae0fc5b66c
Ignore testsuite failures on riscv64
Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2023-11-25 15:33:00 +02:00
da00848d8e
Merge remote-tracking branch 'up/main' into main-riscv64
Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2023-11-25 15:31:28 +02:00
Aaron Merey
67d56959ad 0.190-3 - Add elfutils-0.190-fix-core-noncontig.patch 2023-11-24 16:33:03 -05:00
Mark Wielaard
4bf94eb436 0.190-2 - Update Fedora license tags to spdx license tags 2023-11-04 01:10:11 +01:00
Mark Wielaard
d6169014dd 0.190-1
- Upgrade to upstream elfutils 0.190
- Add eu-srcfiles
- Drop upstreamed patches
  elfutils-0.189-relr.patch
  elfutils-0.189-debuginfod_config_cache-double-close.patch
  elfutils-0.189-elf_getdata_rawchunk.patch
  elfutils-0.189-elfcompress.patch
  elfutils-0.189-c99-compat.patch
- Only package debuginfod-client-config.7 manpage for debuginfod-client
2023-11-03 21:21:05 +01:00
Mark Wielaard
87c5e66753 0.189-6 - Update elfutils-0.189-relr.patch 2023-08-25 01:15:22 +02:00
Mark Wielaard
6258998871 0.189-5 - Add elfutils-0.189-relr.patch 2023-08-24 00:16:51 +02:00
Fedora Release Engineering
62b5826af2 Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-07-19 18:20:35 +00:00
Mark Wielaard
cb376abe7f 0.189-3 - Add elfutils-0.189-debuginfod_config_cache-double-close.patch 2023-06-22 15:10:49 +02:00
Mark Wielaard
87f9e5c38d Add elfutils-0.189-elf_getdata_rawchunk.patch 2023-06-22 15:08:31 +02:00
Martin Cermak
771965e4bc CI Tests: Simplify test for rhbz2188064 2023-04-25 12:50:10 +02:00
Martin Cermak
7c06a3670c CI Tests: Test cover rhbz2188064 2023-04-25 12:40:59 +02:00
Mark Wielaard
25ede0eead 0.189-2 2023-04-22 22:29:20 +02:00
Mark Wielaard
4ae92c9668 Add elfutils-0.189-elfcompress.patch 2023-04-22 22:28:38 +02:00
Mark Wielaard
829b595e08 Add elfutils-0.189-c99-compat.patch 2023-04-22 22:23:26 +02:00
38f6128cd1
Let tests pass on riscv64
[..]
/builddir/build/BUILD/elfutils-0.187/tests/run-large-elf-file.sh: line 66: 2316008 Killed                  timeout -s9 10s dd conv=fsync if=/dev/zero of=tempfile bs=1M count=1K
File system not fast enough, need at least 100MB/s
SKIP run-large-elf-file.sh (exit status: 77)
FAIL: run-native-test.sh
[..]

Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2022-08-04 17:35:47 +03:00
6bcadd0d82
Remove bcond
This is not supported until we get RPM 4.18 built.

Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2022-08-04 16:06:59 +03:00
622c84ff7a
Disable debug packages on riscv64
Temporary change until it's fixed.

Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
2022-08-04 15:27:10 +03:00
11 changed files with 1075 additions and 14 deletions

1
.gitignore vendored
View File

@ -30,3 +30,4 @@
/elfutils-0.187.tar.bz2
/elfutils-0.188.tar.bz2
/elfutils-0.189.tar.bz2
/elfutils-0.190.tar.bz2

View File

@ -0,0 +1,526 @@
From mboxrd@z Thu Jan 1 00:00:00 1970
Return-Path: <SRS0=Nj6H=K2=klomp.org=mark@sourceware.org>
Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184])
by sourceware.org (Postfix) with ESMTPS id 94C343858D28
for <elfutils-devel@sourceware.org>; Wed, 20 Mar 2024 15:03:17 +0000 (GMT)
DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 94C343858D28
Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org
Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org
ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 94C343858D28
Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=45.83.234.184
ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710947008; cv=none;
b=ZaA/MNizZK1m7RST3WVwYkw7MpdQnN5pXW59Mf4XLop36kKzYcktB53os2YUTijGxbyhO5w76XVGvPb9durXvBExSVaxaYIdbRtF1SH4p0SsSSbRxDcFl+3ZresPVUVPZSigPIKBoAR/S1WJap4m46GrmSPXluXRciumQHBYV2g=
ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key;
t=1710947008; c=relaxed/simple;
bh=W8D42UwvkxRXLtPL/lLS6YvhY+aktp/bqsndBDqRpYQ=;
h=From:To:Subject:Date:Message-ID:MIME-Version; b=qTjhThn8NWVgQNCY2W5hCKX2os+4pha6hpeDpUa7rs4akwHAVHNrTDeZvG4PHLUTfgEyt3+sbEwE7XXQ/yOP5/rChSi7iPW/ga5xpL6bf0nmUxWrj6VAxZ2+iZDvHHKCWB4tcbizixjuv6FFbjBd3UkThDklACY7Ah3JB6tB0qU=
ARC-Authentication-Results: i=1; server2.sourceware.org
Received: from r6.localdomain (82-217-174-174.cable.dynamic.v4.ziggo.nl [82.217.174.174])
(using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by gnu.wildebeest.org (Postfix) with ESMTPSA id 22D083000472;
Wed, 20 Mar 2024 16:03:15 +0100 (CET)
Received: by r6.localdomain (Postfix, from userid 1000)
id D21E93404B2; Wed, 20 Mar 2024 16:03:14 +0100 (CET)
From: Mark Wielaard <mark@klomp.org>
To: elfutils-devel@sourceware.org
Cc: Mark Wielaard <mark@klomp.org>
Subject: [PATCH] riscv: Partial implementation of flatten_aggregate
Date: Wed, 20 Mar 2024 16:03:12 +0100
Message-ID: <20240320150312.169280-1-mark@klomp.org>
X-Mailer: git-send-email 2.44.0
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-Spam-Status: No, score=-8.5 required=5.0 tests=BAYES_00,GIT_PATCH_0,JMQ_SPF_NEUTRAL,KAM_DMARC_STATUS,KAM_SHORT,LOTS_OF_MONEY,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6
X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org
List-Id: <elfutils-devel.sourceware.org>
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
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
@@ -162,6 +162,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \
run-addr2line-C-test.sh \
run-addr2line-i-test.sh run-addr2line-i-lex-test.sh \
run-addr2line-i-demangle-test.sh run-addr2line-alt-debugpath.sh \
+ run-funcretval-struct.sh \
run-varlocs.sh run-exprlocs.sh run-varlocs-vars.sh run-funcretval.sh \
run-backtrace-native.sh run-backtrace-data.sh run-backtrace-dwarf.sh \
run-backtrace-native-biarch.sh run-backtrace-native-core.sh \
@@ -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 \
@@ -478,6 +483,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
testfile_aarch64_core.bz2 testfile_i686_core.bz2 \
addrx_constx-4.dwo.bz2 addrx_constx-5.dwo.bz2 \
testfile-addrx_constx-4.bz2 testfile-addrx_constx-5.bz2 \
+ run-funcretval-struct.sh funcretval_test_struct_riscv.bz2 \
run-funcretval.sh funcretval_test.c funcretval_test_aarch64.bz2 \
run-backtrace-data.sh run-backtrace-dwarf.sh cleanup-13.c \
run-backtrace-native.sh run-backtrace-native-biarch.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/funcretval_test_struct_riscv.bz2 b/tests/funcretval_test_struct_riscv.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..de3e5ba9de36babad9344bb32968ef5af6c81798
GIT binary patch
literal 3821
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
literal 0
HcmV?d00001
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
diff --git a/tests/run-funcretval-struct.sh b/tests/run-funcretval-struct.sh
new file mode 100755
index 000000000000..92b2a3abca39
--- /dev/null
+++ b/tests/run-funcretval-struct.sh
@@ -0,0 +1,35 @@
+#! /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
+
+# The test files are the native funcretval_test_struct files
+# funcretval_test_struct.c
+# See also run-funcretval-struct-native.sh
+
+testfiles funcretval_test_struct_riscv
+
+testrun_compare ${abs_top_builddir}/tests/funcretval \
+ -e funcretval_test_struct_riscv <<\EOF
+() main: return value location: {0x5a, 0}
+() dmkpt: return value location: {0x90, 0x2a} {0x93, 0x8} {0x90, 0x2b} {0x93, 0x8}
+() mkpt: return value location: {0x90, 0x2a}
+() ldiv: return value location: {0x5a, 0} {0x93, 0x8} {0x5b, 0} {0x93, 0x8}
+() div: return value location: {0x5a, 0}
+EOF
+
+exit 0
--
2.44.0

View File

@ -0,0 +1,329 @@
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

@ -0,0 +1,33 @@
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

@ -0,0 +1,32 @@
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

@ -1,12 +1,13 @@
Name: elfutils
Version: 0.189
%global baserelease 1
Release: %{baserelease}%{?dist}
Version: 0.190
%global baserelease 6
Release: %{baserelease}.1.riscv64%{?dist}
URL: http://elfutils.org/
%global source_url ftp://sourceware.org/pub/elfutils/%{version}/
License: GPLv3+ and (GPLv2+ or LGPLv3+) and GFDL
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.
@ -74,6 +75,15 @@ 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
# Bugzilla: https://sourceware.org/bugzilla/show_bug.cgi?id=31142
Patch5: bugzilla-backends-31142.patch
%description
Elfutils is a collection of utilities, including stack (to show
@ -85,7 +95,7 @@ elfcompress (to compress or decompress ELF sections).
%package libs
Summary: Libraries to handle compiled objects
License: GPLv2+ or LGPLv3+
License: GPL-2.0-or-later or LGPL-3.0-or-later
%if 0%{!?_isa:1}
Provides: elfutils-libs%{depsuffix} = %{version}-%{release}
%endif
@ -108,7 +118,7 @@ libraries.
%package devel
Summary: Development libraries to handle compiled objects
License: GPLv2+ or LGPLv3+
License: GPL-2.0-or-later or LGPL-3.0-or-later
%if 0%{!?_isa:1}
Provides: elfutils-devel%{depsuffix} = %{version}-%{release}
%endif
@ -129,7 +139,7 @@ assembler interface.
%package libelf
Summary: Library to read and write ELF files
License: GPLv2+ or LGPLv3+
License: GPL-2.0-or-later or LGPL-3.0-or-later
%if 0%{!?_isa:1}
Provides: elfutils-libelf%{depsuffix} = %{version}-%{release}
%endif
@ -143,7 +153,7 @@ elfutils package use it also to generate new ELF files.
%package libelf-devel
Summary: Development support for libelf
License: GPLv2+ or LGPLv3+
License: GPL-2.0-or-later or LGPL-3.0-or-later
%if 0%{!?_isa:1}
Provides: elfutils-libelf-devel%{depsuffix} = %{version}-%{release}
%endif
@ -160,7 +170,7 @@ different sections of an ELF file.
%if %{provide_yama_scope}
%package default-yama-scope
Summary: Default yama attach scope sysctl setting
License: GPLv2+ or LGPLv3+
License: GPL-2.0-or-later or LGPL-3.0-or-later
Provides: default-yama-scope
BuildArch: noarch
# For the sysctl_apply macro we need systemd as build requires.
@ -194,7 +204,7 @@ profiling) of processes.
%package debuginfod-client
Summary: Library and command line client for build-id HTTP ELF/DWARF server
License: GPLv3+ and (GPLv2+ or LGPLv3+)
License: GPL-3.0-or-later and (GPL-2.0-or-later or LGPL-3.0-or-later)
%if 0%{!?_isa:1}
Provides: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release}
%endif
@ -204,7 +214,7 @@ Requires: elfutils-libelf%{depsuffix} = %{version}-%{release}
%package debuginfod-client-devel
Summary: Libraries and headers to build debuginfod client applications
License: GPLv2+ or LGPLv3+
License: GPL-2.0-or-later or LGPL-3.0-or-later
%if 0%{!?_isa:1}
Provides: elfutils-debuginfod-client-devel%{depsuffix} = %{version}-%{release}
%endif
@ -212,7 +222,7 @@ Requires: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release}
%package debuginfod
Summary: HTTP ELF/DWARF file server addressed by build-id
License: GPLv3+
License: GPL-3.0-or-later
Requires: elfutils-libs%{depsuffix} = %{version}-%{release}
Requires: elfutils-libelf%{depsuffix} = %{version}-%{release}
Requires: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release}
@ -258,6 +268,8 @@ 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
@ -306,7 +318,11 @@ install -Dm0644 %{SOURCE1} %{buildroot}%{_sysusersdir}/elfutils-debuginfod.conf
# Record some build root versions in build.log
uname -r; rpm -q binutils gcc glibc || true
%ifnarch riscv64
%make_build check || (cat tests/test-suite.log; false)
%else
%make_build check || (cat tests/test-suite.log; false)
%endif
# Only the latest Fedora and EPEL have these scriptlets,
# older Fedora and plain RHEL don't.
@ -348,6 +364,7 @@ fi
%{_bindir}/eu-ranlib
%{_bindir}/eu-readelf
%{_bindir}/eu-size
%{_bindir}/eu-srcfiles
%{_bindir}/eu-stack
%{_bindir}/eu-strings
%{_bindir}/eu-strip
@ -418,7 +435,6 @@ fi
%{_sysusersdir}/elfutils-debuginfod.conf
%endif
%{_mandir}/man8/debuginfod*.8*
%{_mandir}/man7/debuginfod*.7*
%dir %attr(0700,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod
@ -442,6 +458,56 @@ exit 0
%systemd_postun_with_restart debuginfod.service
%changelog
* Wed Mar 20 2024 David Abdurachmanov <davidlt@rivosinc.com> - 0.190-6.1.riscv64
- Test a fix for riscv64
* Wed Feb 21 2024 David Abdurachmanov <davidlt@rivosinc.com> - 0.190-6.0.riscv64
- Ignore testsuite results on riscv64
* 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
* Fri Nov 24 2023 Aaron Merey <amerey@fedoraproject.org> - 0.190-3
- Add elfutils-0.190-fix-core-noncontig.patch
* Fri Nov 3 2023 Mark Wielaard <mjw@fedoraproject.org> - 0.190-2
- Update Fedora license tags to spdx license tags
* Fri Nov 3 2023 Mark Wielaard <mjw@fedoraproject.org> - 0.190-1
- Upgrade to upstream elfutils 0.190
- Add eu-srcfiles
- Drop upstreamed patches
elfutils-0.189-relr.patch
elfutils-0.189-debuginfod_config_cache-double-close.patch
elfutils-0.189-elf_getdata_rawchunk.patch
elfutils-0.189-elfcompress.patch
elfutils-0.189-c99-compat.patch
- Only package debuginfod-client-config.7 manpage for debuginfod-client
* Thu Aug 24 2023 Mark Wielaard <mjw@fedoraproject.org> - 0.189-6
- Update elfutils-0.189-relr.patch
* Wed Aug 23 2023 Mark Wielaard <mjw@fedoraproject.org> - 0.189-5
- Add elfutils-0.189-relr.patch
* Wed Jul 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 0.189-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Thu Jun 22 2023 Mark Wielaard <mjw@fedoraproject.org> - 0.189-3
- Add elfutils-0.189-elf_getdata_rawchunk.patch
- Add elfutils-0.189-debuginfod_config_cache-double-close.patch
* Sat Apr 22 2023 Mark Wielaard <mjw@fedoraproject.org> - 0.189-2
- Add elfutils-0.189-c99-compat.patch
- Add elfutils-0.189-elfcompress.patch
* Fri Mar 3 2023 Mark Wielaard <mjw@fedoraproject.org> - 0.189-1
- Upgrade to upsteam elfutils 0.189.

View File

@ -1 +1 @@
SHA512 (elfutils-0.189.tar.bz2) = 93a877e34db93e5498581d0ab2d702b08c0d87e4cafd9cec9d6636dfa85a168095c305c11583a5b0fb79374dd93bc8d0e9ce6016e6c172764bcea12861605b71
SHA512 (elfutils-0.190.tar.bz2) = 9c4f5328097e028286c42f29e39dc3d80914b656cdfbbe05b639e91bc787ae8ae64dd4d69a6e317ce30c01648ded10281b86a51e718295f4c589df1225a48102

BIN
testcore-noncontig.bz2 Normal file

Binary file not shown.

View File

@ -0,0 +1,4 @@
int main()
{
return 0;
}

View File

@ -0,0 +1,15 @@
summary: eu-elfcompress-breaks-hard-links
description: ''
link:
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=2188064
contact: Martin Cermak <mcermak@redhat.com>
component:
- elfutils
test: ./runtest.sh
framework: beakerlib
recommend:
- elfutils
- gcc
duration: 1h
extra-summary: /tools/elfutils/Regression/eu-elfcompress-breaks-hard-links
extra-task: /tools/elfutils/Regression/eu-elfcompress-breaks-hard-links

View File

@ -0,0 +1,55 @@
#!/bin/bash
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# runtest.sh of /tools/elfutils/Regression/eu-elfcompress-breaks-hard-links
# Description: eu-elfcompress-breaks-hard-links
# Author: Martin Cermak <mcermak@redhat.com>
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# Copyright (c) 2023 Red Hat, Inc.
#
# This program 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 2 of
# the License, or (at your option) any later version.
#
# This program 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 Beaker environment
. /usr/share/beakerlib/beakerlib.sh || exit 1
PACKAGE="elfutils"
rlJournalStart
rlPhaseStartSetup
rlAssertRpm $PACKAGE
rlRun "TMP=$(mktemp -d)"
rlRun "cp bubble.c $TMP/"
rlRun "pushd $TMP"
rlPhaseEnd
rlPhaseStartTest
rlRun "gcc -o a.out -g bubble.c"
rlRun "ln a.out a.lnk"
rlRun "eu-elfcompress -q -p -t none a.lnk"
rlRun "i0=$(stat -c '%i' a.out)"
rlRun "i1=$(stat -c '%i' a.lnk)"
rlRun "test $i0 -eq $i1"
rlPhaseEnd
rlPhaseStartCleanup
rlRun "popd"
rlRun "rm -r $TMP"
rlPhaseEnd
rlJournalPrintText
rlJournalEnd