From 66e41cec577e0dc194fcf8f2cc971706954e0dd7 Mon Sep 17 00:00:00 2001 From: Martin Cermak Date: Mon, 6 Mar 2023 10:06:48 +0100 Subject: [PATCH 01/56] CI Tests: Fix the debuginfod URL --- tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh b/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh index 7b6e187..aaa6c89 100755 --- a/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh +++ b/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh @@ -43,7 +43,7 @@ rlJournalStart # Let's see if we can chase down needed debuginfo somewhere... # Attempt getting the needed file using debuginfod - export DEBUGINFOD_URLS=http://debuginfod.usersys.redhat.com:3632/ + export DEBUGINFOD_URLS=https://debuginfod.fedoraproject.org/ rlRun "f=\"$f $(debuginfod-find debuginfo /bin/bash)\"" # Attempt getting the needed file by traditional means From ea8d0bf5ce729fc88ad78dd4442d47078661344b Mon Sep 17 00:00:00 2001 From: Martin Cermak Date: Wed, 8 Mar 2023 12:44:48 +0100 Subject: [PATCH 02/56] CI Tests: Fix the debuginfod URL --- tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh b/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh index 7b6e187..aaa6c89 100755 --- a/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh +++ b/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh @@ -43,7 +43,7 @@ rlJournalStart # Let's see if we can chase down needed debuginfo somewhere... # Attempt getting the needed file using debuginfod - export DEBUGINFOD_URLS=http://debuginfod.usersys.redhat.com:3632/ + export DEBUGINFOD_URLS=https://debuginfod.fedoraproject.org/ rlRun "f=\"$f $(debuginfod-find debuginfo /bin/bash)\"" # Attempt getting the needed file by traditional means From 829b595e08d16f53cf70e56a895983d3f583d56d Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 22 Apr 2023 22:23:26 +0200 Subject: [PATCH 03/56] Add elfutils-0.189-c99-compat.patch --- elfutils-0.189-c99-compat.patch | 31 +++++++++++++++++++++++++++++++ elfutils.spec | 5 +++++ 2 files changed, 36 insertions(+) create mode 100644 elfutils-0.189-c99-compat.patch diff --git a/elfutils-0.189-c99-compat.patch b/elfutils-0.189-c99-compat.patch new file mode 100644 index 0000000..4932c2c --- /dev/null +++ b/elfutils-0.189-c99-compat.patch @@ -0,0 +1,31 @@ +From 6e7ac623674242628c9e54892a532d55d3288bb8 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Sat, 22 Apr 2023 21:37:09 +0200 +Subject: [PATCH] testsuite: Avoid C99 compatibility issues in + run-native-test.sh + +Include for the pause function, and add the return type +of main. Avoids an implicit function declaration and implicit int. + +Signed-off-by: Florian Weimer +--- + tests/run-native-test.sh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tests/run-native-test.sh b/tests/run-native-test.sh +index d19007f2..042a51c6 100755 +--- a/tests/run-native-test.sh ++++ b/tests/run-native-test.sh +@@ -27,7 +27,8 @@ + # in all builds. + + tempfiles native.c native +-echo 'main () { while (1) pause (); }' > native.c ++printf '#include \nint main (void) { while (1) pause (); }\n' \ ++ > native.c + + native=0 + kill_native() +-- +2.31.1 + diff --git a/elfutils.spec b/elfutils.spec index 8d2b05b..8de0442 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -74,6 +74,8 @@ BuildRequires: gettext-devel # For s390x... FDO package notes are bogus. Patch1: elfutils-0.186-fdo-swap.patch +# testsuite: Avoid C99 compatibility issues in run-native-test.sh +Patch2: elfutils-0.189-c99-compat.patch %description Elfutils is a collection of utilities, including stack (to show @@ -442,6 +444,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Sat Apr 22 2023 Mark Wielaard +- Add elfutils-0.189-c99-compat.patch + * Fri Mar 3 2023 Mark Wielaard - 0.189-1 - Upgrade to upsteam elfutils 0.189. From 4ae92c9668a4ebe1fd1e8c73243c241a660160aa Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 22 Apr 2023 22:28:38 +0200 Subject: [PATCH 04/56] Add elfutils-0.189-elfcompress.patch --- elfutils-0.189-elfcompress.patch | 95 ++++++++++++++++++++++++++++++++ elfutils.spec | 3 + 2 files changed, 98 insertions(+) create mode 100644 elfutils-0.189-elfcompress.patch diff --git a/elfutils-0.189-elfcompress.patch b/elfutils-0.189-elfcompress.patch new file mode 100644 index 0000000..5f0d681 --- /dev/null +++ b/elfutils-0.189-elfcompress.patch @@ -0,0 +1,95 @@ +From ef9164520c81ea61efe88777a8ad61bf17a54201 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Sat, 22 Apr 2023 01:26:17 +0200 +Subject: [PATCH] elfcompress: Don't compress if section already compressed + unless forced + +Before commit a5b07cdf9 "support ZSTD compression algorithm" +elfcompress would not try to compress a section if it already +had the requested compression type (or was already uncompressed) +unless the --force flag was given. An else if construct was changed +to an if in the commit causing elfcompress to warn (in verbose mode) +but then still try to (re)compress the section. + +Add an explicit check so if nothing needs (un)compressing, the file +isn't changed. + +The diff looks large, but git diff -b -w is just: + ++ if (force || type != schtype) ++ { + if (shdr->sh_type != SHT_NOBITS + && (shdr->sh_flags & SHF_ALLOC) == 0) + { +@@ -554,6 +556,7 @@ process_file (const char *fname) + printf ("[%zd] %s ignoring %s section\n", ndx, sname, + (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); + } ++ } + +Signed-off-by: Mark Wielaard +--- + src/elfcompress.c | 43 +++++++++++++++++++++++-------------------- + 1 file changed, 23 insertions(+), 20 deletions(-) + +diff --git a/src/elfcompress.c b/src/elfcompress.c +index 18ade66f..f771b92a 100644 +--- a/src/elfcompress.c ++++ b/src/elfcompress.c +@@ -529,30 +529,33 @@ process_file (const char *fname) + } + } + +- if (shdr->sh_type != SHT_NOBITS +- && (shdr->sh_flags & SHF_ALLOC) == 0) ++ if (force || type != schtype) + { +- set_section (sections, ndx); +- /* Check if we might want to change this section name. */ +- if (! adjust_names +- && ((type != ZLIB_GNU +- && startswith (sname, ".zdebug")) +- || (type == ZLIB_GNU +- && startswith (sname, ".debug")))) +- adjust_names = true; +- +- /* We need a buffer this large if we change the names. */ +- if (adjust_names) ++ if (shdr->sh_type != SHT_NOBITS ++ && (shdr->sh_flags & SHF_ALLOC) == 0) + { +- size_t slen = strlen (sname); +- if (slen > maxnamelen) +- maxnamelen = slen; ++ set_section (sections, ndx); ++ /* Check if we might want to change this section name. */ ++ if (! adjust_names ++ && ((type != ZLIB_GNU ++ && startswith (sname, ".zdebug")) ++ || (type == ZLIB_GNU ++ && startswith (sname, ".debug")))) ++ adjust_names = true; ++ ++ /* We need a buffer this large if we change the names. */ ++ if (adjust_names) ++ { ++ size_t slen = strlen (sname); ++ if (slen > maxnamelen) ++ maxnamelen = slen; ++ } + } ++ else ++ if (verbose >= 0) ++ printf ("[%zd] %s ignoring %s section\n", ndx, sname, ++ (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); + } +- else +- if (verbose >= 0) +- printf ("[%zd] %s ignoring %s section\n", ndx, sname, +- (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); + } + + if (shdr->sh_type == SHT_SYMTAB) +-- +2.31.1 + diff --git a/elfutils.spec b/elfutils.spec index 8de0442..f18aea2 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -76,6 +76,8 @@ BuildRequires: gettext-devel Patch1: elfutils-0.186-fdo-swap.patch # testsuite: Avoid C99 compatibility issues in run-native-test.sh Patch2: elfutils-0.189-c99-compat.patch +# elfcompress: Don't compress if section already compressed unless forced +Patch3: elfutils-0.189-elfcompress.patch %description Elfutils is a collection of utilities, including stack (to show @@ -446,6 +448,7 @@ exit 0 %changelog * Sat Apr 22 2023 Mark Wielaard - Add elfutils-0.189-c99-compat.patch +- Add elfutils-0.189-elfcompress.patch * Fri Mar 3 2023 Mark Wielaard - 0.189-1 - Upgrade to upsteam elfutils 0.189. From 25ede0eead897a8a7c79e6d03d76756baa724827 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 22 Apr 2023 22:29:20 +0200 Subject: [PATCH 05/56] 0.189-2 --- elfutils.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index f18aea2..86f3b34 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.189 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -446,7 +446,7 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog -* Sat Apr 22 2023 Mark Wielaard +* Sat Apr 22 2023 Mark Wielaard - 0.189-2 - Add elfutils-0.189-c99-compat.patch - Add elfutils-0.189-elfcompress.patch From 7c06a3670c42b5b2ec973902e9645dc45d016abd Mon Sep 17 00:00:00 2001 From: Martin Cermak Date: Tue, 25 Apr 2023 12:40:59 +0200 Subject: [PATCH 06/56] CI Tests: Test cover rhbz2188064 --- .../eu-elfcompress-breaks-hard-links/bubble.c | 36 ++++++++++++ .../eu-elfcompress-breaks-hard-links/main.fmf | 15 +++++ .../runtest.sh | 55 +++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c create mode 100644 tests/Regression/eu-elfcompress-breaks-hard-links/main.fmf create mode 100755 tests/Regression/eu-elfcompress-breaks-hard-links/runtest.sh diff --git a/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c b/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c new file mode 100644 index 0000000..9ec3260 --- /dev/null +++ b/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c @@ -0,0 +1,36 @@ +/* Bubble sort code */ + +#include + +int main() +{ + int array[100], n, c, d, swap; + + printf("Enter number of elements\n"); + scanf("%d", &n); + + printf("Enter %d integers\n", n); + + for (c = 0; c < n; c++) + scanf("%d", &array[c]); + + for (c = 0 ; c < n - 1; c++) + { + for (d = 0 ; d < n - c - 1; d++) + { + if (array[d] > array[d+1]) /* For decreasing order use '<' instead of '>' */ + { + swap = array[d]; + array[d] = array[d+1]; + array[d+1] = swap; + } + } + } + + printf("Sorted list in ascending order:\n"); + + for (c = 0; c < n; c++) + printf("%d\n", array[c]); + + return 0; +} diff --git a/tests/Regression/eu-elfcompress-breaks-hard-links/main.fmf b/tests/Regression/eu-elfcompress-breaks-hard-links/main.fmf new file mode 100644 index 0000000..a34c573 --- /dev/null +++ b/tests/Regression/eu-elfcompress-breaks-hard-links/main.fmf @@ -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 +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 diff --git a/tests/Regression/eu-elfcompress-breaks-hard-links/runtest.sh b/tests/Regression/eu-elfcompress-breaks-hard-links/runtest.sh new file mode 100755 index 0000000..7709a74 --- /dev/null +++ b/tests/Regression/eu-elfcompress-breaks-hard-links/runtest.sh @@ -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 +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# 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 From 771965e4bcd3e0041069c05796a15f78e696b74c Mon Sep 17 00:00:00 2001 From: Martin Cermak Date: Tue, 25 Apr 2023 12:50:10 +0200 Subject: [PATCH 07/56] CI Tests: Simplify test for rhbz2188064 --- .../eu-elfcompress-breaks-hard-links/bubble.c | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c b/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c index 9ec3260..f8b643a 100644 --- a/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c +++ b/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c @@ -1,36 +1,4 @@ -/* Bubble sort code */ - -#include - int main() { - int array[100], n, c, d, swap; - - printf("Enter number of elements\n"); - scanf("%d", &n); - - printf("Enter %d integers\n", n); - - for (c = 0; c < n; c++) - scanf("%d", &array[c]); - - for (c = 0 ; c < n - 1; c++) - { - for (d = 0 ; d < n - c - 1; d++) - { - if (array[d] > array[d+1]) /* For decreasing order use '<' instead of '>' */ - { - swap = array[d]; - array[d] = array[d+1]; - array[d+1] = swap; - } - } - } - - printf("Sorted list in ascending order:\n"); - - for (c = 0; c < n; c++) - printf("%d\n", array[c]); - return 0; } From fda83a73f8b3c2d3743fa2ee67cb40f79cc26ef3 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 22 Apr 2023 22:23:26 +0200 Subject: [PATCH 08/56] Add elfutils-0.189-c99-compat.patch --- elfutils-0.189-c99-compat.patch | 31 +++++++++++++++++++++++++++++++ elfutils.spec | 5 +++++ 2 files changed, 36 insertions(+) create mode 100644 elfutils-0.189-c99-compat.patch diff --git a/elfutils-0.189-c99-compat.patch b/elfutils-0.189-c99-compat.patch new file mode 100644 index 0000000..4932c2c --- /dev/null +++ b/elfutils-0.189-c99-compat.patch @@ -0,0 +1,31 @@ +From 6e7ac623674242628c9e54892a532d55d3288bb8 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Sat, 22 Apr 2023 21:37:09 +0200 +Subject: [PATCH] testsuite: Avoid C99 compatibility issues in + run-native-test.sh + +Include for the pause function, and add the return type +of main. Avoids an implicit function declaration and implicit int. + +Signed-off-by: Florian Weimer +--- + tests/run-native-test.sh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tests/run-native-test.sh b/tests/run-native-test.sh +index d19007f2..042a51c6 100755 +--- a/tests/run-native-test.sh ++++ b/tests/run-native-test.sh +@@ -27,7 +27,8 @@ + # in all builds. + + tempfiles native.c native +-echo 'main () { while (1) pause (); }' > native.c ++printf '#include \nint main (void) { while (1) pause (); }\n' \ ++ > native.c + + native=0 + kill_native() +-- +2.31.1 + diff --git a/elfutils.spec b/elfutils.spec index 8d2b05b..8de0442 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -74,6 +74,8 @@ BuildRequires: gettext-devel # For s390x... FDO package notes are bogus. Patch1: elfutils-0.186-fdo-swap.patch +# testsuite: Avoid C99 compatibility issues in run-native-test.sh +Patch2: elfutils-0.189-c99-compat.patch %description Elfutils is a collection of utilities, including stack (to show @@ -442,6 +444,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Sat Apr 22 2023 Mark Wielaard +- Add elfutils-0.189-c99-compat.patch + * Fri Mar 3 2023 Mark Wielaard - 0.189-1 - Upgrade to upsteam elfutils 0.189. From 8bb416f87082dfe271e2efd85b2c08da1f81b8bc Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 22 Apr 2023 22:28:38 +0200 Subject: [PATCH 09/56] Add elfutils-0.189-elfcompress.patch --- elfutils-0.189-elfcompress.patch | 95 ++++++++++++++++++++++++++++++++ elfutils.spec | 3 + 2 files changed, 98 insertions(+) create mode 100644 elfutils-0.189-elfcompress.patch diff --git a/elfutils-0.189-elfcompress.patch b/elfutils-0.189-elfcompress.patch new file mode 100644 index 0000000..5f0d681 --- /dev/null +++ b/elfutils-0.189-elfcompress.patch @@ -0,0 +1,95 @@ +From ef9164520c81ea61efe88777a8ad61bf17a54201 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Sat, 22 Apr 2023 01:26:17 +0200 +Subject: [PATCH] elfcompress: Don't compress if section already compressed + unless forced + +Before commit a5b07cdf9 "support ZSTD compression algorithm" +elfcompress would not try to compress a section if it already +had the requested compression type (or was already uncompressed) +unless the --force flag was given. An else if construct was changed +to an if in the commit causing elfcompress to warn (in verbose mode) +but then still try to (re)compress the section. + +Add an explicit check so if nothing needs (un)compressing, the file +isn't changed. + +The diff looks large, but git diff -b -w is just: + ++ if (force || type != schtype) ++ { + if (shdr->sh_type != SHT_NOBITS + && (shdr->sh_flags & SHF_ALLOC) == 0) + { +@@ -554,6 +556,7 @@ process_file (const char *fname) + printf ("[%zd] %s ignoring %s section\n", ndx, sname, + (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); + } ++ } + +Signed-off-by: Mark Wielaard +--- + src/elfcompress.c | 43 +++++++++++++++++++++++-------------------- + 1 file changed, 23 insertions(+), 20 deletions(-) + +diff --git a/src/elfcompress.c b/src/elfcompress.c +index 18ade66f..f771b92a 100644 +--- a/src/elfcompress.c ++++ b/src/elfcompress.c +@@ -529,30 +529,33 @@ process_file (const char *fname) + } + } + +- if (shdr->sh_type != SHT_NOBITS +- && (shdr->sh_flags & SHF_ALLOC) == 0) ++ if (force || type != schtype) + { +- set_section (sections, ndx); +- /* Check if we might want to change this section name. */ +- if (! adjust_names +- && ((type != ZLIB_GNU +- && startswith (sname, ".zdebug")) +- || (type == ZLIB_GNU +- && startswith (sname, ".debug")))) +- adjust_names = true; +- +- /* We need a buffer this large if we change the names. */ +- if (adjust_names) ++ if (shdr->sh_type != SHT_NOBITS ++ && (shdr->sh_flags & SHF_ALLOC) == 0) + { +- size_t slen = strlen (sname); +- if (slen > maxnamelen) +- maxnamelen = slen; ++ set_section (sections, ndx); ++ /* Check if we might want to change this section name. */ ++ if (! adjust_names ++ && ((type != ZLIB_GNU ++ && startswith (sname, ".zdebug")) ++ || (type == ZLIB_GNU ++ && startswith (sname, ".debug")))) ++ adjust_names = true; ++ ++ /* We need a buffer this large if we change the names. */ ++ if (adjust_names) ++ { ++ size_t slen = strlen (sname); ++ if (slen > maxnamelen) ++ maxnamelen = slen; ++ } + } ++ else ++ if (verbose >= 0) ++ printf ("[%zd] %s ignoring %s section\n", ndx, sname, ++ (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); + } +- else +- if (verbose >= 0) +- printf ("[%zd] %s ignoring %s section\n", ndx, sname, +- (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); + } + + if (shdr->sh_type == SHT_SYMTAB) +-- +2.31.1 + diff --git a/elfutils.spec b/elfutils.spec index 8de0442..f18aea2 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -76,6 +76,8 @@ BuildRequires: gettext-devel Patch1: elfutils-0.186-fdo-swap.patch # testsuite: Avoid C99 compatibility issues in run-native-test.sh Patch2: elfutils-0.189-c99-compat.patch +# elfcompress: Don't compress if section already compressed unless forced +Patch3: elfutils-0.189-elfcompress.patch %description Elfutils is a collection of utilities, including stack (to show @@ -446,6 +448,7 @@ exit 0 %changelog * Sat Apr 22 2023 Mark Wielaard - Add elfutils-0.189-c99-compat.patch +- Add elfutils-0.189-elfcompress.patch * Fri Mar 3 2023 Mark Wielaard - 0.189-1 - Upgrade to upsteam elfutils 0.189. From 76ba0b256c1314cc24943253fdf78a923d6f5d2d Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 22 Apr 2023 22:29:20 +0200 Subject: [PATCH 10/56] 0.189-2 --- elfutils.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index f18aea2..86f3b34 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.189 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -446,7 +446,7 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog -* Sat Apr 22 2023 Mark Wielaard +* Sat Apr 22 2023 Mark Wielaard - 0.189-2 - Add elfutils-0.189-c99-compat.patch - Add elfutils-0.189-elfcompress.patch From 0d0a9de97880490a32c82934407f03f02bc98ea6 Mon Sep 17 00:00:00 2001 From: Martin Cermak Date: Tue, 25 Apr 2023 12:40:59 +0200 Subject: [PATCH 11/56] CI Tests: Test cover rhbz2188064 --- .../eu-elfcompress-breaks-hard-links/bubble.c | 36 ++++++++++++ .../eu-elfcompress-breaks-hard-links/main.fmf | 15 +++++ .../runtest.sh | 55 +++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c create mode 100644 tests/Regression/eu-elfcompress-breaks-hard-links/main.fmf create mode 100755 tests/Regression/eu-elfcompress-breaks-hard-links/runtest.sh diff --git a/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c b/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c new file mode 100644 index 0000000..9ec3260 --- /dev/null +++ b/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c @@ -0,0 +1,36 @@ +/* Bubble sort code */ + +#include + +int main() +{ + int array[100], n, c, d, swap; + + printf("Enter number of elements\n"); + scanf("%d", &n); + + printf("Enter %d integers\n", n); + + for (c = 0; c < n; c++) + scanf("%d", &array[c]); + + for (c = 0 ; c < n - 1; c++) + { + for (d = 0 ; d < n - c - 1; d++) + { + if (array[d] > array[d+1]) /* For decreasing order use '<' instead of '>' */ + { + swap = array[d]; + array[d] = array[d+1]; + array[d+1] = swap; + } + } + } + + printf("Sorted list in ascending order:\n"); + + for (c = 0; c < n; c++) + printf("%d\n", array[c]); + + return 0; +} diff --git a/tests/Regression/eu-elfcompress-breaks-hard-links/main.fmf b/tests/Regression/eu-elfcompress-breaks-hard-links/main.fmf new file mode 100644 index 0000000..a34c573 --- /dev/null +++ b/tests/Regression/eu-elfcompress-breaks-hard-links/main.fmf @@ -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 +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 diff --git a/tests/Regression/eu-elfcompress-breaks-hard-links/runtest.sh b/tests/Regression/eu-elfcompress-breaks-hard-links/runtest.sh new file mode 100755 index 0000000..7709a74 --- /dev/null +++ b/tests/Regression/eu-elfcompress-breaks-hard-links/runtest.sh @@ -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 +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# 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 From fb3a116370bc9cb43ea28f31821bfa34f309f3f0 Mon Sep 17 00:00:00 2001 From: Martin Cermak Date: Tue, 25 Apr 2023 12:50:10 +0200 Subject: [PATCH 12/56] CI Tests: Simplify test for rhbz2188064 --- .../eu-elfcompress-breaks-hard-links/bubble.c | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c b/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c index 9ec3260..f8b643a 100644 --- a/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c +++ b/tests/Regression/eu-elfcompress-breaks-hard-links/bubble.c @@ -1,36 +1,4 @@ -/* Bubble sort code */ - -#include - int main() { - int array[100], n, c, d, swap; - - printf("Enter number of elements\n"); - scanf("%d", &n); - - printf("Enter %d integers\n", n); - - for (c = 0; c < n; c++) - scanf("%d", &array[c]); - - for (c = 0 ; c < n - 1; c++) - { - for (d = 0 ; d < n - c - 1; d++) - { - if (array[d] > array[d+1]) /* For decreasing order use '<' instead of '>' */ - { - swap = array[d]; - array[d] = array[d+1]; - array[d+1] = swap; - } - } - } - - printf("Sorted list in ascending order:\n"); - - for (c = 0; c < n; c++) - printf("%d\n", array[c]); - return 0; } From 87f9e5c38df3d99ffdaf716450e642a8d0138f20 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 22 Jun 2023 15:08:31 +0200 Subject: [PATCH 13/56] Add elfutils-0.189-elf_getdata_rawchunk.patch --- elfutils-0.189-elf_getdata_rawchunk.patch | 224 ++++++++++++++++++++++ elfutils.spec | 5 + 2 files changed, 229 insertions(+) create mode 100644 elfutils-0.189-elf_getdata_rawchunk.patch diff --git a/elfutils-0.189-elf_getdata_rawchunk.patch b/elfutils-0.189-elf_getdata_rawchunk.patch new file mode 100644 index 0000000..7ce6695 --- /dev/null +++ b/elfutils-0.189-elf_getdata_rawchunk.patch @@ -0,0 +1,224 @@ +From 3aca5b5f1f1617db2220022d9061dcaf129e54c4 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Wed, 21 Jun 2023 18:05:12 +0200 +Subject: [PATCH] libelf: Replace list of elf_getdata_rawchunk results with a + tree + +elf_getdata_rawchunks did a linear search to see if a chunk was +already fetched. Replace this list with a binary search tree to make +lookup faster when a lot of Elf_Data_Chunk were created. + + * libelf/libelfP.h (Elf_Data_Chunk): Remove next field. + (struct Elf): Change the rawchunks type from Elf_Data_Chunk * + to void *. + * elf_getdata_rawchunk.c (chunk_compare): New static function. + (elf_getdata_rawchunk): Use tsearch instead of a manual linked + list. + * elf_end.c (free_chunk): New static function. + (elf_end): Call tdestroy instead of walking linked list. + +Signed-off-by: Mark Wielaard +--- + libelf/elf_end.c | 22 +++++++++------- + libelf/elf_getdata_rawchunk.c | 47 +++++++++++++++++++++++++---------- + libelf/libelfP.h | 13 ++++------ + 3 files changed, 52 insertions(+), 30 deletions(-) + +diff --git a/libelf/elf_end.c b/libelf/elf_end.c +index 5c451f36..3e5d4c86 100644 +--- a/libelf/elf_end.c ++++ b/libelf/elf_end.c +@@ -1,5 +1,6 @@ + /* Free resources associated with Elf descriptor. + Copyright (C) 1998,1999,2000,2001,2002,2004,2005,2007,2015,2016 Red Hat, Inc. ++ Copyright (C) 2023 Mark J. Wielaard + This file is part of elfutils. + Written by Ulrich Drepper , 1998. + +@@ -32,12 +33,22 @@ + #endif + + #include ++#include + #include + #include + + #include "libelfP.h" + + ++static void ++free_chunk (void *n) ++{ ++ Elf_Data_Chunk *rawchunk = (Elf_Data_Chunk *)n; ++ if (rawchunk->dummy_scn.flags & ELF_F_MALLOCED) ++ free (rawchunk->data.d.d_buf); ++ free (rawchunk); ++} ++ + int + elf_end (Elf *elf) + { +@@ -112,20 +123,13 @@ elf_end (Elf *elf) + + case ELF_K_ELF: + { +- Elf_Data_Chunk *rawchunks ++ void *rawchunks + = (elf->class == ELFCLASS32 + || (offsetof (struct Elf, state.elf32.rawchunks) + == offsetof (struct Elf, state.elf64.rawchunks)) + ? elf->state.elf32.rawchunks + : elf->state.elf64.rawchunks); +- while (rawchunks != NULL) +- { +- Elf_Data_Chunk *next = rawchunks->next; +- if (rawchunks->dummy_scn.flags & ELF_F_MALLOCED) +- free (rawchunks->data.d.d_buf); +- free (rawchunks); +- rawchunks = next; +- } ++ tdestroy (rawchunks, free_chunk); + + Elf_ScnList *list = (elf->class == ELFCLASS32 + || (offsetof (struct Elf, state.elf32.scns) +diff --git a/libelf/elf_getdata_rawchunk.c b/libelf/elf_getdata_rawchunk.c +index 5a35ccdc..cfd40396 100644 +--- a/libelf/elf_getdata_rawchunk.c ++++ b/libelf/elf_getdata_rawchunk.c +@@ -1,6 +1,6 @@ + /* Return converted data from raw chunk of ELF file. + Copyright (C) 2007, 2014, 2015 Red Hat, Inc. +- Copyright (C) 2022 Mark J. Wielaard ++ Copyright (C) 2022, 2023 Mark J. Wielaard + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -33,12 +33,28 @@ + + #include + #include ++#include + #include + #include + + #include "libelfP.h" + #include "common.h" + ++static int ++chunk_compare (const void *a, const void *b) ++{ ++ Elf_Data_Chunk *da = (Elf_Data_Chunk *)a; ++ Elf_Data_Chunk *db = (Elf_Data_Chunk *)b; ++ ++ if (da->offset != db->offset) ++ return da->offset - db->offset; ++ ++ if (da->data.d.d_size != db->data.d.d_size) ++ return da->data.d.d_size - db->data.d.d_size; ++ ++ return da->data.d.d_type - db->data.d.d_type; ++} ++ + Elf_Data * + elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) + { +@@ -75,19 +91,25 @@ elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) + rwlock_rdlock (elf->lock); + + /* Maybe we already got this chunk? */ +- Elf_Data_Chunk *rawchunks = elf->state.elf.rawchunks; +- while (rawchunks != NULL) ++ Elf_Data_Chunk key; ++ key.offset = offset; ++ key.data.d.d_size = size; ++ key.data.d.d_type = type; ++ Elf_Data_Chunk **found = tsearch (&key, &elf->state.elf.rawchunks, ++ &chunk_compare); ++ if (found == NULL) ++ goto nomem; ++ ++ /* Existing entry. */ ++ if (*found != &key && *found != NULL) + { +- if ((rawchunks->offset == offset || size == 0) +- && rawchunks->data.d.d_size == size +- && rawchunks->data.d.d_type == type) +- { +- result = &rawchunks->data.d; +- goto out; +- } +- rawchunks = rawchunks->next; ++ result = &(*found)->data.d; ++ goto out; + } + ++ /* New entry. */ ++ *found = NULL; ++ + size_t align = __libelf_type_align (elf->class, type); + if (elf->map_address != NULL) + { +@@ -189,8 +211,7 @@ elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) + rwlock_unlock (elf->lock); + rwlock_wrlock (elf->lock); + +- chunk->next = elf->state.elf.rawchunks; +- elf->state.elf.rawchunks = chunk; ++ *found = chunk; + result = &chunk->data.d; + + out: +diff --git a/libelf/libelfP.h b/libelf/libelfP.h +index 6624f38a..d3c241e5 100644 +--- a/libelf/libelfP.h ++++ b/libelf/libelfP.h +@@ -1,5 +1,6 @@ + /* Internal interfaces for libelf. + Copyright (C) 1998-2010, 2015, 2016 Red Hat, Inc. ++ Copyright (C) 2023 Mark J. Wielaard + This file is part of elfutils. + Contributed by Ulrich Drepper , 1998. + +@@ -262,11 +263,7 @@ typedef struct Elf_ScnList + typedef struct Elf_Data_Chunk + { + Elf_Data_Scn data; +- union +- { +- Elf_Scn dummy_scn; +- struct Elf_Data_Chunk *next; +- }; ++ Elf_Scn dummy_scn; + int64_t offset; /* The original raw offset in the Elf image. */ + } Elf_Data_Chunk; + +@@ -324,7 +321,7 @@ struct Elf + Elf_ScnList *scns_last; /* Last element in the section list. + If NULL the data has not yet been + read from the file. */ +- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ ++ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ + unsigned int scnincr; /* Number of sections allocate the last + time. */ + int ehdr_flags; /* Flags (dirty) for ELF header. */ +@@ -343,7 +340,7 @@ struct Elf + Elf_ScnList *scns_last; /* Last element in the section list. + If NULL the data has not yet been + read from the file. */ +- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ ++ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ + unsigned int scnincr; /* Number of sections allocate the last + time. */ + int ehdr_flags; /* Flags (dirty) for ELF header. */ +@@ -368,7 +365,7 @@ struct Elf + Elf_ScnList *scns_last; /* Last element in the section list. + If NULL the data has not yet been + read from the file. */ +- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ ++ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ + unsigned int scnincr; /* Number of sections allocate the last + time. */ + int ehdr_flags; /* Flags (dirty) for ELF header. */ +-- +2.40.1 + diff --git a/elfutils.spec b/elfutils.spec index 86f3b34..7955ff1 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -78,6 +78,8 @@ Patch1: elfutils-0.186-fdo-swap.patch Patch2: elfutils-0.189-c99-compat.patch # elfcompress: Don't compress if section already compressed unless forced Patch3: elfutils-0.189-elfcompress.patch +# libelf: Replace list of elf_getdata_rawchunk results with a tree +Patch4: elfutils-0.189-elf_getdata_rawchunk.patch %description Elfutils is a collection of utilities, including stack (to show @@ -446,6 +448,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Thu Jun 22 2023 Mark Wielaard +- Add elfutils-0.189-elf_getdata_rawchunk.patch + * Sat Apr 22 2023 Mark Wielaard - 0.189-2 - Add elfutils-0.189-c99-compat.patch - Add elfutils-0.189-elfcompress.patch From cb376abe7f3e01ac583fed9852f45bc34fac56dd Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 22 Jun 2023 15:10:49 +0200 Subject: [PATCH 14/56] 0.189-3 - Add elfutils-0.189-debuginfod_config_cache-double-close.patch --- ...debuginfod_config_cache-double-close.patch | 73 +++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.189-debuginfod_config_cache-double-close.patch diff --git a/elfutils-0.189-debuginfod_config_cache-double-close.patch b/elfutils-0.189-debuginfod_config_cache-double-close.patch new file mode 100644 index 0000000..3380b71 --- /dev/null +++ b/elfutils-0.189-debuginfod_config_cache-double-close.patch @@ -0,0 +1,73 @@ +diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c +index ef4d47e3..d92d8d62 100644 +--- a/debuginfod/debuginfod-client.c ++++ b/debuginfod/debuginfod-client.c +@@ -248,7 +248,7 @@ debuginfod_write_callback (char *ptr, size_t size, size_t nmemb, void *data) + + /* handle config file read and write */ + static int +-debuginfod_config_cache(char *config_path, ++debuginfod_config_cache(debuginfod_client *c, char *config_path, + long cache_config_default_s, + struct stat *st) + { +@@ -277,17 +277,27 @@ debuginfod_config_cache(char *config_path, + } + + long cache_config; ++ /* PR29696 - NB: When using fdopen, the file descriptor is NOT ++ dup'ed and will be closed when the stream is closed. Manually ++ closing fd after fclose is called will lead to a race condition ++ where, if reused, the file descriptor will compete for its ++ regular use before being incorrectly closed here. */ + FILE *config_file = fdopen(fd, "r"); + if (config_file) + { + if (fscanf(config_file, "%ld", &cache_config) != 1) +- cache_config = cache_config_default_s; +- fclose(config_file); ++ cache_config = cache_config_default_s; ++ if (0 != fclose (config_file) && c->verbose_fd >= 0) ++ dprintf (c->verbose_fd, "fclose failed with %s (err=%d)\n", ++ strerror (errno), errno); + } + else +- cache_config = cache_config_default_s; +- +- close (fd); ++ { ++ cache_config = cache_config_default_s; ++ if (0 != close (fd) && c->verbose_fd >= 0) ++ dprintf (c->verbose_fd, "close failed with %s (err=%d)\n", ++ strerror (errno), errno); ++ } + return cache_config; + } + +@@ -303,7 +313,7 @@ debuginfod_clean_cache(debuginfod_client *c, + struct stat st; + + /* Create new interval file. */ +- rc = debuginfod_config_cache(interval_path, ++ rc = debuginfod_config_cache(c, interval_path, + cache_clean_default_interval_s, &st); + if (rc < 0) + return rc; +@@ -320,7 +330,7 @@ debuginfod_clean_cache(debuginfod_client *c, + utime (interval_path, NULL); + + /* Read max unused age value from config file. */ +- rc = debuginfod_config_cache(max_unused_path, ++ rc = debuginfod_config_cache(c, max_unused_path, + cache_default_max_unused_age_s, &st); + if (rc < 0) + return rc; +@@ -1110,7 +1135,7 @@ debuginfod_query_server (debuginfod_client *c, + + close(fd); /* no need to hold onto the negative-hit file descriptor */ + +- rc = debuginfod_config_cache(cache_miss_path, ++ rc = debuginfod_config_cache(c, cache_miss_path, + cache_miss_default_s, &st); + if (rc < 0) + goto out; diff --git a/elfutils.spec b/elfutils.spec index 7955ff1..c27e88f 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.189 -%global baserelease 2 +%global baserelease 3 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -80,6 +80,8 @@ Patch2: elfutils-0.189-c99-compat.patch Patch3: elfutils-0.189-elfcompress.patch # libelf: Replace list of elf_getdata_rawchunk results with a tree Patch4: elfutils-0.189-elf_getdata_rawchunk.patch +# PR29696: Removed secondary fd close in cache config causing race condition +Patch5: elfutils-0.189-debuginfod_config_cache-double-close.patch %description Elfutils is a collection of utilities, including stack (to show @@ -448,8 +450,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog -* Thu Jun 22 2023 Mark Wielaard +* Thu Jun 22 2023 Mark Wielaard - 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 - 0.189-2 - Add elfutils-0.189-c99-compat.patch From e719860fcd58764575dad76c12a3addf64577275 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 22 Jun 2023 15:08:31 +0200 Subject: [PATCH 15/56] Add elfutils-0.189-elf_getdata_rawchunk.patch --- elfutils-0.189-elf_getdata_rawchunk.patch | 224 ++++++++++++++++++++++ elfutils.spec | 5 + 2 files changed, 229 insertions(+) create mode 100644 elfutils-0.189-elf_getdata_rawchunk.patch diff --git a/elfutils-0.189-elf_getdata_rawchunk.patch b/elfutils-0.189-elf_getdata_rawchunk.patch new file mode 100644 index 0000000..7ce6695 --- /dev/null +++ b/elfutils-0.189-elf_getdata_rawchunk.patch @@ -0,0 +1,224 @@ +From 3aca5b5f1f1617db2220022d9061dcaf129e54c4 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Wed, 21 Jun 2023 18:05:12 +0200 +Subject: [PATCH] libelf: Replace list of elf_getdata_rawchunk results with a + tree + +elf_getdata_rawchunks did a linear search to see if a chunk was +already fetched. Replace this list with a binary search tree to make +lookup faster when a lot of Elf_Data_Chunk were created. + + * libelf/libelfP.h (Elf_Data_Chunk): Remove next field. + (struct Elf): Change the rawchunks type from Elf_Data_Chunk * + to void *. + * elf_getdata_rawchunk.c (chunk_compare): New static function. + (elf_getdata_rawchunk): Use tsearch instead of a manual linked + list. + * elf_end.c (free_chunk): New static function. + (elf_end): Call tdestroy instead of walking linked list. + +Signed-off-by: Mark Wielaard +--- + libelf/elf_end.c | 22 +++++++++------- + libelf/elf_getdata_rawchunk.c | 47 +++++++++++++++++++++++++---------- + libelf/libelfP.h | 13 ++++------ + 3 files changed, 52 insertions(+), 30 deletions(-) + +diff --git a/libelf/elf_end.c b/libelf/elf_end.c +index 5c451f36..3e5d4c86 100644 +--- a/libelf/elf_end.c ++++ b/libelf/elf_end.c +@@ -1,5 +1,6 @@ + /* Free resources associated with Elf descriptor. + Copyright (C) 1998,1999,2000,2001,2002,2004,2005,2007,2015,2016 Red Hat, Inc. ++ Copyright (C) 2023 Mark J. Wielaard + This file is part of elfutils. + Written by Ulrich Drepper , 1998. + +@@ -32,12 +33,22 @@ + #endif + + #include ++#include + #include + #include + + #include "libelfP.h" + + ++static void ++free_chunk (void *n) ++{ ++ Elf_Data_Chunk *rawchunk = (Elf_Data_Chunk *)n; ++ if (rawchunk->dummy_scn.flags & ELF_F_MALLOCED) ++ free (rawchunk->data.d.d_buf); ++ free (rawchunk); ++} ++ + int + elf_end (Elf *elf) + { +@@ -112,20 +123,13 @@ elf_end (Elf *elf) + + case ELF_K_ELF: + { +- Elf_Data_Chunk *rawchunks ++ void *rawchunks + = (elf->class == ELFCLASS32 + || (offsetof (struct Elf, state.elf32.rawchunks) + == offsetof (struct Elf, state.elf64.rawchunks)) + ? elf->state.elf32.rawchunks + : elf->state.elf64.rawchunks); +- while (rawchunks != NULL) +- { +- Elf_Data_Chunk *next = rawchunks->next; +- if (rawchunks->dummy_scn.flags & ELF_F_MALLOCED) +- free (rawchunks->data.d.d_buf); +- free (rawchunks); +- rawchunks = next; +- } ++ tdestroy (rawchunks, free_chunk); + + Elf_ScnList *list = (elf->class == ELFCLASS32 + || (offsetof (struct Elf, state.elf32.scns) +diff --git a/libelf/elf_getdata_rawchunk.c b/libelf/elf_getdata_rawchunk.c +index 5a35ccdc..cfd40396 100644 +--- a/libelf/elf_getdata_rawchunk.c ++++ b/libelf/elf_getdata_rawchunk.c +@@ -1,6 +1,6 @@ + /* Return converted data from raw chunk of ELF file. + Copyright (C) 2007, 2014, 2015 Red Hat, Inc. +- Copyright (C) 2022 Mark J. Wielaard ++ Copyright (C) 2022, 2023 Mark J. Wielaard + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -33,12 +33,28 @@ + + #include + #include ++#include + #include + #include + + #include "libelfP.h" + #include "common.h" + ++static int ++chunk_compare (const void *a, const void *b) ++{ ++ Elf_Data_Chunk *da = (Elf_Data_Chunk *)a; ++ Elf_Data_Chunk *db = (Elf_Data_Chunk *)b; ++ ++ if (da->offset != db->offset) ++ return da->offset - db->offset; ++ ++ if (da->data.d.d_size != db->data.d.d_size) ++ return da->data.d.d_size - db->data.d.d_size; ++ ++ return da->data.d.d_type - db->data.d.d_type; ++} ++ + Elf_Data * + elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) + { +@@ -75,19 +91,25 @@ elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) + rwlock_rdlock (elf->lock); + + /* Maybe we already got this chunk? */ +- Elf_Data_Chunk *rawchunks = elf->state.elf.rawchunks; +- while (rawchunks != NULL) ++ Elf_Data_Chunk key; ++ key.offset = offset; ++ key.data.d.d_size = size; ++ key.data.d.d_type = type; ++ Elf_Data_Chunk **found = tsearch (&key, &elf->state.elf.rawchunks, ++ &chunk_compare); ++ if (found == NULL) ++ goto nomem; ++ ++ /* Existing entry. */ ++ if (*found != &key && *found != NULL) + { +- if ((rawchunks->offset == offset || size == 0) +- && rawchunks->data.d.d_size == size +- && rawchunks->data.d.d_type == type) +- { +- result = &rawchunks->data.d; +- goto out; +- } +- rawchunks = rawchunks->next; ++ result = &(*found)->data.d; ++ goto out; + } + ++ /* New entry. */ ++ *found = NULL; ++ + size_t align = __libelf_type_align (elf->class, type); + if (elf->map_address != NULL) + { +@@ -189,8 +211,7 @@ elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) + rwlock_unlock (elf->lock); + rwlock_wrlock (elf->lock); + +- chunk->next = elf->state.elf.rawchunks; +- elf->state.elf.rawchunks = chunk; ++ *found = chunk; + result = &chunk->data.d; + + out: +diff --git a/libelf/libelfP.h b/libelf/libelfP.h +index 6624f38a..d3c241e5 100644 +--- a/libelf/libelfP.h ++++ b/libelf/libelfP.h +@@ -1,5 +1,6 @@ + /* Internal interfaces for libelf. + Copyright (C) 1998-2010, 2015, 2016 Red Hat, Inc. ++ Copyright (C) 2023 Mark J. Wielaard + This file is part of elfutils. + Contributed by Ulrich Drepper , 1998. + +@@ -262,11 +263,7 @@ typedef struct Elf_ScnList + typedef struct Elf_Data_Chunk + { + Elf_Data_Scn data; +- union +- { +- Elf_Scn dummy_scn; +- struct Elf_Data_Chunk *next; +- }; ++ Elf_Scn dummy_scn; + int64_t offset; /* The original raw offset in the Elf image. */ + } Elf_Data_Chunk; + +@@ -324,7 +321,7 @@ struct Elf + Elf_ScnList *scns_last; /* Last element in the section list. + If NULL the data has not yet been + read from the file. */ +- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ ++ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ + unsigned int scnincr; /* Number of sections allocate the last + time. */ + int ehdr_flags; /* Flags (dirty) for ELF header. */ +@@ -343,7 +340,7 @@ struct Elf + Elf_ScnList *scns_last; /* Last element in the section list. + If NULL the data has not yet been + read from the file. */ +- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ ++ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ + unsigned int scnincr; /* Number of sections allocate the last + time. */ + int ehdr_flags; /* Flags (dirty) for ELF header. */ +@@ -368,7 +365,7 @@ struct Elf + Elf_ScnList *scns_last; /* Last element in the section list. + If NULL the data has not yet been + read from the file. */ +- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ ++ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ + unsigned int scnincr; /* Number of sections allocate the last + time. */ + int ehdr_flags; /* Flags (dirty) for ELF header. */ +-- +2.40.1 + diff --git a/elfutils.spec b/elfutils.spec index 86f3b34..7955ff1 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -78,6 +78,8 @@ Patch1: elfutils-0.186-fdo-swap.patch Patch2: elfutils-0.189-c99-compat.patch # elfcompress: Don't compress if section already compressed unless forced Patch3: elfutils-0.189-elfcompress.patch +# libelf: Replace list of elf_getdata_rawchunk results with a tree +Patch4: elfutils-0.189-elf_getdata_rawchunk.patch %description Elfutils is a collection of utilities, including stack (to show @@ -446,6 +448,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Thu Jun 22 2023 Mark Wielaard +- Add elfutils-0.189-elf_getdata_rawchunk.patch + * Sat Apr 22 2023 Mark Wielaard - 0.189-2 - Add elfutils-0.189-c99-compat.patch - Add elfutils-0.189-elfcompress.patch From dc22742a6111d91a6c0a50e6587cc158cb73a6cd Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 22 Jun 2023 15:10:49 +0200 Subject: [PATCH 16/56] 0.189-3 - Add elfutils-0.189-debuginfod_config_cache-double-close.patch --- ...debuginfod_config_cache-double-close.patch | 73 +++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.189-debuginfod_config_cache-double-close.patch diff --git a/elfutils-0.189-debuginfod_config_cache-double-close.patch b/elfutils-0.189-debuginfod_config_cache-double-close.patch new file mode 100644 index 0000000..3380b71 --- /dev/null +++ b/elfutils-0.189-debuginfod_config_cache-double-close.patch @@ -0,0 +1,73 @@ +diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c +index ef4d47e3..d92d8d62 100644 +--- a/debuginfod/debuginfod-client.c ++++ b/debuginfod/debuginfod-client.c +@@ -248,7 +248,7 @@ debuginfod_write_callback (char *ptr, size_t size, size_t nmemb, void *data) + + /* handle config file read and write */ + static int +-debuginfod_config_cache(char *config_path, ++debuginfod_config_cache(debuginfod_client *c, char *config_path, + long cache_config_default_s, + struct stat *st) + { +@@ -277,17 +277,27 @@ debuginfod_config_cache(char *config_path, + } + + long cache_config; ++ /* PR29696 - NB: When using fdopen, the file descriptor is NOT ++ dup'ed and will be closed when the stream is closed. Manually ++ closing fd after fclose is called will lead to a race condition ++ where, if reused, the file descriptor will compete for its ++ regular use before being incorrectly closed here. */ + FILE *config_file = fdopen(fd, "r"); + if (config_file) + { + if (fscanf(config_file, "%ld", &cache_config) != 1) +- cache_config = cache_config_default_s; +- fclose(config_file); ++ cache_config = cache_config_default_s; ++ if (0 != fclose (config_file) && c->verbose_fd >= 0) ++ dprintf (c->verbose_fd, "fclose failed with %s (err=%d)\n", ++ strerror (errno), errno); + } + else +- cache_config = cache_config_default_s; +- +- close (fd); ++ { ++ cache_config = cache_config_default_s; ++ if (0 != close (fd) && c->verbose_fd >= 0) ++ dprintf (c->verbose_fd, "close failed with %s (err=%d)\n", ++ strerror (errno), errno); ++ } + return cache_config; + } + +@@ -303,7 +313,7 @@ debuginfod_clean_cache(debuginfod_client *c, + struct stat st; + + /* Create new interval file. */ +- rc = debuginfod_config_cache(interval_path, ++ rc = debuginfod_config_cache(c, interval_path, + cache_clean_default_interval_s, &st); + if (rc < 0) + return rc; +@@ -320,7 +330,7 @@ debuginfod_clean_cache(debuginfod_client *c, + utime (interval_path, NULL); + + /* Read max unused age value from config file. */ +- rc = debuginfod_config_cache(max_unused_path, ++ rc = debuginfod_config_cache(c, max_unused_path, + cache_default_max_unused_age_s, &st); + if (rc < 0) + return rc; +@@ -1110,7 +1135,7 @@ debuginfod_query_server (debuginfod_client *c, + + close(fd); /* no need to hold onto the negative-hit file descriptor */ + +- rc = debuginfod_config_cache(cache_miss_path, ++ rc = debuginfod_config_cache(c, cache_miss_path, + cache_miss_default_s, &st); + if (rc < 0) + goto out; diff --git a/elfutils.spec b/elfutils.spec index 7955ff1..c27e88f 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.189 -%global baserelease 2 +%global baserelease 3 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -80,6 +80,8 @@ Patch2: elfutils-0.189-c99-compat.patch Patch3: elfutils-0.189-elfcompress.patch # libelf: Replace list of elf_getdata_rawchunk results with a tree Patch4: elfutils-0.189-elf_getdata_rawchunk.patch +# PR29696: Removed secondary fd close in cache config causing race condition +Patch5: elfutils-0.189-debuginfod_config_cache-double-close.patch %description Elfutils is a collection of utilities, including stack (to show @@ -448,8 +450,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog -* Thu Jun 22 2023 Mark Wielaard +* Thu Jun 22 2023 Mark Wielaard - 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 - 0.189-2 - Add elfutils-0.189-c99-compat.patch From 62b5826af2a93fa9108d5c1407e6f24ecaa21860 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 19 Jul 2023 18:20:35 +0000 Subject: [PATCH 17/56] Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index c27e88f..24dc195 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.189 -%global baserelease 3 +%global baserelease 4 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -450,6 +450,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Jul 19 2023 Fedora Release Engineering - 0.189-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + * Thu Jun 22 2023 Mark Wielaard - 0.189-3 - Add elfutils-0.189-elf_getdata_rawchunk.patch - Add elfutils-0.189-debuginfod_config_cache-double-close.patch From 62589988718e8fac4fb39ec5037f51839f05951b Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 24 Aug 2023 00:16:51 +0200 Subject: [PATCH 18/56] 0.189-5 - Add elfutils-0.189-relr.patch --- elfutils-0.189-relr.patch | 446 ++++++++++++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 452 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.189-relr.patch diff --git a/elfutils-0.189-relr.patch b/elfutils-0.189-relr.patch new file mode 100644 index 0000000..29a7b73 --- /dev/null +++ b/elfutils-0.189-relr.patch @@ -0,0 +1,446 @@ +commit 6ba977ed6c7ac6e51350f2093ebe0b90ff89f90c +Author: Mark Wielaard +Date: Sun Jul 23 23:14:31 2023 +0200 + + libelf, readelf, elflint: Add RELR support + + Handle RELR as defined here: + https://groups.google.com/g/generic-abi/c/bX460iggiKg/m/YT2RrjpMAwAJ + + Introduce new ELF_T_RELR Elf_Type and handle it for SHT_RELR. Check + various properties in elflint. Print RELR relocations in + readelf. Just the entries with -U. Just the addresses with -N. And + addresses pluse symbol/offsets by default. + + * libebl/eblsectiontypename.c (ebl_section_type_name): Add RELR + to knownstype. + * libelf/elf32_updatenull.c (updatenull_wrlock): Handle + sh_entsize for SHT_RELR. + * libelf/gelf.h (Gelf_Relr): New typedef for Elf64_Relr. + * libelf/gelf_fsize.c (__libelf_type_sizes): Add ELF_T_RELR. + * libelf/gelf_xlate.c (__elf_xfctstom): Likewise. + * libelf/gelf_xlate.h: Add RELR as FUNDAMENTAL. + * libelf/libelf.h (Elf_Type): Add ELF_T_RELR. + * libelf/libelfP.h: Define ELF32_FSZ_RELR and ELF64_FSZ_RELR. + * src/elflint.c (check_reloc_shdr): Check she_entsize for + ELF_T_RELR. + (check_relr): New function. + (check_dynamic): Handle DT_RELR. + (special_sections): Add SHT_RELR. + (check_sections): Call check_relr. + * src/readelf.c (print_relocs): Also accept a Dwfl_Module. + (handle_relocs_relr): New function. + (print_dwarf_addr): Make static and declare early. + (process_elf_file): Pass dwflmod to print_relocs. + (handle_dynamic): Handle DT_RELRSZ and DTRELRENT. + + Signed-off-by: Mark Wielaard + +diff --git a/libebl/eblsectiontypename.c b/libebl/eblsectiontypename.c +index 2008b95a..ade25d4a 100644 +--- a/libebl/eblsectiontypename.c ++++ b/libebl/eblsectiontypename.c +@@ -61,7 +61,8 @@ ebl_section_type_name (Ebl *ebl, int section, char *buf, size_t len) + KNOWNSTYPE (FINI_ARRAY), + KNOWNSTYPE (PREINIT_ARRAY), + KNOWNSTYPE (GROUP), +- KNOWNSTYPE (SYMTAB_SHNDX) ++ KNOWNSTYPE (SYMTAB_SHNDX), ++ KNOWNSTYPE (RELR) + }; + + /* Handle standard names. */ +diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c +index 6c06e5e4..c5d26b00 100644 +--- a/libelf/elf32_updatenull.c ++++ b/libelf/elf32_updatenull.c +@@ -256,6 +256,9 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum) + case SHT_SUNW_syminfo: + sh_entsize = elf_typesize (LIBELFBITS, ELF_T_SYMINFO, 1); + break; ++ case SHT_RELR: ++ sh_entsize = elf_typesize (LIBELFBITS, ELF_T_RELR, 1); ++ break; + default: + break; + } +diff --git a/libelf/gelf.h b/libelf/gelf.h +index 7a3c87aa..f032d7e1 100644 +--- a/libelf/gelf.h ++++ b/libelf/gelf.h +@@ -82,6 +82,9 @@ typedef Elf64_Rel GElf_Rel; + /* Relocation table entry with addend (in section of type SHT_RELA). */ + typedef Elf64_Rela GElf_Rela; + ++/* Relative relocation entry (in section of type SHT_RELR). */ ++typedef Elf64_Relr Gelf_Relr; ++ + /* Program segment header. */ + typedef Elf64_Phdr GElf_Phdr; + +diff --git a/libelf/gelf_fsize.c b/libelf/gelf_fsize.c +index 493d7916..63bcbae5 100644 +--- a/libelf/gelf_fsize.c ++++ b/libelf/gelf_fsize.c +@@ -69,7 +69,8 @@ const size_t __libelf_type_sizes[ELFCLASSNUM - 1][ELF_T_NUM] = + [ELF_T_LIB] = sizeof (ElfW2(LIBELFBITS, Ext_Lib)), \ + [ELF_T_AUXV] = sizeof (ElfW2(LIBELFBITS, Ext_auxv_t)), \ + [ELF_T_CHDR] = sizeof (ElfW2(LIBELFBITS, Ext_Chdr)), \ +- [ELF_T_GNUHASH] = ELFW2(LIBELFBITS, FSZ_WORD) ++ [ELF_T_GNUHASH] = ELFW2(LIBELFBITS, FSZ_WORD), \ ++ [ELF_T_RELR] = ELFW2(LIBELFBITS, FSZ_RELR) + TYPE_SIZES (32) + }, + [ELFCLASS64 - 1] = { +diff --git a/libelf/gelf_xlate.c b/libelf/gelf_xlate.c +index d8ad0634..749da1a1 100644 +--- a/libelf/gelf_xlate.c ++++ b/libelf/gelf_xlate.c +@@ -204,7 +204,8 @@ const xfct_t __elf_xfctstom[ELFCLASSNUM - 1][ELF_T_NUM] = + [ELF_T_MOVE] = ElfW2(Bits, cvt_Move), \ + [ELF_T_LIB] = ElfW2(Bits, cvt_Lib), \ + [ELF_T_AUXV] = ElfW2(Bits, cvt_auxv_t), \ +- [ELF_T_CHDR] = ElfW2(Bits, cvt_chdr) ++ [ELF_T_CHDR] = ElfW2(Bits, cvt_chdr), \ ++ [ELF_T_RELR] = ElfW2(Bits, cvt_Relr) + define_xfcts (32), + [ELF_T_GNUHASH] = Elf32_cvt_Word + }, +diff --git a/libelf/gelf_xlate.h b/libelf/gelf_xlate.h +index 3c0e4bf6..d5511c34 100644 +--- a/libelf/gelf_xlate.h ++++ b/libelf/gelf_xlate.h +@@ -36,6 +36,7 @@ FUNDAMENTAL (WORD, Word, LIBELFBITS); + FUNDAMENTAL (SWORD, Sword, LIBELFBITS); + FUNDAMENTAL (XWORD, Xword, LIBELFBITS); + FUNDAMENTAL (SXWORD, Sxword, LIBELFBITS); ++FUNDAMENTAL (RELR, Relr, LIBELFBITS); + + /* The structured types. */ + TYPE (Ehdr, LIBELFBITS) +diff --git a/libelf/libelf.h b/libelf/libelf.h +index 2374a48a..2837db72 100644 +--- a/libelf/libelf.h ++++ b/libelf/libelf.h +@@ -124,6 +124,7 @@ typedef enum + ELF_T_CHDR, /* Compressed, Elf32_Chdr, Elf64_Chdr, ... */ + ELF_T_NHDR8, /* Special GNU Properties note. Same as Nhdr, + except padding. */ ++ ELF_T_RELR, /* Relative relocation entry. */ + /* Keep this the last entry. */ + ELF_T_NUM + } Elf_Type; +diff --git a/libelf/libelfP.h b/libelf/libelfP.h +index d3c241e5..96476064 100644 +--- a/libelf/libelfP.h ++++ b/libelf/libelfP.h +@@ -63,6 +63,7 @@ + #define ELF32_FSZ_SWORD 4 + #define ELF32_FSZ_XWORD 8 + #define ELF32_FSZ_SXWORD 8 ++#define ELF32_FSZ_RELR 4 + + /* Same for 64 bits objects. */ + #define ELF64_FSZ_ADDR 8 +@@ -72,6 +73,7 @@ + #define ELF64_FSZ_SWORD 4 + #define ELF64_FSZ_XWORD 8 + #define ELF64_FSZ_SXWORD 8 ++#define ELF64_FSZ_RELR 8 + + + /* This is an extension of the ELF_F_* enumeration. The values here are +diff --git a/src/elflint.c b/src/elflint.c +index dd42dcb4..864de710 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -1,5 +1,6 @@ + /* Pedantic checking of ELF files compliance with gABI/psABI spec. + Copyright (C) 2001-2015, 2017, 2018 Red Hat, Inc. ++ Copyright (C) 2023 Mark J. Wielaard + This file is part of elfutils. + Written by Ulrich Drepper , 2001. + +@@ -1291,10 +1292,20 @@ section [%2d] '%s': no relocations for merge-able string sections possible\n"), + + size_t sh_entsize = gelf_fsize (ebl->elf, reltype, 1, EV_CURRENT); + if (shdr->sh_entsize != sh_entsize) +- ERROR (_(reltype == ELF_T_RELA ? "\ +-section [%2d] '%s': section entry size does not match ElfXX_Rela\n" : "\ +-section [%2d] '%s': section entry size does not match ElfXX_Rel\n"), +- idx, section_name (ebl, idx)); ++ { ++ if (reltype == ELF_T_RELA) ++ ERROR ("\ ++section [%2d] '%s': section entry size does not match ElfXX_Rela\n", ++ idx, section_name (ebl, idx)); ++ else if (reltype == ELF_T_REL) ++ ERROR ("\ ++section [%2d] '%s': section entry size does not match ElfXX_Rel\n", ++ idx, section_name (ebl, idx)); ++ else ++ ERROR ("\ ++section [%2d] '%s': section entry size does not match ElfXX_Relr\n", ++ idx, section_name (ebl, idx)); ++ } + + /* In preparation of checking whether relocations are text + relocations or not we need to determine whether the file is +@@ -1590,6 +1601,32 @@ section [%2d] '%s': cannot get relocation %zu: %s\n"), + } + } + ++static void ++check_relr (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx) ++{ ++ Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL); ++ if (data == NULL) ++ { ++ ERROR (_("section [%2d] '%s': cannot get section data\n"), ++ idx, section_name (ebl, idx)); ++ return; ++ } ++ ++ /* Check the fields of the section header. */ ++ GElf_Shdr destshdr_mem; ++ GElf_Shdr *destshdr = NULL; ++ struct loaded_segment *loaded = NULL; ++ check_reloc_shdr (ebl, ehdr, shdr, idx, ELF_T_RELR, &destshdr, ++ &destshdr_mem, &loaded); ++ ++ /* Just throw them away. */ ++ while (loaded != NULL) ++ { ++ struct loaded_segment *old = loaded; ++ loaded = loaded->next; ++ free (old); ++ } ++} + + /* Number of dynamic sections. */ + static int ndynamic; +@@ -1780,6 +1817,7 @@ section [%2d] '%s': entry %zu: pointer does not match address of section [%2d] ' + case DT_PLTGOT: + case DT_REL: + case DT_RELA: ++ case DT_RELR: + case DT_SYMBOLIC: + case DT_SYMTAB: + case DT_VERDEF: +@@ -3660,6 +3698,7 @@ static const struct + { ".plt", 5, SHT_PROGBITS, unused, 0, 0 }, // XXX more tests + { ".preinit_array", 15, SHT_PREINIT_ARRAY, exact, SHF_ALLOC | SHF_WRITE, 0 }, + { ".rela", 5, SHT_RELA, atleast, 0, SHF_ALLOC | SHF_INFO_LINK }, // XXX more tests ++ { ".relr", 5, SHT_RELR, atleast, 0, SHF_ALLOC }, // XXX more tests + { ".rel", 4, SHT_REL, atleast, 0, SHF_ALLOC | SHF_INFO_LINK }, // XXX more tests + { ".rodata", 8, SHT_PROGBITS, atleast, SHF_ALLOC, SHF_MERGE | SHF_STRINGS }, + { ".rodata1", 9, SHT_PROGBITS, atleast, SHF_ALLOC, SHF_MERGE | SHF_STRINGS }, +@@ -4182,6 +4221,10 @@ section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"), + check_rel (ebl, ehdr, shdr, cnt); + break; + ++ case SHT_RELR: ++ check_relr (ebl, ehdr, shdr, cnt); ++ break; ++ + case SHT_DYNAMIC: + check_dynamic (ebl, ehdr, shdr, cnt); + break; +diff --git a/src/readelf.c b/src/readelf.c +index eda0ce09..db31ad09 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -1,5 +1,6 @@ + /* Print information from ELF file in human-readable form. + Copyright (C) 1999-2018 Red Hat, Inc. ++ Copyright (C) 2023 Mark J. Wielaard + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -302,11 +302,13 @@ + static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr); + static void print_scngrp (Ebl *ebl); + static void print_dynamic (Ebl *ebl); +-static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr); ++static void print_relocs (Ebl *ebl, Dwfl_Module *mod, GElf_Ehdr *ehdr); + static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, + GElf_Shdr *shdr); + static void handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, + GElf_Shdr *shdr); ++static void handle_relocs_relr (Ebl *ebl, Dwfl_Module *mod, Elf_Scn *scn, ++ GElf_Shdr *shdr); + static bool print_symtab (Ebl *ebl, int type); + static void handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr); + static void print_verinfo (Ebl *ebl); +@@ -336,6 +339,8 @@ static void dump_data (Ebl *ebl); + static void dump_strings (Ebl *ebl); + static void print_strings (Ebl *ebl); + static void dump_archive_index (Elf *, const char *); ++static void print_dwarf_addr (Dwfl_Module *dwflmod, int address_size, ++ Dwarf_Addr address, Dwarf_Addr raw); + + enum dyn_idx + { +@@ -1052,7 +1057,7 @@ process_elf_file (Dwfl_Module *dwflmod, int fd) + if (print_dynamic_table) + print_dynamic (ebl); + if (print_relocations) +- print_relocs (pure_ebl, ehdr); ++ print_relocs (pure_ebl, dwflmod, ehdr); + if (print_histogram) + handle_hash (ebl); + if (print_symbol_table || print_dynsym_table) +@@ -1971,9 +1976,11 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr) + case DT_RELASZ: + case DT_STRSZ: + case DT_RELSZ: ++ case DT_RELRSZ: + case DT_RELAENT: + case DT_SYMENT: + case DT_RELENT: ++ case DT_RELRENT: + case DT_PLTPADSZ: + case DT_MOVEENT: + case DT_MOVESZ: +@@ -2049,7 +2056,7 @@ print_dynamic (Ebl *ebl) + + /* Print relocations. */ + static void +-print_relocs (Ebl *ebl, GElf_Ehdr *ehdr) ++print_relocs (Ebl *ebl, Dwfl_Module *mod, GElf_Ehdr *ehdr) + { + /* Find all relocation sections and handle them. */ + Elf_Scn *scn = NULL; +@@ -2066,6 +2073,8 @@ print_relocs (Ebl *ebl, GElf_Ehdr *ehdr) + handle_relocs_rel (ebl, ehdr, scn, shdr); + else if (shdr->sh_type == SHT_RELA) + handle_relocs_rela (ebl, ehdr, scn, shdr); ++ else if (shdr->sh_type == SHT_RELR) ++ handle_relocs_relr (ebl, mod, scn, shdr); + } + } + } +@@ -2454,6 +2463,114 @@ handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr) + } + } + ++/* Handle a relocation section. */ ++static void ++handle_relocs_relr (Ebl *ebl, Dwfl_Module *mod, Elf_Scn *scn, GElf_Shdr *shdr) ++{ ++ int class = gelf_getclass (ebl->elf); ++ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_RELR, 1, EV_CURRENT); ++ int nentries = shdr->sh_size / sh_entsize; ++ ++ /* Get the data of the section. */ ++ Elf_Data *data = elf_getdata (scn, NULL); ++ if (data == NULL) ++ return; ++ ++ /* Get the section header string table index. */ ++ size_t shstrndx; ++ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)) ++ error_exit (0, _("cannot get section header string table index")); ++ ++ /* A .relr.dyn section does not refer to a specific section. */ ++ printf (ngettext ("\ ++\nRelocation section [%2u] '%s' at offset %#0" PRIx64 " contains %d entry:\n", ++ "\ ++\nRelocation section [%2u] '%s' at offset %#0" PRIx64 " contains %d entries:\n", ++ nentries), ++ (unsigned int) elf_ndxscn (scn), ++ elf_strptr (ebl->elf, shstrndx, shdr->sh_name), ++ shdr->sh_offset, ++ nentries); ++ ++ if (class == ELFCLASS32) ++ { ++ uint32_t base = 0; ++ for (int cnt = 0; cnt < nentries; ++cnt) ++ { ++ Elf32_Word *words = data->d_buf; ++ Elf32_Word entry = words[cnt]; ++ ++ /* Just the raw entries? */ ++ if (print_unresolved_addresses) ++ printf (" %#010" PRIx32 "%s\n", entry, ++ (entry & 1) == 0 ? " *" : ""); ++ else ++ { ++ /* A real address, also sets base. */ ++ if ((entry & 1) == 0) ++ { ++ printf (" "); ++ print_dwarf_addr (mod, 4, entry, entry); ++ printf (" *\n"); ++ ++ base = entry + 4; ++ } ++ else ++ { ++ /* Untangle address from base and bits. */ ++ uint32_t addr; ++ for (addr = base; (entry >>= 1) != 0; addr += 4) ++ if ((entry & 1) != 0) ++ { ++ printf (" "); ++ print_dwarf_addr (mod, 4, addr, addr); ++ printf ("\n"); ++ } ++ base += 4 * (4 * 8 - 1); ++ } ++ } ++ } ++ } ++ else ++ { ++ uint64_t base = 0; ++ for (int cnt = 0; cnt < nentries; ++cnt) ++ { ++ Elf64_Xword *xwords = data->d_buf; ++ Elf64_Xword entry = xwords[cnt]; ++ ++ /* Just the raw entries? */ ++ if (print_unresolved_addresses) ++ printf (" %#018" PRIx64 "%s\n", entry, ++ (entry & 1) == 0 ? " *" : ""); ++ else ++ { ++ /* A real address, also sets base. */ ++ if ((entry & 1) == 0) ++ { ++ printf (" "); ++ print_dwarf_addr (mod, 8, entry, entry); ++ printf (" *\n"); ++ ++ base = entry + 8; ++ } ++ else ++ { ++ /* Untangle address from base and bits. */ ++ uint64_t addr; ++ for (addr = base; (entry >>= 1) != 0; addr += 8) ++ if ((entry & 1) != 0) ++ { ++ printf (" "); ++ print_dwarf_addr (mod, 8, addr, addr); ++ printf ("\n"); ++ } ++ base += 8 * (8 * 8 - 1); ++ } ++ } ++ } ++ } ++} + + /* Print the program header. Return true if a symtab is printed, + false otherwise. */ +@@ -4107,7 +4224,7 @@ get_debug_elf_data (Dwarf *dbg, Ebl *ebl, int idx, Elf_Scn *scn) + return elf_getdata (scn, NULL); + } + +-void ++static void + print_dwarf_addr (Dwfl_Module *dwflmod, + int address_size, Dwarf_Addr address, Dwarf_Addr raw) + { diff --git a/elfutils.spec b/elfutils.spec index 24dc195..2b4cb14 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.189 -%global baserelease 4 +%global baserelease 5 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -82,6 +82,8 @@ Patch3: elfutils-0.189-elfcompress.patch Patch4: elfutils-0.189-elf_getdata_rawchunk.patch # PR29696: Removed secondary fd close in cache config causing race condition Patch5: elfutils-0.189-debuginfod_config_cache-double-close.patch +# Bug 28495 - Add support for SHT_RELR to eu-readelf +Patch6: elfutils-0.189-relr.patch %description Elfutils is a collection of utilities, including stack (to show @@ -450,6 +452,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Aug 23 2023 Mark Wielaard - 0.189-5 +- Add elfutils-0.189-relr.patch + * Wed Jul 19 2023 Fedora Release Engineering - 0.189-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild From 87c5e66753fb9f61bf424d3306f0414e31647aae Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 25 Aug 2023 01:15:22 +0200 Subject: [PATCH 19/56] 0.189-6 - Update elfutils-0.189-relr.patch --- elfutils-0.189-relr.patch | 39 +++++++++++++++++++++++++++++++-------- elfutils.spec | 5 ++++- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/elfutils-0.189-relr.patch b/elfutils-0.189-relr.patch index 29a7b73..2814104 100644 --- a/elfutils-0.189-relr.patch +++ b/elfutils-0.189-relr.patch @@ -1,4 +1,4 @@ -commit 6ba977ed6c7ac6e51350f2093ebe0b90ff89f90c +commit e7648c87478ccc337c92841c7785387dd391f954 Author: Mark Wielaard Date: Sun Jul 23 23:14:31 2023 +0200 @@ -10,17 +10,18 @@ Date: Sun Jul 23 23:14:31 2023 +0200 Introduce new ELF_T_RELR Elf_Type and handle it for SHT_RELR. Check various properties in elflint. Print RELR relocations in readelf. Just the entries with -U. Just the addresses with -N. And - addresses pluse symbol/offsets by default. + addresses plus symbol/offsets by default. * libebl/eblsectiontypename.c (ebl_section_type_name): Add RELR to knownstype. * libelf/elf32_updatenull.c (updatenull_wrlock): Handle sh_entsize for SHT_RELR. - * libelf/gelf.h (Gelf_Relr): New typedef for Elf64_Relr. + * libelf/gelf.h (GElf_Relr): New typedef for Elf64_Relr. * libelf/gelf_fsize.c (__libelf_type_sizes): Add ELF_T_RELR. * libelf/gelf_xlate.c (__elf_xfctstom): Likewise. * libelf/gelf_xlate.h: Add RELR as FUNDAMENTAL. - * libelf/libelf.h (Elf_Type): Add ELF_T_RELR. + * libelf/libelf.h (Elf_Type): Add ELF_T_RELR. Add RELR + defines/typedefs if undefined in system elf.h. * libelf/libelfP.h: Define ELF32_FSZ_RELR and ELF64_FSZ_RELR. * src/elflint.c (check_reloc_shdr): Check she_entsize for ELF_T_RELR. @@ -34,6 +35,8 @@ Date: Sun Jul 23 23:14:31 2023 +0200 (process_elf_file): Pass dwflmod to print_relocs. (handle_dynamic): Handle DT_RELRSZ and DTRELRENT. + https://sourceware.org/bugzilla/show_bug.cgi?id=28495 + Signed-off-by: Mark Wielaard diff --git a/libebl/eblsectiontypename.c b/libebl/eblsectiontypename.c @@ -65,7 +68,7 @@ index 6c06e5e4..c5d26b00 100644 break; } diff --git a/libelf/gelf.h b/libelf/gelf.h -index 7a3c87aa..f032d7e1 100644 +index 7a3c87aa..1847021e 100644 --- a/libelf/gelf.h +++ b/libelf/gelf.h @@ -82,6 +82,9 @@ typedef Elf64_Rel GElf_Rel; @@ -73,7 +76,7 @@ index 7a3c87aa..f032d7e1 100644 typedef Elf64_Rela GElf_Rela; +/* Relative relocation entry (in section of type SHT_RELR). */ -+typedef Elf64_Relr Gelf_Relr; ++typedef Elf64_Relr GElf_Relr; + /* Program segment header. */ typedef Elf64_Phdr GElf_Phdr; @@ -119,10 +122,30 @@ index 3c0e4bf6..d5511c34 100644 /* The structured types. */ TYPE (Ehdr, LIBELFBITS) diff --git a/libelf/libelf.h b/libelf/libelf.h -index 2374a48a..2837db72 100644 +index 2374a48a..458a1fad 100644 --- a/libelf/libelf.h +++ b/libelf/libelf.h -@@ -124,6 +124,7 @@ typedef enum +@@ -69,6 +69,19 @@ + #define ELFCOMPRESS_ZSTD 2 /* Zstandard algorithm. */ + #endif + ++#ifndef SHT_RELR ++ /* So RELR defines/typedefs can be used even with an old system elf.h. */ ++ #define SHT_RELR 19 /* RELR relative relocations */ ++ ++ /* RELR relocation table entry */ ++ typedef Elf32_Word Elf32_Relr; ++ typedef Elf64_Xword Elf64_Relr; ++ ++ #define DT_RELRSZ 35 /* Total size of RELR relative relocations */ ++ #define DT_RELR 36 /* Address of RELR relative relocations */ ++ #define DT_RELRENT 37 /* Size of one RELR relative relocaction */ ++#endif ++ + #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) + # define __nonnull_attribute__(...) __attribute__ ((__nonnull__ (__VA_ARGS__))) + # define __deprecated_attribute__ __attribute__ ((__deprecated__)) +@@ -124,6 +137,7 @@ typedef enum ELF_T_CHDR, /* Compressed, Elf32_Chdr, Elf64_Chdr, ... */ ELF_T_NHDR8, /* Special GNU Properties note. Same as Nhdr, except padding. */ diff --git a/elfutils.spec b/elfutils.spec index 2b4cb14..c164f1d 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.189 -%global baserelease 5 +%global baserelease 6 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -452,6 +452,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Thu Aug 24 2023 Mark Wielaard - 0.189-6 +- Update elfutils-0.189-relr.patch + * Wed Aug 23 2023 Mark Wielaard - 0.189-5 - Add elfutils-0.189-relr.patch From d6169014dd19a04b254b15f7dbd4ee269b620c9c Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 3 Nov 2023 21:11:40 +0100 Subject: [PATCH 20/56] 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 --- .gitignore | 1 + elfutils-0.189-c99-compat.patch | 31 -- ...debuginfod_config_cache-double-close.patch | 73 --- elfutils-0.189-elf_getdata_rawchunk.patch | 224 --------- elfutils-0.189-elfcompress.patch | 95 ---- elfutils-0.189-relr.patch | 469 ------------------ elfutils.spec | 27 +- sources | 2 +- 8 files changed, 16 insertions(+), 906 deletions(-) delete mode 100644 elfutils-0.189-c99-compat.patch delete mode 100644 elfutils-0.189-debuginfod_config_cache-double-close.patch delete mode 100644 elfutils-0.189-elf_getdata_rawchunk.patch delete mode 100644 elfutils-0.189-elfcompress.patch delete mode 100644 elfutils-0.189-relr.patch diff --git a/.gitignore b/.gitignore index 9d73fa8..eb85273 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ /elfutils-0.187.tar.bz2 /elfutils-0.188.tar.bz2 /elfutils-0.189.tar.bz2 +/elfutils-0.190.tar.bz2 diff --git a/elfutils-0.189-c99-compat.patch b/elfutils-0.189-c99-compat.patch deleted file mode 100644 index 4932c2c..0000000 --- a/elfutils-0.189-c99-compat.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 6e7ac623674242628c9e54892a532d55d3288bb8 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Sat, 22 Apr 2023 21:37:09 +0200 -Subject: [PATCH] testsuite: Avoid C99 compatibility issues in - run-native-test.sh - -Include for the pause function, and add the return type -of main. Avoids an implicit function declaration and implicit int. - -Signed-off-by: Florian Weimer ---- - tests/run-native-test.sh | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/tests/run-native-test.sh b/tests/run-native-test.sh -index d19007f2..042a51c6 100755 ---- a/tests/run-native-test.sh -+++ b/tests/run-native-test.sh -@@ -27,7 +27,8 @@ - # in all builds. - - tempfiles native.c native --echo 'main () { while (1) pause (); }' > native.c -+printf '#include \nint main (void) { while (1) pause (); }\n' \ -+ > native.c - - native=0 - kill_native() --- -2.31.1 - diff --git a/elfutils-0.189-debuginfod_config_cache-double-close.patch b/elfutils-0.189-debuginfod_config_cache-double-close.patch deleted file mode 100644 index 3380b71..0000000 --- a/elfutils-0.189-debuginfod_config_cache-double-close.patch +++ /dev/null @@ -1,73 +0,0 @@ -diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c -index ef4d47e3..d92d8d62 100644 ---- a/debuginfod/debuginfod-client.c -+++ b/debuginfod/debuginfod-client.c -@@ -248,7 +248,7 @@ debuginfod_write_callback (char *ptr, size_t size, size_t nmemb, void *data) - - /* handle config file read and write */ - static int --debuginfod_config_cache(char *config_path, -+debuginfod_config_cache(debuginfod_client *c, char *config_path, - long cache_config_default_s, - struct stat *st) - { -@@ -277,17 +277,27 @@ debuginfod_config_cache(char *config_path, - } - - long cache_config; -+ /* PR29696 - NB: When using fdopen, the file descriptor is NOT -+ dup'ed and will be closed when the stream is closed. Manually -+ closing fd after fclose is called will lead to a race condition -+ where, if reused, the file descriptor will compete for its -+ regular use before being incorrectly closed here. */ - FILE *config_file = fdopen(fd, "r"); - if (config_file) - { - if (fscanf(config_file, "%ld", &cache_config) != 1) -- cache_config = cache_config_default_s; -- fclose(config_file); -+ cache_config = cache_config_default_s; -+ if (0 != fclose (config_file) && c->verbose_fd >= 0) -+ dprintf (c->verbose_fd, "fclose failed with %s (err=%d)\n", -+ strerror (errno), errno); - } - else -- cache_config = cache_config_default_s; -- -- close (fd); -+ { -+ cache_config = cache_config_default_s; -+ if (0 != close (fd) && c->verbose_fd >= 0) -+ dprintf (c->verbose_fd, "close failed with %s (err=%d)\n", -+ strerror (errno), errno); -+ } - return cache_config; - } - -@@ -303,7 +313,7 @@ debuginfod_clean_cache(debuginfod_client *c, - struct stat st; - - /* Create new interval file. */ -- rc = debuginfod_config_cache(interval_path, -+ rc = debuginfod_config_cache(c, interval_path, - cache_clean_default_interval_s, &st); - if (rc < 0) - return rc; -@@ -320,7 +330,7 @@ debuginfod_clean_cache(debuginfod_client *c, - utime (interval_path, NULL); - - /* Read max unused age value from config file. */ -- rc = debuginfod_config_cache(max_unused_path, -+ rc = debuginfod_config_cache(c, max_unused_path, - cache_default_max_unused_age_s, &st); - if (rc < 0) - return rc; -@@ -1110,7 +1135,7 @@ debuginfod_query_server (debuginfod_client *c, - - close(fd); /* no need to hold onto the negative-hit file descriptor */ - -- rc = debuginfod_config_cache(cache_miss_path, -+ rc = debuginfod_config_cache(c, cache_miss_path, - cache_miss_default_s, &st); - if (rc < 0) - goto out; diff --git a/elfutils-0.189-elf_getdata_rawchunk.patch b/elfutils-0.189-elf_getdata_rawchunk.patch deleted file mode 100644 index 7ce6695..0000000 --- a/elfutils-0.189-elf_getdata_rawchunk.patch +++ /dev/null @@ -1,224 +0,0 @@ -From 3aca5b5f1f1617db2220022d9061dcaf129e54c4 Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Wed, 21 Jun 2023 18:05:12 +0200 -Subject: [PATCH] libelf: Replace list of elf_getdata_rawchunk results with a - tree - -elf_getdata_rawchunks did a linear search to see if a chunk was -already fetched. Replace this list with a binary search tree to make -lookup faster when a lot of Elf_Data_Chunk were created. - - * libelf/libelfP.h (Elf_Data_Chunk): Remove next field. - (struct Elf): Change the rawchunks type from Elf_Data_Chunk * - to void *. - * elf_getdata_rawchunk.c (chunk_compare): New static function. - (elf_getdata_rawchunk): Use tsearch instead of a manual linked - list. - * elf_end.c (free_chunk): New static function. - (elf_end): Call tdestroy instead of walking linked list. - -Signed-off-by: Mark Wielaard ---- - libelf/elf_end.c | 22 +++++++++------- - libelf/elf_getdata_rawchunk.c | 47 +++++++++++++++++++++++++---------- - libelf/libelfP.h | 13 ++++------ - 3 files changed, 52 insertions(+), 30 deletions(-) - -diff --git a/libelf/elf_end.c b/libelf/elf_end.c -index 5c451f36..3e5d4c86 100644 ---- a/libelf/elf_end.c -+++ b/libelf/elf_end.c -@@ -1,5 +1,6 @@ - /* Free resources associated with Elf descriptor. - Copyright (C) 1998,1999,2000,2001,2002,2004,2005,2007,2015,2016 Red Hat, Inc. -+ Copyright (C) 2023 Mark J. Wielaard - This file is part of elfutils. - Written by Ulrich Drepper , 1998. - -@@ -32,12 +33,22 @@ - #endif - - #include -+#include - #include - #include - - #include "libelfP.h" - - -+static void -+free_chunk (void *n) -+{ -+ Elf_Data_Chunk *rawchunk = (Elf_Data_Chunk *)n; -+ if (rawchunk->dummy_scn.flags & ELF_F_MALLOCED) -+ free (rawchunk->data.d.d_buf); -+ free (rawchunk); -+} -+ - int - elf_end (Elf *elf) - { -@@ -112,20 +123,13 @@ elf_end (Elf *elf) - - case ELF_K_ELF: - { -- Elf_Data_Chunk *rawchunks -+ void *rawchunks - = (elf->class == ELFCLASS32 - || (offsetof (struct Elf, state.elf32.rawchunks) - == offsetof (struct Elf, state.elf64.rawchunks)) - ? elf->state.elf32.rawchunks - : elf->state.elf64.rawchunks); -- while (rawchunks != NULL) -- { -- Elf_Data_Chunk *next = rawchunks->next; -- if (rawchunks->dummy_scn.flags & ELF_F_MALLOCED) -- free (rawchunks->data.d.d_buf); -- free (rawchunks); -- rawchunks = next; -- } -+ tdestroy (rawchunks, free_chunk); - - Elf_ScnList *list = (elf->class == ELFCLASS32 - || (offsetof (struct Elf, state.elf32.scns) -diff --git a/libelf/elf_getdata_rawchunk.c b/libelf/elf_getdata_rawchunk.c -index 5a35ccdc..cfd40396 100644 ---- a/libelf/elf_getdata_rawchunk.c -+++ b/libelf/elf_getdata_rawchunk.c -@@ -1,6 +1,6 @@ - /* Return converted data from raw chunk of ELF file. - Copyright (C) 2007, 2014, 2015 Red Hat, Inc. -- Copyright (C) 2022 Mark J. Wielaard -+ Copyright (C) 2022, 2023 Mark J. Wielaard - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -33,12 +33,28 @@ - - #include - #include -+#include - #include - #include - - #include "libelfP.h" - #include "common.h" - -+static int -+chunk_compare (const void *a, const void *b) -+{ -+ Elf_Data_Chunk *da = (Elf_Data_Chunk *)a; -+ Elf_Data_Chunk *db = (Elf_Data_Chunk *)b; -+ -+ if (da->offset != db->offset) -+ return da->offset - db->offset; -+ -+ if (da->data.d.d_size != db->data.d.d_size) -+ return da->data.d.d_size - db->data.d.d_size; -+ -+ return da->data.d.d_type - db->data.d.d_type; -+} -+ - Elf_Data * - elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) - { -@@ -75,19 +91,25 @@ elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) - rwlock_rdlock (elf->lock); - - /* Maybe we already got this chunk? */ -- Elf_Data_Chunk *rawchunks = elf->state.elf.rawchunks; -- while (rawchunks != NULL) -+ Elf_Data_Chunk key; -+ key.offset = offset; -+ key.data.d.d_size = size; -+ key.data.d.d_type = type; -+ Elf_Data_Chunk **found = tsearch (&key, &elf->state.elf.rawchunks, -+ &chunk_compare); -+ if (found == NULL) -+ goto nomem; -+ -+ /* Existing entry. */ -+ if (*found != &key && *found != NULL) - { -- if ((rawchunks->offset == offset || size == 0) -- && rawchunks->data.d.d_size == size -- && rawchunks->data.d.d_type == type) -- { -- result = &rawchunks->data.d; -- goto out; -- } -- rawchunks = rawchunks->next; -+ result = &(*found)->data.d; -+ goto out; - } - -+ /* New entry. */ -+ *found = NULL; -+ - size_t align = __libelf_type_align (elf->class, type); - if (elf->map_address != NULL) - { -@@ -189,8 +211,7 @@ elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) - rwlock_unlock (elf->lock); - rwlock_wrlock (elf->lock); - -- chunk->next = elf->state.elf.rawchunks; -- elf->state.elf.rawchunks = chunk; -+ *found = chunk; - result = &chunk->data.d; - - out: -diff --git a/libelf/libelfP.h b/libelf/libelfP.h -index 6624f38a..d3c241e5 100644 ---- a/libelf/libelfP.h -+++ b/libelf/libelfP.h -@@ -1,5 +1,6 @@ - /* Internal interfaces for libelf. - Copyright (C) 1998-2010, 2015, 2016 Red Hat, Inc. -+ Copyright (C) 2023 Mark J. Wielaard - This file is part of elfutils. - Contributed by Ulrich Drepper , 1998. - -@@ -262,11 +263,7 @@ typedef struct Elf_ScnList - typedef struct Elf_Data_Chunk - { - Elf_Data_Scn data; -- union -- { -- Elf_Scn dummy_scn; -- struct Elf_Data_Chunk *next; -- }; -+ Elf_Scn dummy_scn; - int64_t offset; /* The original raw offset in the Elf image. */ - } Elf_Data_Chunk; - -@@ -324,7 +321,7 @@ struct Elf - Elf_ScnList *scns_last; /* Last element in the section list. - If NULL the data has not yet been - read from the file. */ -- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ -+ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ - unsigned int scnincr; /* Number of sections allocate the last - time. */ - int ehdr_flags; /* Flags (dirty) for ELF header. */ -@@ -343,7 +340,7 @@ struct Elf - Elf_ScnList *scns_last; /* Last element in the section list. - If NULL the data has not yet been - read from the file. */ -- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ -+ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ - unsigned int scnincr; /* Number of sections allocate the last - time. */ - int ehdr_flags; /* Flags (dirty) for ELF header. */ -@@ -368,7 +365,7 @@ struct Elf - Elf_ScnList *scns_last; /* Last element in the section list. - If NULL the data has not yet been - read from the file. */ -- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ -+ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ - unsigned int scnincr; /* Number of sections allocate the last - time. */ - int ehdr_flags; /* Flags (dirty) for ELF header. */ --- -2.40.1 - diff --git a/elfutils-0.189-elfcompress.patch b/elfutils-0.189-elfcompress.patch deleted file mode 100644 index 5f0d681..0000000 --- a/elfutils-0.189-elfcompress.patch +++ /dev/null @@ -1,95 +0,0 @@ -From ef9164520c81ea61efe88777a8ad61bf17a54201 Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Sat, 22 Apr 2023 01:26:17 +0200 -Subject: [PATCH] elfcompress: Don't compress if section already compressed - unless forced - -Before commit a5b07cdf9 "support ZSTD compression algorithm" -elfcompress would not try to compress a section if it already -had the requested compression type (or was already uncompressed) -unless the --force flag was given. An else if construct was changed -to an if in the commit causing elfcompress to warn (in verbose mode) -but then still try to (re)compress the section. - -Add an explicit check so if nothing needs (un)compressing, the file -isn't changed. - -The diff looks large, but git diff -b -w is just: - -+ if (force || type != schtype) -+ { - if (shdr->sh_type != SHT_NOBITS - && (shdr->sh_flags & SHF_ALLOC) == 0) - { -@@ -554,6 +556,7 @@ process_file (const char *fname) - printf ("[%zd] %s ignoring %s section\n", ndx, sname, - (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); - } -+ } - -Signed-off-by: Mark Wielaard ---- - src/elfcompress.c | 43 +++++++++++++++++++++++-------------------- - 1 file changed, 23 insertions(+), 20 deletions(-) - -diff --git a/src/elfcompress.c b/src/elfcompress.c -index 18ade66f..f771b92a 100644 ---- a/src/elfcompress.c -+++ b/src/elfcompress.c -@@ -529,30 +529,33 @@ process_file (const char *fname) - } - } - -- if (shdr->sh_type != SHT_NOBITS -- && (shdr->sh_flags & SHF_ALLOC) == 0) -+ if (force || type != schtype) - { -- set_section (sections, ndx); -- /* Check if we might want to change this section name. */ -- if (! adjust_names -- && ((type != ZLIB_GNU -- && startswith (sname, ".zdebug")) -- || (type == ZLIB_GNU -- && startswith (sname, ".debug")))) -- adjust_names = true; -- -- /* We need a buffer this large if we change the names. */ -- if (adjust_names) -+ if (shdr->sh_type != SHT_NOBITS -+ && (shdr->sh_flags & SHF_ALLOC) == 0) - { -- size_t slen = strlen (sname); -- if (slen > maxnamelen) -- maxnamelen = slen; -+ set_section (sections, ndx); -+ /* Check if we might want to change this section name. */ -+ if (! adjust_names -+ && ((type != ZLIB_GNU -+ && startswith (sname, ".zdebug")) -+ || (type == ZLIB_GNU -+ && startswith (sname, ".debug")))) -+ adjust_names = true; -+ -+ /* We need a buffer this large if we change the names. */ -+ if (adjust_names) -+ { -+ size_t slen = strlen (sname); -+ if (slen > maxnamelen) -+ maxnamelen = slen; -+ } - } -+ else -+ if (verbose >= 0) -+ printf ("[%zd] %s ignoring %s section\n", ndx, sname, -+ (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); - } -- else -- if (verbose >= 0) -- printf ("[%zd] %s ignoring %s section\n", ndx, sname, -- (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); - } - - if (shdr->sh_type == SHT_SYMTAB) --- -2.31.1 - diff --git a/elfutils-0.189-relr.patch b/elfutils-0.189-relr.patch deleted file mode 100644 index 2814104..0000000 --- a/elfutils-0.189-relr.patch +++ /dev/null @@ -1,469 +0,0 @@ -commit e7648c87478ccc337c92841c7785387dd391f954 -Author: Mark Wielaard -Date: Sun Jul 23 23:14:31 2023 +0200 - - libelf, readelf, elflint: Add RELR support - - Handle RELR as defined here: - https://groups.google.com/g/generic-abi/c/bX460iggiKg/m/YT2RrjpMAwAJ - - Introduce new ELF_T_RELR Elf_Type and handle it for SHT_RELR. Check - various properties in elflint. Print RELR relocations in - readelf. Just the entries with -U. Just the addresses with -N. And - addresses plus symbol/offsets by default. - - * libebl/eblsectiontypename.c (ebl_section_type_name): Add RELR - to knownstype. - * libelf/elf32_updatenull.c (updatenull_wrlock): Handle - sh_entsize for SHT_RELR. - * libelf/gelf.h (GElf_Relr): New typedef for Elf64_Relr. - * libelf/gelf_fsize.c (__libelf_type_sizes): Add ELF_T_RELR. - * libelf/gelf_xlate.c (__elf_xfctstom): Likewise. - * libelf/gelf_xlate.h: Add RELR as FUNDAMENTAL. - * libelf/libelf.h (Elf_Type): Add ELF_T_RELR. Add RELR - defines/typedefs if undefined in system elf.h. - * libelf/libelfP.h: Define ELF32_FSZ_RELR and ELF64_FSZ_RELR. - * src/elflint.c (check_reloc_shdr): Check she_entsize for - ELF_T_RELR. - (check_relr): New function. - (check_dynamic): Handle DT_RELR. - (special_sections): Add SHT_RELR. - (check_sections): Call check_relr. - * src/readelf.c (print_relocs): Also accept a Dwfl_Module. - (handle_relocs_relr): New function. - (print_dwarf_addr): Make static and declare early. - (process_elf_file): Pass dwflmod to print_relocs. - (handle_dynamic): Handle DT_RELRSZ and DTRELRENT. - - https://sourceware.org/bugzilla/show_bug.cgi?id=28495 - - Signed-off-by: Mark Wielaard - -diff --git a/libebl/eblsectiontypename.c b/libebl/eblsectiontypename.c -index 2008b95a..ade25d4a 100644 ---- a/libebl/eblsectiontypename.c -+++ b/libebl/eblsectiontypename.c -@@ -61,7 +61,8 @@ ebl_section_type_name (Ebl *ebl, int section, char *buf, size_t len) - KNOWNSTYPE (FINI_ARRAY), - KNOWNSTYPE (PREINIT_ARRAY), - KNOWNSTYPE (GROUP), -- KNOWNSTYPE (SYMTAB_SHNDX) -+ KNOWNSTYPE (SYMTAB_SHNDX), -+ KNOWNSTYPE (RELR) - }; - - /* Handle standard names. */ -diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c -index 6c06e5e4..c5d26b00 100644 ---- a/libelf/elf32_updatenull.c -+++ b/libelf/elf32_updatenull.c -@@ -256,6 +256,9 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum) - case SHT_SUNW_syminfo: - sh_entsize = elf_typesize (LIBELFBITS, ELF_T_SYMINFO, 1); - break; -+ case SHT_RELR: -+ sh_entsize = elf_typesize (LIBELFBITS, ELF_T_RELR, 1); -+ break; - default: - break; - } -diff --git a/libelf/gelf.h b/libelf/gelf.h -index 7a3c87aa..1847021e 100644 ---- a/libelf/gelf.h -+++ b/libelf/gelf.h -@@ -82,6 +82,9 @@ typedef Elf64_Rel GElf_Rel; - /* Relocation table entry with addend (in section of type SHT_RELA). */ - typedef Elf64_Rela GElf_Rela; - -+/* Relative relocation entry (in section of type SHT_RELR). */ -+typedef Elf64_Relr GElf_Relr; -+ - /* Program segment header. */ - typedef Elf64_Phdr GElf_Phdr; - -diff --git a/libelf/gelf_fsize.c b/libelf/gelf_fsize.c -index 493d7916..63bcbae5 100644 ---- a/libelf/gelf_fsize.c -+++ b/libelf/gelf_fsize.c -@@ -69,7 +69,8 @@ const size_t __libelf_type_sizes[ELFCLASSNUM - 1][ELF_T_NUM] = - [ELF_T_LIB] = sizeof (ElfW2(LIBELFBITS, Ext_Lib)), \ - [ELF_T_AUXV] = sizeof (ElfW2(LIBELFBITS, Ext_auxv_t)), \ - [ELF_T_CHDR] = sizeof (ElfW2(LIBELFBITS, Ext_Chdr)), \ -- [ELF_T_GNUHASH] = ELFW2(LIBELFBITS, FSZ_WORD) -+ [ELF_T_GNUHASH] = ELFW2(LIBELFBITS, FSZ_WORD), \ -+ [ELF_T_RELR] = ELFW2(LIBELFBITS, FSZ_RELR) - TYPE_SIZES (32) - }, - [ELFCLASS64 - 1] = { -diff --git a/libelf/gelf_xlate.c b/libelf/gelf_xlate.c -index d8ad0634..749da1a1 100644 ---- a/libelf/gelf_xlate.c -+++ b/libelf/gelf_xlate.c -@@ -204,7 +204,8 @@ const xfct_t __elf_xfctstom[ELFCLASSNUM - 1][ELF_T_NUM] = - [ELF_T_MOVE] = ElfW2(Bits, cvt_Move), \ - [ELF_T_LIB] = ElfW2(Bits, cvt_Lib), \ - [ELF_T_AUXV] = ElfW2(Bits, cvt_auxv_t), \ -- [ELF_T_CHDR] = ElfW2(Bits, cvt_chdr) -+ [ELF_T_CHDR] = ElfW2(Bits, cvt_chdr), \ -+ [ELF_T_RELR] = ElfW2(Bits, cvt_Relr) - define_xfcts (32), - [ELF_T_GNUHASH] = Elf32_cvt_Word - }, -diff --git a/libelf/gelf_xlate.h b/libelf/gelf_xlate.h -index 3c0e4bf6..d5511c34 100644 ---- a/libelf/gelf_xlate.h -+++ b/libelf/gelf_xlate.h -@@ -36,6 +36,7 @@ FUNDAMENTAL (WORD, Word, LIBELFBITS); - FUNDAMENTAL (SWORD, Sword, LIBELFBITS); - FUNDAMENTAL (XWORD, Xword, LIBELFBITS); - FUNDAMENTAL (SXWORD, Sxword, LIBELFBITS); -+FUNDAMENTAL (RELR, Relr, LIBELFBITS); - - /* The structured types. */ - TYPE (Ehdr, LIBELFBITS) -diff --git a/libelf/libelf.h b/libelf/libelf.h -index 2374a48a..458a1fad 100644 ---- a/libelf/libelf.h -+++ b/libelf/libelf.h -@@ -69,6 +69,19 @@ - #define ELFCOMPRESS_ZSTD 2 /* Zstandard algorithm. */ - #endif - -+#ifndef SHT_RELR -+ /* So RELR defines/typedefs can be used even with an old system elf.h. */ -+ #define SHT_RELR 19 /* RELR relative relocations */ -+ -+ /* RELR relocation table entry */ -+ typedef Elf32_Word Elf32_Relr; -+ typedef Elf64_Xword Elf64_Relr; -+ -+ #define DT_RELRSZ 35 /* Total size of RELR relative relocations */ -+ #define DT_RELR 36 /* Address of RELR relative relocations */ -+ #define DT_RELRENT 37 /* Size of one RELR relative relocaction */ -+#endif -+ - #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) - # define __nonnull_attribute__(...) __attribute__ ((__nonnull__ (__VA_ARGS__))) - # define __deprecated_attribute__ __attribute__ ((__deprecated__)) -@@ -124,6 +137,7 @@ typedef enum - ELF_T_CHDR, /* Compressed, Elf32_Chdr, Elf64_Chdr, ... */ - ELF_T_NHDR8, /* Special GNU Properties note. Same as Nhdr, - except padding. */ -+ ELF_T_RELR, /* Relative relocation entry. */ - /* Keep this the last entry. */ - ELF_T_NUM - } Elf_Type; -diff --git a/libelf/libelfP.h b/libelf/libelfP.h -index d3c241e5..96476064 100644 ---- a/libelf/libelfP.h -+++ b/libelf/libelfP.h -@@ -63,6 +63,7 @@ - #define ELF32_FSZ_SWORD 4 - #define ELF32_FSZ_XWORD 8 - #define ELF32_FSZ_SXWORD 8 -+#define ELF32_FSZ_RELR 4 - - /* Same for 64 bits objects. */ - #define ELF64_FSZ_ADDR 8 -@@ -72,6 +73,7 @@ - #define ELF64_FSZ_SWORD 4 - #define ELF64_FSZ_XWORD 8 - #define ELF64_FSZ_SXWORD 8 -+#define ELF64_FSZ_RELR 8 - - - /* This is an extension of the ELF_F_* enumeration. The values here are -diff --git a/src/elflint.c b/src/elflint.c -index dd42dcb4..864de710 100644 ---- a/src/elflint.c -+++ b/src/elflint.c -@@ -1,5 +1,6 @@ - /* Pedantic checking of ELF files compliance with gABI/psABI spec. - Copyright (C) 2001-2015, 2017, 2018 Red Hat, Inc. -+ Copyright (C) 2023 Mark J. Wielaard - This file is part of elfutils. - Written by Ulrich Drepper , 2001. - -@@ -1291,10 +1292,20 @@ section [%2d] '%s': no relocations for merge-able string sections possible\n"), - - size_t sh_entsize = gelf_fsize (ebl->elf, reltype, 1, EV_CURRENT); - if (shdr->sh_entsize != sh_entsize) -- ERROR (_(reltype == ELF_T_RELA ? "\ --section [%2d] '%s': section entry size does not match ElfXX_Rela\n" : "\ --section [%2d] '%s': section entry size does not match ElfXX_Rel\n"), -- idx, section_name (ebl, idx)); -+ { -+ if (reltype == ELF_T_RELA) -+ ERROR ("\ -+section [%2d] '%s': section entry size does not match ElfXX_Rela\n", -+ idx, section_name (ebl, idx)); -+ else if (reltype == ELF_T_REL) -+ ERROR ("\ -+section [%2d] '%s': section entry size does not match ElfXX_Rel\n", -+ idx, section_name (ebl, idx)); -+ else -+ ERROR ("\ -+section [%2d] '%s': section entry size does not match ElfXX_Relr\n", -+ idx, section_name (ebl, idx)); -+ } - - /* In preparation of checking whether relocations are text - relocations or not we need to determine whether the file is -@@ -1590,6 +1601,32 @@ section [%2d] '%s': cannot get relocation %zu: %s\n"), - } - } - -+static void -+check_relr (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx) -+{ -+ Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL); -+ if (data == NULL) -+ { -+ ERROR (_("section [%2d] '%s': cannot get section data\n"), -+ idx, section_name (ebl, idx)); -+ return; -+ } -+ -+ /* Check the fields of the section header. */ -+ GElf_Shdr destshdr_mem; -+ GElf_Shdr *destshdr = NULL; -+ struct loaded_segment *loaded = NULL; -+ check_reloc_shdr (ebl, ehdr, shdr, idx, ELF_T_RELR, &destshdr, -+ &destshdr_mem, &loaded); -+ -+ /* Just throw them away. */ -+ while (loaded != NULL) -+ { -+ struct loaded_segment *old = loaded; -+ loaded = loaded->next; -+ free (old); -+ } -+} - - /* Number of dynamic sections. */ - static int ndynamic; -@@ -1780,6 +1817,7 @@ section [%2d] '%s': entry %zu: pointer does not match address of section [%2d] ' - case DT_PLTGOT: - case DT_REL: - case DT_RELA: -+ case DT_RELR: - case DT_SYMBOLIC: - case DT_SYMTAB: - case DT_VERDEF: -@@ -3660,6 +3698,7 @@ static const struct - { ".plt", 5, SHT_PROGBITS, unused, 0, 0 }, // XXX more tests - { ".preinit_array", 15, SHT_PREINIT_ARRAY, exact, SHF_ALLOC | SHF_WRITE, 0 }, - { ".rela", 5, SHT_RELA, atleast, 0, SHF_ALLOC | SHF_INFO_LINK }, // XXX more tests -+ { ".relr", 5, SHT_RELR, atleast, 0, SHF_ALLOC }, // XXX more tests - { ".rel", 4, SHT_REL, atleast, 0, SHF_ALLOC | SHF_INFO_LINK }, // XXX more tests - { ".rodata", 8, SHT_PROGBITS, atleast, SHF_ALLOC, SHF_MERGE | SHF_STRINGS }, - { ".rodata1", 9, SHT_PROGBITS, atleast, SHF_ALLOC, SHF_MERGE | SHF_STRINGS }, -@@ -4182,6 +4221,10 @@ section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"), - check_rel (ebl, ehdr, shdr, cnt); - break; - -+ case SHT_RELR: -+ check_relr (ebl, ehdr, shdr, cnt); -+ break; -+ - case SHT_DYNAMIC: - check_dynamic (ebl, ehdr, shdr, cnt); - break; -diff --git a/src/readelf.c b/src/readelf.c -index eda0ce09..db31ad09 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -1,5 +1,6 @@ - /* Print information from ELF file in human-readable form. - Copyright (C) 1999-2018 Red Hat, Inc. -+ Copyright (C) 2023 Mark J. Wielaard - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -302,11 +302,13 @@ - static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr); - static void print_scngrp (Ebl *ebl); - static void print_dynamic (Ebl *ebl); --static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr); -+static void print_relocs (Ebl *ebl, Dwfl_Module *mod, GElf_Ehdr *ehdr); - static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, - GElf_Shdr *shdr); - static void handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, - GElf_Shdr *shdr); -+static void handle_relocs_relr (Ebl *ebl, Dwfl_Module *mod, Elf_Scn *scn, -+ GElf_Shdr *shdr); - static bool print_symtab (Ebl *ebl, int type); - static void handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr); - static void print_verinfo (Ebl *ebl); -@@ -336,6 +339,8 @@ static void dump_data (Ebl *ebl); - static void dump_strings (Ebl *ebl); - static void print_strings (Ebl *ebl); - static void dump_archive_index (Elf *, const char *); -+static void print_dwarf_addr (Dwfl_Module *dwflmod, int address_size, -+ Dwarf_Addr address, Dwarf_Addr raw); - - enum dyn_idx - { -@@ -1052,7 +1057,7 @@ process_elf_file (Dwfl_Module *dwflmod, int fd) - if (print_dynamic_table) - print_dynamic (ebl); - if (print_relocations) -- print_relocs (pure_ebl, ehdr); -+ print_relocs (pure_ebl, dwflmod, ehdr); - if (print_histogram) - handle_hash (ebl); - if (print_symbol_table || print_dynsym_table) -@@ -1971,9 +1976,11 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr) - case DT_RELASZ: - case DT_STRSZ: - case DT_RELSZ: -+ case DT_RELRSZ: - case DT_RELAENT: - case DT_SYMENT: - case DT_RELENT: -+ case DT_RELRENT: - case DT_PLTPADSZ: - case DT_MOVEENT: - case DT_MOVESZ: -@@ -2049,7 +2056,7 @@ print_dynamic (Ebl *ebl) - - /* Print relocations. */ - static void --print_relocs (Ebl *ebl, GElf_Ehdr *ehdr) -+print_relocs (Ebl *ebl, Dwfl_Module *mod, GElf_Ehdr *ehdr) - { - /* Find all relocation sections and handle them. */ - Elf_Scn *scn = NULL; -@@ -2066,6 +2073,8 @@ print_relocs (Ebl *ebl, GElf_Ehdr *ehdr) - handle_relocs_rel (ebl, ehdr, scn, shdr); - else if (shdr->sh_type == SHT_RELA) - handle_relocs_rela (ebl, ehdr, scn, shdr); -+ else if (shdr->sh_type == SHT_RELR) -+ handle_relocs_relr (ebl, mod, scn, shdr); - } - } - } -@@ -2454,6 +2463,114 @@ handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr) - } - } - -+/* Handle a relocation section. */ -+static void -+handle_relocs_relr (Ebl *ebl, Dwfl_Module *mod, Elf_Scn *scn, GElf_Shdr *shdr) -+{ -+ int class = gelf_getclass (ebl->elf); -+ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_RELR, 1, EV_CURRENT); -+ int nentries = shdr->sh_size / sh_entsize; -+ -+ /* Get the data of the section. */ -+ Elf_Data *data = elf_getdata (scn, NULL); -+ if (data == NULL) -+ return; -+ -+ /* Get the section header string table index. */ -+ size_t shstrndx; -+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)) -+ error_exit (0, _("cannot get section header string table index")); -+ -+ /* A .relr.dyn section does not refer to a specific section. */ -+ printf (ngettext ("\ -+\nRelocation section [%2u] '%s' at offset %#0" PRIx64 " contains %d entry:\n", -+ "\ -+\nRelocation section [%2u] '%s' at offset %#0" PRIx64 " contains %d entries:\n", -+ nentries), -+ (unsigned int) elf_ndxscn (scn), -+ elf_strptr (ebl->elf, shstrndx, shdr->sh_name), -+ shdr->sh_offset, -+ nentries); -+ -+ if (class == ELFCLASS32) -+ { -+ uint32_t base = 0; -+ for (int cnt = 0; cnt < nentries; ++cnt) -+ { -+ Elf32_Word *words = data->d_buf; -+ Elf32_Word entry = words[cnt]; -+ -+ /* Just the raw entries? */ -+ if (print_unresolved_addresses) -+ printf (" %#010" PRIx32 "%s\n", entry, -+ (entry & 1) == 0 ? " *" : ""); -+ else -+ { -+ /* A real address, also sets base. */ -+ if ((entry & 1) == 0) -+ { -+ printf (" "); -+ print_dwarf_addr (mod, 4, entry, entry); -+ printf (" *\n"); -+ -+ base = entry + 4; -+ } -+ else -+ { -+ /* Untangle address from base and bits. */ -+ uint32_t addr; -+ for (addr = base; (entry >>= 1) != 0; addr += 4) -+ if ((entry & 1) != 0) -+ { -+ printf (" "); -+ print_dwarf_addr (mod, 4, addr, addr); -+ printf ("\n"); -+ } -+ base += 4 * (4 * 8 - 1); -+ } -+ } -+ } -+ } -+ else -+ { -+ uint64_t base = 0; -+ for (int cnt = 0; cnt < nentries; ++cnt) -+ { -+ Elf64_Xword *xwords = data->d_buf; -+ Elf64_Xword entry = xwords[cnt]; -+ -+ /* Just the raw entries? */ -+ if (print_unresolved_addresses) -+ printf (" %#018" PRIx64 "%s\n", entry, -+ (entry & 1) == 0 ? " *" : ""); -+ else -+ { -+ /* A real address, also sets base. */ -+ if ((entry & 1) == 0) -+ { -+ printf (" "); -+ print_dwarf_addr (mod, 8, entry, entry); -+ printf (" *\n"); -+ -+ base = entry + 8; -+ } -+ else -+ { -+ /* Untangle address from base and bits. */ -+ uint64_t addr; -+ for (addr = base; (entry >>= 1) != 0; addr += 8) -+ if ((entry & 1) != 0) -+ { -+ printf (" "); -+ print_dwarf_addr (mod, 8, addr, addr); -+ printf ("\n"); -+ } -+ base += 8 * (8 * 8 - 1); -+ } -+ } -+ } -+ } -+} - - /* Print the program header. Return true if a symtab is printed, - false otherwise. */ -@@ -4107,7 +4224,7 @@ get_debug_elf_data (Dwarf *dbg, Ebl *ebl, int idx, Elf_Scn *scn) - return elf_getdata (scn, NULL); - } - --void -+static void - print_dwarf_addr (Dwfl_Module *dwflmod, - int address_size, Dwarf_Addr address, Dwarf_Addr raw) - { diff --git a/elfutils.spec b/elfutils.spec index c164f1d..4511694 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils -Version: 0.189 -%global baserelease 6 +Version: 0.190 +%global baserelease 1 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -74,16 +74,6 @@ BuildRequires: gettext-devel # For s390x... FDO package notes are bogus. Patch1: elfutils-0.186-fdo-swap.patch -# testsuite: Avoid C99 compatibility issues in run-native-test.sh -Patch2: elfutils-0.189-c99-compat.patch -# elfcompress: Don't compress if section already compressed unless forced -Patch3: elfutils-0.189-elfcompress.patch -# libelf: Replace list of elf_getdata_rawchunk results with a tree -Patch4: elfutils-0.189-elf_getdata_rawchunk.patch -# PR29696: Removed secondary fd close in cache config causing race condition -Patch5: elfutils-0.189-debuginfod_config_cache-double-close.patch -# Bug 28495 - Add support for SHT_RELR to eu-readelf -Patch6: elfutils-0.189-relr.patch %description Elfutils is a collection of utilities, including stack (to show @@ -358,6 +348,7 @@ fi %{_bindir}/eu-ranlib %{_bindir}/eu-readelf %{_bindir}/eu-size +%{_bindir}/eu-srcfiles %{_bindir}/eu-stack %{_bindir}/eu-strings %{_bindir}/eu-strip @@ -428,7 +419,6 @@ fi %{_sysusersdir}/elfutils-debuginfod.conf %endif %{_mandir}/man8/debuginfod*.8* -%{_mandir}/man7/debuginfod*.7* %dir %attr(0700,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod @@ -452,6 +442,17 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Fri Nov 3 2023 Mark Wielaard - 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 - 0.189-6 - Update elfutils-0.189-relr.patch diff --git a/sources b/sources index 57e5577..658148d 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.189.tar.bz2) = 93a877e34db93e5498581d0ab2d702b08c0d87e4cafd9cec9d6636dfa85a168095c305c11583a5b0fb79374dd93bc8d0e9ce6016e6c172764bcea12861605b71 +SHA512 (elfutils-0.190.tar.bz2) = 9c4f5328097e028286c42f29e39dc3d80914b656cdfbbe05b639e91bc787ae8ae64dd4d69a6e317ce30c01648ded10281b86a51e718295f4c589df1225a48102 From 4bf94eb436332188bd7c35a11ab414aba97697bf Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 4 Nov 2023 01:10:11 +0100 Subject: [PATCH 21/56] 0.190-2 - Update Fedora license tags to spdx license tags --- elfutils.spec | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 4511694..1c8c52f 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,10 +1,10 @@ Name: elfutils Version: 0.190 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?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 Summary: A collection of utilities and DSOs to handle ELF files and DWARF data @@ -85,7 +85,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 +108,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 +129,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 +143,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 +160,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 +194,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 +204,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 +212,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} @@ -442,6 +442,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Fri Nov 3 2023 Mark Wielaard - 0.190-2 +- Update Fedora license tags to spdx license tags + * Fri Nov 3 2023 Mark Wielaard - 0.190-1 - Upgrade to upstream elfutils 0.190 - Add eu-srcfiles From 6a0f0e45c4e51b1ab87d82e899ba90d85eca0dc3 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 3 Nov 2023 21:11:40 +0100 Subject: [PATCH 22/56] 0.190-1 - Upgrade to upstream elfutils 0.190 - Add eu-srcfiles - Drop upstreamed patches 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 --- .gitignore | 1 + elfutils-0.189-c99-compat.patch | 31 --- ...debuginfod_config_cache-double-close.patch | 73 ------ elfutils-0.189-elf_getdata_rawchunk.patch | 224 ------------------ elfutils-0.189-elfcompress.patch | 95 -------- elfutils.spec | 24 +- sources | 2 +- 7 files changed, 15 insertions(+), 435 deletions(-) delete mode 100644 elfutils-0.189-c99-compat.patch delete mode 100644 elfutils-0.189-debuginfod_config_cache-double-close.patch delete mode 100644 elfutils-0.189-elf_getdata_rawchunk.patch delete mode 100644 elfutils-0.189-elfcompress.patch diff --git a/.gitignore b/.gitignore index 9d73fa8..eb85273 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ /elfutils-0.187.tar.bz2 /elfutils-0.188.tar.bz2 /elfutils-0.189.tar.bz2 +/elfutils-0.190.tar.bz2 diff --git a/elfutils-0.189-c99-compat.patch b/elfutils-0.189-c99-compat.patch deleted file mode 100644 index 4932c2c..0000000 --- a/elfutils-0.189-c99-compat.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 6e7ac623674242628c9e54892a532d55d3288bb8 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Sat, 22 Apr 2023 21:37:09 +0200 -Subject: [PATCH] testsuite: Avoid C99 compatibility issues in - run-native-test.sh - -Include for the pause function, and add the return type -of main. Avoids an implicit function declaration and implicit int. - -Signed-off-by: Florian Weimer ---- - tests/run-native-test.sh | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/tests/run-native-test.sh b/tests/run-native-test.sh -index d19007f2..042a51c6 100755 ---- a/tests/run-native-test.sh -+++ b/tests/run-native-test.sh -@@ -27,7 +27,8 @@ - # in all builds. - - tempfiles native.c native --echo 'main () { while (1) pause (); }' > native.c -+printf '#include \nint main (void) { while (1) pause (); }\n' \ -+ > native.c - - native=0 - kill_native() --- -2.31.1 - diff --git a/elfutils-0.189-debuginfod_config_cache-double-close.patch b/elfutils-0.189-debuginfod_config_cache-double-close.patch deleted file mode 100644 index 3380b71..0000000 --- a/elfutils-0.189-debuginfod_config_cache-double-close.patch +++ /dev/null @@ -1,73 +0,0 @@ -diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c -index ef4d47e3..d92d8d62 100644 ---- a/debuginfod/debuginfod-client.c -+++ b/debuginfod/debuginfod-client.c -@@ -248,7 +248,7 @@ debuginfod_write_callback (char *ptr, size_t size, size_t nmemb, void *data) - - /* handle config file read and write */ - static int --debuginfod_config_cache(char *config_path, -+debuginfod_config_cache(debuginfod_client *c, char *config_path, - long cache_config_default_s, - struct stat *st) - { -@@ -277,17 +277,27 @@ debuginfod_config_cache(char *config_path, - } - - long cache_config; -+ /* PR29696 - NB: When using fdopen, the file descriptor is NOT -+ dup'ed and will be closed when the stream is closed. Manually -+ closing fd after fclose is called will lead to a race condition -+ where, if reused, the file descriptor will compete for its -+ regular use before being incorrectly closed here. */ - FILE *config_file = fdopen(fd, "r"); - if (config_file) - { - if (fscanf(config_file, "%ld", &cache_config) != 1) -- cache_config = cache_config_default_s; -- fclose(config_file); -+ cache_config = cache_config_default_s; -+ if (0 != fclose (config_file) && c->verbose_fd >= 0) -+ dprintf (c->verbose_fd, "fclose failed with %s (err=%d)\n", -+ strerror (errno), errno); - } - else -- cache_config = cache_config_default_s; -- -- close (fd); -+ { -+ cache_config = cache_config_default_s; -+ if (0 != close (fd) && c->verbose_fd >= 0) -+ dprintf (c->verbose_fd, "close failed with %s (err=%d)\n", -+ strerror (errno), errno); -+ } - return cache_config; - } - -@@ -303,7 +313,7 @@ debuginfod_clean_cache(debuginfod_client *c, - struct stat st; - - /* Create new interval file. */ -- rc = debuginfod_config_cache(interval_path, -+ rc = debuginfod_config_cache(c, interval_path, - cache_clean_default_interval_s, &st); - if (rc < 0) - return rc; -@@ -320,7 +330,7 @@ debuginfod_clean_cache(debuginfod_client *c, - utime (interval_path, NULL); - - /* Read max unused age value from config file. */ -- rc = debuginfod_config_cache(max_unused_path, -+ rc = debuginfod_config_cache(c, max_unused_path, - cache_default_max_unused_age_s, &st); - if (rc < 0) - return rc; -@@ -1110,7 +1135,7 @@ debuginfod_query_server (debuginfod_client *c, - - close(fd); /* no need to hold onto the negative-hit file descriptor */ - -- rc = debuginfod_config_cache(cache_miss_path, -+ rc = debuginfod_config_cache(c, cache_miss_path, - cache_miss_default_s, &st); - if (rc < 0) - goto out; diff --git a/elfutils-0.189-elf_getdata_rawchunk.patch b/elfutils-0.189-elf_getdata_rawchunk.patch deleted file mode 100644 index 7ce6695..0000000 --- a/elfutils-0.189-elf_getdata_rawchunk.patch +++ /dev/null @@ -1,224 +0,0 @@ -From 3aca5b5f1f1617db2220022d9061dcaf129e54c4 Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Wed, 21 Jun 2023 18:05:12 +0200 -Subject: [PATCH] libelf: Replace list of elf_getdata_rawchunk results with a - tree - -elf_getdata_rawchunks did a linear search to see if a chunk was -already fetched. Replace this list with a binary search tree to make -lookup faster when a lot of Elf_Data_Chunk were created. - - * libelf/libelfP.h (Elf_Data_Chunk): Remove next field. - (struct Elf): Change the rawchunks type from Elf_Data_Chunk * - to void *. - * elf_getdata_rawchunk.c (chunk_compare): New static function. - (elf_getdata_rawchunk): Use tsearch instead of a manual linked - list. - * elf_end.c (free_chunk): New static function. - (elf_end): Call tdestroy instead of walking linked list. - -Signed-off-by: Mark Wielaard ---- - libelf/elf_end.c | 22 +++++++++------- - libelf/elf_getdata_rawchunk.c | 47 +++++++++++++++++++++++++---------- - libelf/libelfP.h | 13 ++++------ - 3 files changed, 52 insertions(+), 30 deletions(-) - -diff --git a/libelf/elf_end.c b/libelf/elf_end.c -index 5c451f36..3e5d4c86 100644 ---- a/libelf/elf_end.c -+++ b/libelf/elf_end.c -@@ -1,5 +1,6 @@ - /* Free resources associated with Elf descriptor. - Copyright (C) 1998,1999,2000,2001,2002,2004,2005,2007,2015,2016 Red Hat, Inc. -+ Copyright (C) 2023 Mark J. Wielaard - This file is part of elfutils. - Written by Ulrich Drepper , 1998. - -@@ -32,12 +33,22 @@ - #endif - - #include -+#include - #include - #include - - #include "libelfP.h" - - -+static void -+free_chunk (void *n) -+{ -+ Elf_Data_Chunk *rawchunk = (Elf_Data_Chunk *)n; -+ if (rawchunk->dummy_scn.flags & ELF_F_MALLOCED) -+ free (rawchunk->data.d.d_buf); -+ free (rawchunk); -+} -+ - int - elf_end (Elf *elf) - { -@@ -112,20 +123,13 @@ elf_end (Elf *elf) - - case ELF_K_ELF: - { -- Elf_Data_Chunk *rawchunks -+ void *rawchunks - = (elf->class == ELFCLASS32 - || (offsetof (struct Elf, state.elf32.rawchunks) - == offsetof (struct Elf, state.elf64.rawchunks)) - ? elf->state.elf32.rawchunks - : elf->state.elf64.rawchunks); -- while (rawchunks != NULL) -- { -- Elf_Data_Chunk *next = rawchunks->next; -- if (rawchunks->dummy_scn.flags & ELF_F_MALLOCED) -- free (rawchunks->data.d.d_buf); -- free (rawchunks); -- rawchunks = next; -- } -+ tdestroy (rawchunks, free_chunk); - - Elf_ScnList *list = (elf->class == ELFCLASS32 - || (offsetof (struct Elf, state.elf32.scns) -diff --git a/libelf/elf_getdata_rawchunk.c b/libelf/elf_getdata_rawchunk.c -index 5a35ccdc..cfd40396 100644 ---- a/libelf/elf_getdata_rawchunk.c -+++ b/libelf/elf_getdata_rawchunk.c -@@ -1,6 +1,6 @@ - /* Return converted data from raw chunk of ELF file. - Copyright (C) 2007, 2014, 2015 Red Hat, Inc. -- Copyright (C) 2022 Mark J. Wielaard -+ Copyright (C) 2022, 2023 Mark J. Wielaard - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -33,12 +33,28 @@ - - #include - #include -+#include - #include - #include - - #include "libelfP.h" - #include "common.h" - -+static int -+chunk_compare (const void *a, const void *b) -+{ -+ Elf_Data_Chunk *da = (Elf_Data_Chunk *)a; -+ Elf_Data_Chunk *db = (Elf_Data_Chunk *)b; -+ -+ if (da->offset != db->offset) -+ return da->offset - db->offset; -+ -+ if (da->data.d.d_size != db->data.d.d_size) -+ return da->data.d.d_size - db->data.d.d_size; -+ -+ return da->data.d.d_type - db->data.d.d_type; -+} -+ - Elf_Data * - elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) - { -@@ -75,19 +91,25 @@ elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) - rwlock_rdlock (elf->lock); - - /* Maybe we already got this chunk? */ -- Elf_Data_Chunk *rawchunks = elf->state.elf.rawchunks; -- while (rawchunks != NULL) -+ Elf_Data_Chunk key; -+ key.offset = offset; -+ key.data.d.d_size = size; -+ key.data.d.d_type = type; -+ Elf_Data_Chunk **found = tsearch (&key, &elf->state.elf.rawchunks, -+ &chunk_compare); -+ if (found == NULL) -+ goto nomem; -+ -+ /* Existing entry. */ -+ if (*found != &key && *found != NULL) - { -- if ((rawchunks->offset == offset || size == 0) -- && rawchunks->data.d.d_size == size -- && rawchunks->data.d.d_type == type) -- { -- result = &rawchunks->data.d; -- goto out; -- } -- rawchunks = rawchunks->next; -+ result = &(*found)->data.d; -+ goto out; - } - -+ /* New entry. */ -+ *found = NULL; -+ - size_t align = __libelf_type_align (elf->class, type); - if (elf->map_address != NULL) - { -@@ -189,8 +211,7 @@ elf_getdata_rawchunk (Elf *elf, int64_t offset, size_t size, Elf_Type type) - rwlock_unlock (elf->lock); - rwlock_wrlock (elf->lock); - -- chunk->next = elf->state.elf.rawchunks; -- elf->state.elf.rawchunks = chunk; -+ *found = chunk; - result = &chunk->data.d; - - out: -diff --git a/libelf/libelfP.h b/libelf/libelfP.h -index 6624f38a..d3c241e5 100644 ---- a/libelf/libelfP.h -+++ b/libelf/libelfP.h -@@ -1,5 +1,6 @@ - /* Internal interfaces for libelf. - Copyright (C) 1998-2010, 2015, 2016 Red Hat, Inc. -+ Copyright (C) 2023 Mark J. Wielaard - This file is part of elfutils. - Contributed by Ulrich Drepper , 1998. - -@@ -262,11 +263,7 @@ typedef struct Elf_ScnList - typedef struct Elf_Data_Chunk - { - Elf_Data_Scn data; -- union -- { -- Elf_Scn dummy_scn; -- struct Elf_Data_Chunk *next; -- }; -+ Elf_Scn dummy_scn; - int64_t offset; /* The original raw offset in the Elf image. */ - } Elf_Data_Chunk; - -@@ -324,7 +321,7 @@ struct Elf - Elf_ScnList *scns_last; /* Last element in the section list. - If NULL the data has not yet been - read from the file. */ -- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ -+ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ - unsigned int scnincr; /* Number of sections allocate the last - time. */ - int ehdr_flags; /* Flags (dirty) for ELF header. */ -@@ -343,7 +340,7 @@ struct Elf - Elf_ScnList *scns_last; /* Last element in the section list. - If NULL the data has not yet been - read from the file. */ -- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ -+ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ - unsigned int scnincr; /* Number of sections allocate the last - time. */ - int ehdr_flags; /* Flags (dirty) for ELF header. */ -@@ -368,7 +365,7 @@ struct Elf - Elf_ScnList *scns_last; /* Last element in the section list. - If NULL the data has not yet been - read from the file. */ -- Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */ -+ void *rawchunks; /* Tree of elf_getdata_rawchunk results. */ - unsigned int scnincr; /* Number of sections allocate the last - time. */ - int ehdr_flags; /* Flags (dirty) for ELF header. */ --- -2.40.1 - diff --git a/elfutils-0.189-elfcompress.patch b/elfutils-0.189-elfcompress.patch deleted file mode 100644 index 5f0d681..0000000 --- a/elfutils-0.189-elfcompress.patch +++ /dev/null @@ -1,95 +0,0 @@ -From ef9164520c81ea61efe88777a8ad61bf17a54201 Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Sat, 22 Apr 2023 01:26:17 +0200 -Subject: [PATCH] elfcompress: Don't compress if section already compressed - unless forced - -Before commit a5b07cdf9 "support ZSTD compression algorithm" -elfcompress would not try to compress a section if it already -had the requested compression type (or was already uncompressed) -unless the --force flag was given. An else if construct was changed -to an if in the commit causing elfcompress to warn (in verbose mode) -but then still try to (re)compress the section. - -Add an explicit check so if nothing needs (un)compressing, the file -isn't changed. - -The diff looks large, but git diff -b -w is just: - -+ if (force || type != schtype) -+ { - if (shdr->sh_type != SHT_NOBITS - && (shdr->sh_flags & SHF_ALLOC) == 0) - { -@@ -554,6 +556,7 @@ process_file (const char *fname) - printf ("[%zd] %s ignoring %s section\n", ndx, sname, - (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); - } -+ } - -Signed-off-by: Mark Wielaard ---- - src/elfcompress.c | 43 +++++++++++++++++++++++-------------------- - 1 file changed, 23 insertions(+), 20 deletions(-) - -diff --git a/src/elfcompress.c b/src/elfcompress.c -index 18ade66f..f771b92a 100644 ---- a/src/elfcompress.c -+++ b/src/elfcompress.c -@@ -529,30 +529,33 @@ process_file (const char *fname) - } - } - -- if (shdr->sh_type != SHT_NOBITS -- && (shdr->sh_flags & SHF_ALLOC) == 0) -+ if (force || type != schtype) - { -- set_section (sections, ndx); -- /* Check if we might want to change this section name. */ -- if (! adjust_names -- && ((type != ZLIB_GNU -- && startswith (sname, ".zdebug")) -- || (type == ZLIB_GNU -- && startswith (sname, ".debug")))) -- adjust_names = true; -- -- /* We need a buffer this large if we change the names. */ -- if (adjust_names) -+ if (shdr->sh_type != SHT_NOBITS -+ && (shdr->sh_flags & SHF_ALLOC) == 0) - { -- size_t slen = strlen (sname); -- if (slen > maxnamelen) -- maxnamelen = slen; -+ set_section (sections, ndx); -+ /* Check if we might want to change this section name. */ -+ if (! adjust_names -+ && ((type != ZLIB_GNU -+ && startswith (sname, ".zdebug")) -+ || (type == ZLIB_GNU -+ && startswith (sname, ".debug")))) -+ adjust_names = true; -+ -+ /* We need a buffer this large if we change the names. */ -+ if (adjust_names) -+ { -+ size_t slen = strlen (sname); -+ if (slen > maxnamelen) -+ maxnamelen = slen; -+ } - } -+ else -+ if (verbose >= 0) -+ printf ("[%zd] %s ignoring %s section\n", ndx, sname, -+ (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); - } -- else -- if (verbose >= 0) -- printf ("[%zd] %s ignoring %s section\n", ndx, sname, -- (shdr->sh_type == SHT_NOBITS ? "no bits" : "allocated")); - } - - if (shdr->sh_type == SHT_SYMTAB) --- -2.31.1 - diff --git a/elfutils.spec b/elfutils.spec index c27e88f..87484c5 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils -Version: 0.189 -%global baserelease 3 +Version: 0.190 +%global baserelease 1 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -74,14 +74,6 @@ BuildRequires: gettext-devel # For s390x... FDO package notes are bogus. Patch1: elfutils-0.186-fdo-swap.patch -# testsuite: Avoid C99 compatibility issues in run-native-test.sh -Patch2: elfutils-0.189-c99-compat.patch -# elfcompress: Don't compress if section already compressed unless forced -Patch3: elfutils-0.189-elfcompress.patch -# libelf: Replace list of elf_getdata_rawchunk results with a tree -Patch4: elfutils-0.189-elf_getdata_rawchunk.patch -# PR29696: Removed secondary fd close in cache config causing race condition -Patch5: elfutils-0.189-debuginfod_config_cache-double-close.patch %description Elfutils is a collection of utilities, including stack (to show @@ -356,6 +348,7 @@ fi %{_bindir}/eu-ranlib %{_bindir}/eu-readelf %{_bindir}/eu-size +%{_bindir}/eu-srcfiles %{_bindir}/eu-stack %{_bindir}/eu-strings %{_bindir}/eu-strip @@ -426,7 +419,6 @@ fi %{_sysusersdir}/elfutils-debuginfod.conf %endif %{_mandir}/man8/debuginfod*.8* -%{_mandir}/man7/debuginfod*.7* %dir %attr(0700,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod @@ -450,6 +442,16 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Fri Nov 10 2023 Mark Wielaard - 0.190-1 +- Upgrade to upstream elfutils 0.190 +- Add eu-srcfiles +- Drop upstreamed patches + 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 Jun 22 2023 Mark Wielaard - 0.189-3 - Add elfutils-0.189-elf_getdata_rawchunk.patch - Add elfutils-0.189-debuginfod_config_cache-double-close.patch diff --git a/sources b/sources index 57e5577..658148d 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.189.tar.bz2) = 93a877e34db93e5498581d0ab2d702b08c0d87e4cafd9cec9d6636dfa85a168095c305c11583a5b0fb79374dd93bc8d0e9ce6016e6c172764bcea12861605b71 +SHA512 (elfutils-0.190.tar.bz2) = 9c4f5328097e028286c42f29e39dc3d80914b656cdfbbe05b639e91bc787ae8ae64dd4d69a6e317ce30c01648ded10281b86a51e718295f4c589df1225a48102 From 67d56959ad806464964319ccd939124357fc95e6 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Fri, 24 Nov 2023 14:27:53 -0500 Subject: [PATCH 23/56] 0.190-3 - Add elfutils-0.190-fix-core-noncontig.patch --- elfutils-0.190-fix-core-noncontig.patch | 329 ++++++++++++++++++++++++ elfutils.spec | 10 +- testcore-noncontig.bz2 | Bin 0 -> 54684 bytes 3 files changed, 338 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.190-fix-core-noncontig.patch create mode 100644 testcore-noncontig.bz2 diff --git a/elfutils-0.190-fix-core-noncontig.patch b/elfutils-0.190-fix-core-noncontig.patch new file mode 100644 index 0000000..e8a7f07 --- /dev/null +++ b/elfutils-0.190-fix-core-noncontig.patch @@ -0,0 +1,329 @@ +From 0fba72fed595f77ca19a57553096ce3cc81cf8f3 Mon Sep 17 00:00:00 2001 +From: Aaron Merey +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 +--- + 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 . */ ++ ++#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 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 . ++ ++. $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.41.0 + diff --git a/elfutils.spec b/elfutils.spec index 1c8c52f..34ded73 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,12 +1,13 @@ Name: elfutils Version: 0.190 -%global baserelease 2 +%global baserelease 3 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. @@ -74,6 +75,8 @@ 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 %description Elfutils is a collection of utilities, including stack (to show @@ -258,6 +261,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 @@ -442,6 +447,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Fri Nov 24 2023 Aaron Merey - 0.190-3 +- Add elfutils-0.190-fix-core-noncontig.patch + * Fri Nov 3 2023 Mark Wielaard - 0.190-2 - Update Fedora license tags to spdx license tags diff --git a/testcore-noncontig.bz2 b/testcore-noncontig.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..514ad010e00499b9a75a98800aa20ec61596d491 GIT binary patch literal 54684 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 literal 0 HcmV?d00001 From 0aecb034b0e5b4a81685b09aeb9d81a70b1a5ecc Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Fri, 24 Nov 2023 14:27:53 -0500 Subject: [PATCH 24/56] 0.190-4 - Add elfutils-0.190-remove-ET_REL-unstrip-test.patch --- ...ils-0.190-remove-ET_REL-unstrip-test.patch | 32 +++++++++++++++++++ elfutils.spec | 8 ++++- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.190-remove-ET_REL-unstrip-test.patch diff --git a/elfutils-0.190-remove-ET_REL-unstrip-test.patch b/elfutils-0.190-remove-ET_REL-unstrip-test.patch new file mode 100644 index 0000000..0f5599e --- /dev/null +++ b/elfutils-0.190-remove-ET_REL-unstrip-test.patch @@ -0,0 +1,32 @@ +From 010cacd89b847659b3c666ac963269b06a8c5058 Mon Sep 17 00:00:00 2001 +From: Aaron Merey +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 + diff --git a/elfutils.spec b/elfutils.spec index 34ded73..359a9c3 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.190 -%global baserelease 3 +%global baserelease 4 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -77,6 +77,8 @@ BuildRequires: gettext-devel 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 %description Elfutils is a collection of utilities, including stack (to show @@ -447,6 +449,10 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog + +* Tue Nov 28 2023 Aaron Merey - 0.190-4 +- Add elfutils-0.190-remove-ET_REL-unstrip-test.patch + * Fri Nov 24 2023 Aaron Merey - 0.190-3 - Add elfutils-0.190-fix-core-noncontig.patch From d5f93720bbbbce8fa9ab2d2eb850af432344abdb Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Wed, 29 Nov 2023 14:14:47 -0500 Subject: [PATCH 25/56] 0.190-2 - Update Fedora license tags to spdx license tags - Add elfutils-0.190-fix-core-noncontig.patch - Add elfutils-0.190-remove-ET_REL-unstrip-test.patch --- elfutils-0.190-fix-core-noncontig.patch | 329 ++++++++++++++++++ ...ils-0.190-remove-ET_REL-unstrip-test.patch | 32 ++ elfutils.spec | 32 +- testcore-noncontig.bz2 | Bin 0 -> 54684 bytes 4 files changed, 383 insertions(+), 10 deletions(-) create mode 100644 elfutils-0.190-fix-core-noncontig.patch create mode 100644 elfutils-0.190-remove-ET_REL-unstrip-test.patch create mode 100644 testcore-noncontig.bz2 diff --git a/elfutils-0.190-fix-core-noncontig.patch b/elfutils-0.190-fix-core-noncontig.patch new file mode 100644 index 0000000..e8a7f07 --- /dev/null +++ b/elfutils-0.190-fix-core-noncontig.patch @@ -0,0 +1,329 @@ +From 0fba72fed595f77ca19a57553096ce3cc81cf8f3 Mon Sep 17 00:00:00 2001 +From: Aaron Merey +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 +--- + 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 . */ ++ ++#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 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 . ++ ++. $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.41.0 + diff --git a/elfutils-0.190-remove-ET_REL-unstrip-test.patch b/elfutils-0.190-remove-ET_REL-unstrip-test.patch new file mode 100644 index 0000000..0f5599e --- /dev/null +++ b/elfutils-0.190-remove-ET_REL-unstrip-test.patch @@ -0,0 +1,32 @@ +From 010cacd89b847659b3c666ac963269b06a8c5058 Mon Sep 17 00:00:00 2001 +From: Aaron Merey +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 + diff --git a/elfutils.spec b/elfutils.spec index 87484c5..79a206a 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,12 +1,13 @@ Name: elfutils Version: 0.190 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?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,10 @@ 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 %description Elfutils is a collection of utilities, including stack (to show @@ -85,7 +90,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 +113,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 +134,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 +148,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 +165,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 +199,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 +209,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 +217,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 +263,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 @@ -442,6 +449,11 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Nov 29 2023 Aaron Merey - 0.190-2 +- Update Fedora license tags to spdx license tags +- Add elfutils-0.190-fix-core-noncontig.patch +- Add elfutils-0.190-remove-ET_REL-unstrip-test.patch + * Fri Nov 10 2023 Mark Wielaard - 0.190-1 - Upgrade to upstream elfutils 0.190 - Add eu-srcfiles diff --git a/testcore-noncontig.bz2 b/testcore-noncontig.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..514ad010e00499b9a75a98800aa20ec61596d491 GIT binary patch literal 54684 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 literal 0 HcmV?d00001 From ea7ed5a10d9f03173b7a36080da79b357b591a33 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 19 Jan 2024 17:59:24 +0000 Subject: [PATCH 26/56] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 359a9c3..a40edd3 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.190 -%global baserelease 4 +%global baserelease 5 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -449,6 +449,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Fri Jan 19 2024 Fedora Release Engineering - 0.190-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Tue Nov 28 2023 Aaron Merey - 0.190-4 - Add elfutils-0.190-remove-ET_REL-unstrip-test.patch From 30c0ab2617e9af730633270fd864c496e6e0ca71 Mon Sep 17 00:00:00 2001 From: Yaakov Selkowitz Date: Fri, 19 Jan 2024 14:25:33 -0500 Subject: [PATCH 27/56] Fix build with GCC 14 https://sourceware.org/git/?p=elfutils.git;h=ae580d48278b9924da7503886b37be34378e1b04 --- elfutils-0.190-gcc-14.patch | 33 +++++++++++++++++++++++++++++++++ elfutils.spec | 2 ++ 2 files changed, 35 insertions(+) create mode 100644 elfutils-0.190-gcc-14.patch diff --git a/elfutils-0.190-gcc-14.patch b/elfutils-0.190-gcc-14.patch new file mode 100644 index 0000000..f81bcc8 --- /dev/null +++ b/elfutils-0.190-gcc-14.patch @@ -0,0 +1,33 @@ +From: Sergei Trofimovich +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 +--- + +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); + diff --git a/elfutils.spec b/elfutils.spec index a40edd3..d890ae6 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -79,6 +79,8 @@ Patch1: elfutils-0.186-fdo-swap.patch 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 From fc141358f549682689833673f78e857733bdafdc Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 24 Jan 2024 10:15:47 +0000 Subject: [PATCH 28/56] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index d890ae6..ee877fd 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.190 -%global baserelease 5 +%global baserelease 6 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -451,6 +451,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Jan 24 2024 Fedora Release Engineering - 0.190-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Fri Jan 19 2024 Fedora Release Engineering - 0.190-5 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild From 0f01156de51d8b00e2112bb9a8e0b6febce17de7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Such=C3=BD?= Date: Thu, 29 Feb 2024 06:14:25 +0000 Subject: [PATCH 29/56] Correct SPDX license formula The operator has to be upper case according to the standard. --- elfutils.spec | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index ee877fd..dd18ebe 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -92,7 +92,7 @@ elfcompress (to compress or decompress ELF sections). %package libs Summary: Libraries to handle compiled objects -License: GPL-2.0-or-later or LGPL-3.0-or-later +License: GPL-2.0-or-later OR LGPL-3.0-or-later %if 0%{!?_isa:1} Provides: elfutils-libs%{depsuffix} = %{version}-%{release} %endif @@ -115,7 +115,7 @@ libraries. %package devel Summary: Development libraries to handle compiled objects -License: GPL-2.0-or-later or LGPL-3.0-or-later +License: GPL-2.0-or-later OR LGPL-3.0-or-later %if 0%{!?_isa:1} Provides: elfutils-devel%{depsuffix} = %{version}-%{release} %endif @@ -136,7 +136,7 @@ assembler interface. %package libelf Summary: Library to read and write ELF files -License: GPL-2.0-or-later or LGPL-3.0-or-later +License: GPL-2.0-or-later OR LGPL-3.0-or-later %if 0%{!?_isa:1} Provides: elfutils-libelf%{depsuffix} = %{version}-%{release} %endif @@ -150,7 +150,7 @@ elfutils package use it also to generate new ELF files. %package libelf-devel Summary: Development support for libelf -License: GPL-2.0-or-later or LGPL-3.0-or-later +License: GPL-2.0-or-later OR LGPL-3.0-or-later %if 0%{!?_isa:1} Provides: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} %endif @@ -167,7 +167,7 @@ different sections of an ELF file. %if %{provide_yama_scope} %package default-yama-scope Summary: Default yama attach scope sysctl setting -License: GPL-2.0-or-later or LGPL-3.0-or-later +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. @@ -201,7 +201,7 @@ profiling) of processes. %package debuginfod-client Summary: Library and command line client for build-id HTTP ELF/DWARF server -License: GPL-3.0-or-later and (GPL-2.0-or-later or LGPL-3.0-or-later) +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 @@ -211,7 +211,7 @@ Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} %package debuginfod-client-devel Summary: Libraries and headers to build debuginfod client applications -License: GPL-2.0-or-later or LGPL-3.0-or-later +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 From 4124e4f1f2e1037ac8aa3d31f025af21030d0885 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Mon, 4 Mar 2024 11:30:42 -0500 Subject: [PATCH 30/56] 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 --- .gitignore | 1 + elfutils-0.190-fix-core-noncontig.patch | 329 ------------------ elfutils-0.190-gcc-14.patch | 33 -- ...ils-0.190-remove-ET_REL-unstrip-test.patch | 32 -- elfutils.spec | 22 +- sources | 2 +- testcore-noncontig.bz2 | Bin 54684 -> 0 bytes 7 files changed, 12 insertions(+), 407 deletions(-) delete mode 100644 elfutils-0.190-fix-core-noncontig.patch delete mode 100644 elfutils-0.190-gcc-14.patch delete mode 100644 elfutils-0.190-remove-ET_REL-unstrip-test.patch delete mode 100644 testcore-noncontig.bz2 diff --git a/.gitignore b/.gitignore index eb85273..fa7036f 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,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 e8a7f07..0000000 --- a/elfutils-0.190-fix-core-noncontig.patch +++ /dev/null @@ -1,329 +0,0 @@ -From 0fba72fed595f77ca19a57553096ce3cc81cf8f3 Mon Sep 17 00:00:00 2001 -From: Aaron Merey -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 ---- - 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 . */ -+ -+#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 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 . -+ -+. $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.41.0 - diff --git a/elfutils-0.190-gcc-14.patch b/elfutils-0.190-gcc-14.patch deleted file mode 100644 index f81bcc8..0000000 --- a/elfutils-0.190-gcc-14.patch +++ /dev/null @@ -1,33 +0,0 @@ -From: Sergei Trofimovich -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 ---- - -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); - diff --git a/elfutils-0.190-remove-ET_REL-unstrip-test.patch b/elfutils-0.190-remove-ET_REL-unstrip-test.patch deleted file mode 100644 index 0f5599e..0000000 --- a/elfutils-0.190-remove-ET_REL-unstrip-test.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 010cacd89b847659b3c666ac963269b06a8c5058 Mon Sep 17 00:00:00 2001 -From: Aaron Merey -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 - diff --git a/elfutils.spec b/elfutils.spec index dd18ebe..8f2521a 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,13 +1,12 @@ 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 +74,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 @@ -265,8 +258,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 @@ -451,13 +442,20 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Mar 4 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 + * Wed Jan 24 2024 Fedora Release Engineering - 0.190-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild * Fri Jan 19 2024 Fedora Release Engineering - 0.190-5 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - * Tue Nov 28 2023 Aaron Merey - 0.190-4 - Add elfutils-0.190-remove-ET_REL-unstrip-test.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 514ad010e00499b9a75a98800aa20ec61596d491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54684 zcmV(`K-0fMT4*^jL0KkKS^uozYXIBd|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|Nr30x$`S&d4acq=o7uvXi#W%HofZa9`tTkzWd|8>pJNVPdB%_v3ol5^tNg2 zXXaE2J0L!~H=-9w^&Y4S1>v4^-sV??*-lu0l(biQ( z2Jm?e*a3+Gy!*WK2iQKEqdLZ#i@n{lnZ4%5`+2oAW;8y{Ss#79zFhS8zVE#EFbhh@ zyN;cnpL%g5 z*GlHgiMHKM+~TJ1ka^_Kbs8$nIk8zAqkElbdh5%!?Vh){ms058S{-2(vqG)C?YrDG zF2kaAH*N}Mn0x>L5uI;I4vn#hWHNKJqiQoi0QzV>dnR-Pwzg~D#c&b;^PR<;xG;m? zJ>d0ywKQyX_23F90p|PfocIE}?bZMjkTt-Z0DW|}hRtXOfT{&5x&UYaQUSh==Fs|_ z-tOjwOu?^vx#`cTTZf%J?}4Hr01yBGOaK!AOidUerbd|=41+^W14e*o00000nqpu8 z1j&Tc5Yq^0iGc(=?2Y0W{Fi(?cZ0#KhA=V?dY$#M4bQ(@B6e zJriUT15Hdxo~9ZCX&wMfCa0zldQBdr@k#!Xsg%>x)Y_BN6A`D0r9C|~P-&oo1kfOc zf@om|rUr!5CYet`k)~5>dQCk>#G6f1^){1gdTMPNX`@Mv0ESOZHBV%xCL<=Gg(QM#CPAS9Ai**r=o3>Xq{-ODrLCPoba05lCD>R^qa&;UjN)b%{3k5TG2ro?Ds6KHB+O)vyXNFWVNPf#=_ zX_U}nn^gQH^-p9Pp3_vHlO;6rWZGmD{Te1}pQ$r7N3~5oN9vx{15eU=k3yavq}1@E z^-oQqC#cb;o7F!`Z6}oU%}l3}2dU&~Jf_JHQRvhjlhkMl5<+MIfC6X+fC72|Oqm9m zGH9MgB*uw=nrV{+X^7Jxo*|%2PbQ`lC!%_psj&p|Q^O{KH9u1c=pzZIs-K2{noT@v zn^gS>i2#4v!0FKn#Tv?}ib`Q8>2z_jl#p;$`@_;i0(pi0(7Ae`{zkum5#oB?`sL7< z%lR1KErH&z7^ehI5u&jdGfl*>6!WuHMsJYHRka$l;PTGBHM4*oF-nm|m&T*{;{;`WdKSXa;2ukdUp{GHA``1kA_i*eP^jSiOM zM_oo&QoORS!_7K$0O*V{Fj9PAdN$ovut~NlXDZG~Fh8L_!#xG=uAv}?E>Gu=-tw47 zoxQckRYfQAKcPt3TvsHsPb)HZO6k+)mS9}jnXho&6by@#FSIb=jtMoq8;oOCAn!T@ zT`=v-aGv7{K-H?S(4yb!8_}x$_f{x1ofI2+o9E)j zPZ$SyF`d^{kRIfD;M?9nfX_j<6udg`G+xPkv)N1Q zAQE!)1no99jrA1_IpJ zGA>}NEJCQDA@%NyWg=?f!4I=H2@M!Xv|ttrYGAw0Vja;P6{)Qa`+n-?HRU+*Y+?(r zfWTr>ArDb->~wycWOnI}7cpw;)_Ffw<;k+bzC!(z_lWZQV{5#T=Xn}b%7QenDeZM0 z3c+ARVg?{`Sn-H;;Y-zo;vKAykpsPp&}Zn2Vp!x=Pr9_WE|Bj5F$P0XlGzc@@zPR!q;V)~4McS0d zYb(jr>lG8Na}7ACI4M@cbref!N?BLwv`r{)cW!ZXJdi+>7X4N&sb?TA$wS0rPDX&2 z3wMLBk-iwD)~S|boDW3~m%Jl9;)=O4_BO7b$r;5DCoHhz?*G2ateKa-z93QX9@mQv z+Z&bpN-!6W$3uE$OwI#H8;>~RK{}|YhW2l`g##44GDPCkZGC2Sgj(L%Hp827AsZK! z)kJMzQ*5}_xHKrn1@nk9s~##TUFD3|r!p6n=K31U{^VWUGS<#crap-e%Fbl$mgM7G z?Ju^w=$2y_%D)-!^w5eBZr(QvKGxc}Mcj}9^!towRadK0m-n5TaF43Eh#_}be3v=x zMJ}io_Gm1tH`f-oGJai}HCd4$z!6MppH^pA?=TFF?y{*MMLFaggD~GFyC!{YzC4mn zE~wVRCoxpqUEVtEEjs$1x0luQ!mCO`?Mob_Nn#f{sS8O`?5AeoRP^#86PvEp9DT~% zl!7&ic%@3d=h}HZGJS8&la`QFM&@LLe9Mz_>vV}l!M$NBlY@{eVfmM_EaiW?!%zcE z0Bbulugj)TQ=sW8&~}J0yAuuJv9RI5jfTlEN0$P7$U!s^&igXWzzz=KzzgG6&ZKso zrx9DTi53zAUtX+>dY4Q4alq{w*hhtgpLBs=l)OM$W18@R$yHE*Z5w#VlT61eV}k%j z&rC!I2%~JzLa*%Wscsa#Mawwnspl^yO!4E+j);bC3ipCE)#MPj>_;ay@9STQwxvI9VH9RgGGvjL+2`9#o;ZRMP1YTSsjA zi|GD+3GB+PyPFV0;!@&I&5BbG;# z%=diD9Juo4-A8p)e{W&D|3#tEWnFjvFTYa)eHfgZ>RVF*(XBWX@B*4qc0)b=FvTJ5 zuJVT}H_Ik6@%n9|u9haebxJ6YSEt>h9%p$c9}sPWLE)P%eF`e8EuFV_Ijr}88*-tv zZA8?)_EkTzjcyKAqnmc|2sU=2|H}J!(x}aZwDkz43+$Sc`aXj=#?cbwYVmJ(jeZ;E zCWh6|#!*#%%NVx)%GT#3{vBtw;o!lCyRp=-D{aVbPIvU5(sJzGx-^G4(WogExhSUT4z9FY ztTaeQv$MKpNT+k`MvTKK;-)^bhl4l3^yYh(@9#U_)?B={xA1ybl!3ONU74+S$VPqU zCWHkJq1^1dy3BsL4GbS7Y^Kh(yoJgY!}se^y{gwjw^j$^{aeMM0!-t)adQ86`&N%v zq}Fs@mTNZN-`iu_NBQQ?+BjX05u=4~;T3;bPd=|+XUxiDG9u_j+WLU0%J< zz$hGM@%G=Fpy3Z1RSF5ndWt+i=d2?ivZC@k*_@5V-u{@7f;BK~bspNP73SOWbA4U< z|Ak~WcRUTJgsQZ?*wmmpjIH(Wwh@1Cw*+PZ#suBhNhUvD#WL&2HJ`=ZsVp-_POF^t z-0Lu753BTELW?pZ2TeqdYf#u?9#fmtx5}$7uSl#M&J2}_!Mp5fEB^{c_;?Aq&mCU( z=^gL!d?Mm|$S9EPh>Hxn1hy;!99kH z)+!ja4Im4QoM$?HaA>$9@%EvZk7Oa#<(CQrYCex72;~cK^CT)wG!7H5Vc>m{Fcro*<4ki*@<)W9is-&zq z80uO4eKydXMun_aQdO%G1$Xbl5hr=VVpStPzcY>}X0WPVNaREnx)&g&dsv4MIw1l@ z0};NS1f;XF^wBa%_m3BBWqTYyj(yrEoO^5iA{j0*e3noA30?`#I9Z7pGzKD_a`&a= z9_EB&Yw8+6raFeD4ac>Hy5`sqhbr1MjK1z9#a9=TX0^xQ-5CdoC-Q+D9>jwdQ?4!<3HRp6bE4a~)Wbu9z|CIvzEW-*4oT7p3P&r z)s|6YWoB4wHKU<}{;I)&C{Q=XvQ<#(Gsc~=&v zO0Z|}m8OFcQNvxOhFHVH`ga@6_m77cUzlz^JYe`X_KFkhn}}n^8;U8z%~9PLk5ied z`(vkFM!@$TT|bF8c^Gv&M->Us!YCm0|GHmg5a7ctitbrIb(Vmkk5-*W=EX0IN8n>T zV=zO68x=!WZFLzld4+P@z8b)O@()e8M1CzWoJiT(Se|37EWS|rk_X9wccJOKwWDDd zNgm>qu$V5HXec9wgmu5g|3ev640j|T%wH|=DD>r%_pQ-r5ZXOt1;?*LM<-Oe2SB)Z zul32a+W!ZzO#Miua9=0+m=HX>{m8ytLie-~M`A*U=0|_@FyZ?uQ1C|~ z^pEHp``cI?HX*5Uu=i?;K7rWyk1vTF@%x9`TD~oR_`oO_|FwGVdyKoIk)%UNsx=12 zC>)yyuIM9gTf^Gv$g`n}ldmPEGPM|V3YBuG->ZR3vRqmt6}@!D{IPARd$vtOAvdDv zv-zQOT=oLh41XWs|L6C-jptNESExB4?|`Gok^F7+rTt_ggu>*nKC$QT>Zd6jzlx@? z|JbYdDX0$SLmXvZ)Dx?;O%%QQw&zm|H__eyAJ;Z^>1mvXI9_doVnmY!F~d5*zbwZ|CYe|K;*}%Gsu^io*uME21O7i2EE5FZ1GkF-4vvPV1y3cL0oh zZ6pA5-mnuP1vn`(9^n1;{Q1I~#4tZiGAXw_gDIo1rWC+2{gz2egX;KZu*hHono!k! z590J{6Xjq&hB=8rQJ{~K5ms>adjnMdlLRMv%2mmK3maM;KhH!~td zgBN8YhPx{jC0m66Nv%u5$#_B=Nps;^zh8Ufaf4g!&^nZ)txiF{qZrhuRC}otQX8hI zHxgwbDb>3j(kN0RsQ`RZ3JJ6#DYOb497qHi z5Qru#)B#WPF|$mYA`6U}@BW@HC$W`p$;?Eu;Pa8~_2_RuK0VcRcgLBS*!6ib{kt2x z^Z2cdZ4BmxaiEk;SUYq248f@DtQy0F#_*rE{tr8{@qXpv0=5VW8mKm+AjqmR-OjqK z2?f?oWk5A5OQ=$d%q!A}0NLddkY-@bV`(627TR`~8P%|7 zmh&TIBN0z++j<*RF7CvPFL@vl19 zT70jt>S@O6sQP_)P}S3>{eAuTX`u6>kVms_8@aaJDtIA0>s!p~=-ZX_=s;4KHdbgV zvrAT+8l8;*ges#FC$nnjyXr9N0=mG(VywXm_sWYHunA7*aKd8G2Rp}G>nZ{XeE}{= zs9gDeZK~EF9t=87ZtkT-%0+t!Ay{G;USDDhW2@U*Gq?@aNF&!*oy>ui-H4rx5oc`S6!vr=844o+1q^^b8X{!UH?sET#x_m{I8b+QoafMgGAjj*VF?|LU^Hu-9@igw;>4e#><+d%oWAWVZ>F}OVVrv}WZ)FFQ&U26CzdKTI8iz3ne6!zD}xK} z+9a!g^RTUcs844BQ~S*XhW1WoHjEafcS9ty(Xin5|4)Znja_P}*RaCQM&17_M`Xb? zd|%XHag_QyIy!W^n6{r=k^c#%2?UTNp+O{quRd#QAt36dB`mduii)qpDHzs{H?p`W z;Xf224ZhV;Dn-7EsnGk_hSl~e=*7?sh=FUj>6$o^@a{)IK9}$X{W#;F@4`>~*2qh? z-rPL5%ap*%<0 z1%wg%ga{~#8m{2S zJF_ENfkL}krIkW52(@(h>a*91&SK9D9Pw<4=NOPxN$onP1 z+n!s(g&E7bv6yuWh&xD(yam0Q#BAJ??}W~zs8;TzR~bkcTopha1A$RQ-wcGPs<|AJ z+1^s+aL5Y!cFE;E2fMTC1>wgq$Pi#75$;2&0RVvexuw1+0|tDEbmhCsEevfIQ>)ol zV=c{&+pq#n(Msz(W*R`uGzAK%6@&@6-(ALgT-`lTKr{@jKXRji%wfJXFdvWd6|sl! z{A3j;6UacJa0VBkZvmg+ZQibvGZE}oSp>?*>+Psb45)#RU@4g8FbO;}H{mG!>lkd!lGb(v6E@I%!+a^pK<(gmn1yFaAZuP9&;WWU1$WVfb;WU77pCtGF(#-oq zvbvXQwy%Yo>D2|REiLaMD>q^Y8^S(kgrU#S8y;TlNfuA&&<~SF%KCeY6KU6EkV&i> z4rtFL580EWMEP7r#dKNV13`a1rukj6fyp5TP%l4PfH(aRiy#B~&B>VH;=nci1)y^=xmjkOAyb0NKa~01(6shlwgD!{32_eX^i>P@)xR8sz-x zG$prw$LgpTwY&oRDBJV(CKXLbX_qN0CBPu-@KHgnJ@ZdX|%8SP?AtVh{Qxo5s45$W{ zfF^{3s4k2HP%fcNjHnh#h=_V%6*3g1877p-__Fw*51D{BN|X&jRU4pODx)CAV#s&G zj-e4IHLNmQ&doq-P~|(I5Y)K{xsF6MnX!&`;mdZ$?Ad3^jFEhEl!X<4#o3yWq@tFR zU}+eDzFRZB{N82SyA@ zC!00ql{hlWsU=-3R48#Li-d^!g(W-YSjfcX6?qE?bC~NGoh-@DTU95-#Je&=g;*-++YW*1z%qaY|95PS&@3i$q(W{H;FdAxCd7l+p&!M2EeQ$XS4;@IqlB>%;3os0cV6%t8KqCdXBY zLAQGc!6KXvj5okLa6GZZmz$8miM3gOt zWHxgcX%d=UwqX?*|YMO|u zA{u5|0i{?WA`tJ!N7h4yLn`F#jP3)vWUZ*2SgF#`2+ z^U5TSNd!kJCb<0LAb^mRRS>EZfGOq9r{&->NbqJ?JYCLxY{SiaXx?hWX3OX#G{=)0 zX~VKLXo~8!tl=3#P=O;Vo`k;tn*-oR5_jvhp!tdrIGZQz(>in+8#2tB* z`cUN$3^t7<7F*;~L{&)<03PGW>(U;Sbja_3Zai~Do*ZzAHrqynHpDbAQ3kNuH3b~| zdtGcb8>}KqpbxNv31UdFN)qEAF`CkG%ss9c8k{1RY{Jxol7^!m zST0M=?erae?a8SKn1G%Z1xFH0A}7z2Qs{z`sM`!nG1h}3gs11E$wDD1L%#@d?{<5(GF;Y3xo9`4jsL{)7bmau3FVoE@15-L3S6v+d< zaFBGsq}0VxzZ@82F*nK@BuUko?KEggT0)n*)vXm5WbfmTe{qRGNlQf@(geVZrom~A z`HhwYW*I{T3Q;vIl7$FF3rIxyGUOC4h%9oiZ6=^}MGj!(Of;%SMockMAqTcG-Roex zB&O>WK?bRaD&-guMXbmuuB}>h+1MHY(8(2Fsm1vzP%;D$E;;)=pEH=;fzENkpd;Q! z3_%f8A?W!%-Ct|K@x!sL3;=>d_tcVG+xV2|MO>%^eCfKGBxE!Q4?E4tm1YLLik1TI zDIg0BNIUk7h9nJ#@~H?n&$W^A?ec@_!hcunmju)wC3zFgZ3=2&KoiW0ns^I_#d9WZ z)k=YEf`OWdh{%Q^lYMTx$>E40uP6cu!!Ty(plf`4r7#f#!*(y$$RBfUKKH+hQi0I| zeLNx6&xjAif!`nt{aIJ$B}cs=d>Irn8lMD1MNgrAurtQ8(VTICJi5kqrqD z^i2gX#Ic7UHjGuC69HhejQC*i5wro4eCM-*dh+-`^}~-01wP6_d|O0!^lM)aGHqTh z#*x|&rj+j7*R+6po(%UA0sQ0po4k{EY!P+iIhd(p4#|s5(QS!nU%_B#7!_Jb(6j-T(G22ZL2DQ_njTlUmGq;(C%=^S zMtv(r3hU)Yvy}4Oio#a2~$bNWF~66a!Mqm07T_;UZ1X6h3k2+7>*Ajtq{E3!LF)5i@GP%fv-fnKRV@WJH}4SYEE*R4M9SoTNY^@u9j&$5loy2Rz`euP@_ zSpdJKnJO2H0JjuQ?43jueGeWyYo~GYBg&rS2RwXe9z0^fOv=Gi<6e{x83o({VUcL&1m;fxn;BJczBK?3~%=R(nam{}a;A^4~4GuVUR!T@|GA5IYV_p!SIfHF!2 z4D?ksFgFle6Of%xrce!x()`*EV(NlwA@OJNz`>Q`VZr8L3v~nzwk66t3McEq4a5$3 zf!cg>5ZTF6xvRP&{z(NtIx1d8+G^k!qa-4u1k+3L?J6ZC7%g&@XP#+OxZV>wT#U!& z@+B3s(U8e+V(;m2mdAM#V%|L4IM;Bbj8O2yT1U)^GuPfx1iFNnItl_AxcSjD6Ox0LilyeGAN;Pd z_WpFd?!LBD1+HN;Rtw@iQx+S=sx#aS%tun z2egDo*q~7v0<>YFbJf6;=RBXhG;$v2ebR`{T}qRhe2?G4e5MWaP54(S_`$ zVc76a+htn-Ph>+7h@8Ca-|%#h2%N4cq52D2a&s}tBt3#P;*maRfIcLH#sswl&`a#T z$DGTvNigHpTq#}%8Tbw{4FJYE4D;fF$+u#SC}01^Ei?@!tOaCLbI}`6FN~m+Lpfg( zp=?D1Tt!@1UcnPD$k0E+KQ&(Kr@*OEt>W)C|3}E>o7z$TRIDnPFdV z3e|`*T1}?KCNFp8;L}G4>X7=#JlKCXA2TR)TS4VWCKK~L80dtfrVO50{oM(u5d3_3 zQYXWgT*eIAgdko;boQzSi74seYsb-(m?M>rgU~uAJs9s>L*>f) z(!KKf8{tU3a0z}t4%_vRaP%w`w!}W7Md;fey?S~Ny1xSs*RKKGg?RrL)zS4gC$gZMrH@4CGEEPmcsMkVUzhd4UzfyrM~y_Ang;J}6ViB2@xV6}rg!C_`x!i2{Xt zw`4x{@xk&t+4T?|$o!91o37e)wCegur4$oBOjI7?)^X7 z-SN9@&-MEl-%o*XF?KMPiHOp_Vx!X{sPyEc(t&6kAR8=;S_ih$0X41$)0Ho7fKNTql!%u!0y;J{Y)4lFdBZZ-vFJ6Iy$z&?Z?R41N7 z5d!=&5!zE?eY~dWPN@gy<@^EQ!TC7vcnlud8az8<(9*7@4tQ5mhh(RLeEK0G3L1(g zVWKJ{4&*&IibH4sHj#TfxPWy?586tIgXcr_J^WNW9@{YHD+AXC33*I2K*Gxp@`Ki# zJr*5!SX20Ge{ZzpCf?_}Y9*tj$fSAfAzK4lWN=*YFKzSx>xP>iGtPY{OxAM6#f;*Z zV3px`dj>Jc#+;YO$>!U7{Eo4om-hMN$KiU3b@uVvQO@!T?iDSSz*UA^TnZaHqPBk9 zF6E>>#o-MqhJOcfsYG+n!Oj29qH}9#qVGR(^6*p>(3(9nOi!dpF5hL%g|pGJ=z0{n zJPkhE50)C4>X@r|YVYqw&FUHcQhNJzhr91M+ct99pUvNWaHQv4SM9IAAMHu9uKj;q z7tv);YRE=_8DFR^SAV|+19lEQyjM%@vZF0~R~j;PlGsPH1Q1{hxH6A1TdtC1<4P+( zpg=n#5U<3Ix2q?t~ zLDb0r1%N;>rS!oBb5-SfQ0^VDml!_7<^ydZrs`#>^-`7nzx{}<-_=}d@mmLJzD_r@ zr_DFm`du|}4=`k2{hCs52fX9T3v4{Dn}xK}HplS=cNIn-5##pgP|oI$eA07nGX|le z)jE@aRVtVYUAVN>P}%0VjNZ0aQ_#n3_KrYi7*#=i-#q&DKCA`hme2?7!}ZPz&!5@b z@4br*TQTwD968rMb#sfPXA|{2tbDd`h`y3V#-yj>DOo|OPsyy zW35CyH==dGPfgrD#Q}XXNFeYG5rZjnL5M^k0ZIXo0TFFFVT6qdQ-vTQp#uG=if6GloM8V(f3V!Ms5#4 zzCo=NEh?CV$*Es}a`Gd9tONjJt_SgD|`3ZlghMz=FlIe7|yMJE{ zo^PMA*M5)OH!dBI#lzk8?RAluNLdl`rodxExpb@r2Ad&Oe_?CW;_|4{TipG63c*M- zG?5BQ;cqTF1Hk7jz9E{-9&?fW{CY~oME7{_I{tpwpQ3!{-ypE9kFn0oe^|(jZfIS8 z%+fa)J^sdLaizMcCNF&(zV8S-gPJ(K+^uiUH?C)W%Xpt-KAx@}9UQzK5__?3$^73q zS4B&|mbrc0pq`gY0r2|xU2l7}-OhUabUAHfUv0OwWq=#J#xJ?L=|6Y#wDjMbw~zRm z`?S9F&3!g+<^5_jHTw_0{HOH)-M(g%xA5v?g$M=#gBFv_n9fDi3^}N-@dQ8?aPrSq zNdz>;L>CyOX1OtatT(MZ2{TxnW@IsLMyXPISd7T^e?Q<7D`1cX@P-R%k10mjkEyGi zInU3{dn+GGy>4Q7&@_V6&GXpb;cm{~@Ekg$9YA$9v{f?sf~u=Z4=)zHf?s>n1dT(i z>NzkMHoy;SSn*^63Yi{EmJ|O+&G}GByYrGmreV3pd~JN1|JOk4JEZn^nY|fn-rmw5 z&J%Yok_zh1fSrJvn>*AzO~y`sL7_yrA#t^ag?qe!i_vX=YgnR& z1i_4RM+Kq!b_Iq9ipWWcY~4mp{a)7XeHK|S>X$d=+tJui?CbVY``^{#Na5I~OJVss znJpWkp;3nhjpp?brx=?|ABhkmho*gt7B7h(3Q%obem|DVn^e^J@QXP)cMtiUbvo!h zQ#s>ia(KE2H&5i&O%dZCXI1S~2i<^G1?~6TwLl@NB84KS zi0S&zQ0gnAr#zyVlXDN@hO?sFULRVmhc$jBpytSBm6mM7ruUir3i^^Thp`~RN^bOI z^5!#JA!#gyYrdxcr5fcbpx6NsCbJF?WqwD|-;Z>NTN4K&8w)o*06<2AW|RPAXHvInX(O_8n*UL1gbTT9?mRRoWD(CsV@vo9#n{!< ze~jU^*1#r22*`^r0fM`3IX|wC?YnvRUO%GubH07>`YTsAVeGonLuBZ2Hjj%3e)_z- z-M$C<_Vx99FIP8{ZmiGboh~u&lbC#UW!vZMNwMU6w@%l^ zWpdDV^Lp>v7SG@0RD1K=4A-KQotyiy^EBEl4yx^x8$@%y4rpWzv>Nxd4gJ6N1s8k7KIC{)M5W|qY*5Y~`I|St^ z1$WnfTx`Zr{p-(X_BcKqCh=`>xk{)p_IcmY@TUNsqabEe=r`Yjtk^9IqcbiLAZ$dU z7HdHh7Cr`QU{gG%2Z`o=sR4$>PU^lZNWXGmY1me0QT0}DOa1s%0zL$KYGzXGKD?G2 zMk6k2U@hN3eO4;mT@-*b8tU3RMg*7?Qwc0q0{YlnI{pQ6`gYUlM(dHcSNP8s{)Vb6 zY7dgjrOOd9EeFK+q3(d*O`5Y&3Xu#fLF1Wu#S^x~MnI|p?d0R;IQ{NPX^>Tbwdx=< z-N;T$M>GJ&7F=UO3@LCh3B0{Y(8xGdAPTmyB#E)$PGdmbUzP*u+A!jDd;dm34wsZ0 z{#`)TzcVGd*7Acucs6DO4V4%bH5DWy(z`Fl&yVGj7j)GO$bSTA$F-f6h6I|%u>lU? z%x9*XCQ|Y{X%!l<@LrGUM*;H>CiE2_qPjsa7z%a2J_0z>wc#fsQq6nd!ycd);8yf^YVk_MZt+Pv`=m?DF?QJpqAjdc%gBc zrj|LPA;X1eIJw(Aw=ecL4;%@GMg4%OAzO+GeKv9U!I`YVyJgbcC#5GX4fa@c&|4J=koh(-7={fm6--Ca(-FqED;dS0;Y3}>q z=hj_GW@xXA{oD=|5ZeYlemo*gA_5~bh2qUKRiYV>p6KKgt`&+aIl`d-l}>U;`LerB zikAp!)rRR~cg#qMqKojk>A%K|_X~0LJlgrYIheoQFU0wF+5^CLH(zeP-35pC{5qVC z%liI1aap(z*3*CJ(!%&NGuQ3owZj)G5TG5s5A(|6=&0rRo4*#us-^#5$0M$3=6ZP& zz=#8I&fTPFoY34*;k1LY=EI1ZbZ>v^2!6fQm9UGyis%UuMq=-J>&|KXlX<*XUvJghMUcx9^Vd$-9@;IjS)^xH*k}_faM~l zrXkmt1pw*TF7)@NwC+yqu795llmcdcNVxBym;&npc6KaX+Vxq_RF3pY?DQmVHbVhT zNDS1XCtm|(DJD(dfaoOXD<@E;$+38o4vfR2F@A6$+gLAxqyzI(oe;lE=wawe zeRQ|6i>SrlR6O)oF%!6z;suzF_5tnT-y^hD1qSE@#gsnW_dig9=6ZFz z@ae@=$MdrKuR zS5KD9;UQ|*(~4j*F(>JQ3wTJY5|A+l6rD#m;#Dln}9u7M?)Z<$Qbwt$RNQOW`sv= z2PVF%@xO;zDCSPa*EpUrf4jBmGH4h(Kp8Rzpm93?-s$>n40~oA`SXwEH;X@9Pz#78 zgt6vl0ZPz_cPRoIPq;ud{U5^pu}9cTd~w)gb2UF{r!PCVH^# z{$JdG_4uvE`+*ZoILFlgi{|tc1_vb>v)j~X;NUZjHMm7F@LJf;+) z`^)4rvv@eLSZ(We;jRuwZ|n3456-Yy*@nNIumJ;_dMwbbpU)W)c*eug(9%V5EWfS8vb2S2-v(cz%ve9XC(K@6rh&j+Uf%bKFsLb*^|0Br$?3xYc^Lf10 zI=GhK!$^~mvnQE#KoL(+SKU{7~s5FM<$aFNTc_;?2S%Lr=BN33;f5}24 zFi!XU;O~jCH!Rw7=F!fs2&a|U-DsF+VUN$^;A%(37|hWC-Z>`&X*}NxnpPIp;+a<|5=xQs7MzBOU zJWj^EsBPf$<3ZX;M+pAJlZ`^B>1*$LUYDA*_eZVh`d2ObPFpW8n7KpTNm;a`iYCXK zxhoNuHeXTNaaS>j#M)c7pnSUh1sla=_o58ved z-e-Hr;%d24UVppG*W-FQaW7y%Kp;TIAW7*ESB)YFfT=R7S0a*SDuDTUl1d-?a#TyA zYV!lMc6lg0^Ay_{>YDcqJu{`FYWEj+7G^s(ewHPO=i)$Unp}q`0S?PshvD;33#uPL z&jSdo8)9KsAm${IzI{hLg&mpYNg4yG>ZhU1N2s8JbC09e%?hLHs!S6x0qWZ0ngi!E zo1})<0k1KN>jObr65KMhoTU@=BK@fAFqvajSllx!IJ(YCr8`J8gQ10tJ+JdPoKOnOY1G0$>-|_HU=V;Hxi0Yf$YcXtWDK zP4R38@nXS~h#=&HA$l^T21~-HcSO}HPDu26c&ff!A^@E~nADitlqC(Yf32Ni{w&{l zSQ!gbmYM6to1$^q^)$WtjfaMpOY5S{Qn8!z%|4clz#AU&0bgn<&KjdC-ZeeK>DUBl z9=@(j&SP*U(6XrE*tTukwr$(CZ6_0av2B|Z+qP{dlib?-)Twiy>Uw{5^;%UmOZvwp zWY*gSW!qEvR$uZ&hR=T$fzJ2)S*UNU&bf`(77B)hHa%LwRmT&jDy^}^>p@3ie;!*T zC!$=MMje}~4~2f$%eO9i-{c!FI=12yapOmiEL?jW*q7ulj=~15bsA<^c{D<=&l-IN zoBf5T_l}Ii0wvn*7hI=CZ;YIxf`v9oAo6bA6Bm3caUQPokH$tfcefVlyp-0XE;<(! z`DUD@(vXnkmhAA|mZKYHc#T`^apLVwgc7-^H6B$`^_%yNhH9Ge#+{{kh*s}djnCA8*=7& zZ8{$!VKKYybQUI zccyQVFqEC2-jy=it~(09!#a1epItnoG!p;O)nb1K5Tw5I-<W1n-a-yg6G?w^9Vi%YR4L-cO{Uh+homBqkG$*%>Q;Go-B zBD`_N@4I<_=GZL-H}+q8^VJtU{PQiHUHM436qN^pX8A-D;>8LgLsnO6ZPE2ntchK_ zwt)1{xc|x=>unY^PZlINsH@{DkkW1nA={RYx3X5nTBr0L{YywXOjYqyC!hz0GwDr0 z)T+6%S8ughsaC$xX(d^yq^J|YS?gLs1nE)maj+<5Tb6H_s=yoNTzp5*alKk#b2Y|9 z4b=@CUu&9I!)W+QOeMj!<0*%(t(}Btf>$*T%bY+-=)gfh%7!nLHm8zJ!YZW@&(ock zque5`DZn`$Jo4CRMgiNfoW zB07b3El9ej1|tb^HC}8YqpTB!q9Z9%QaeiU4MedNdlV-X7Z=a|uM|ORESM5Lk=>-I z@ICcC9~&4B-tJbQd;!0Yr?a_yLDK(%Tgyip;x8Od?c#oU_v5UCS0$S0C46LX0KIU+ zHN8&li}u;8Nlc)RNgL`A?hTq)?b83pN-Vk=F-C$SgIohp>!`1t z1kN)tRw=$JZ02r-F8T^ZSlC@B0;dE(knCd~fv+kK3GZb#Dib73H2X>%8!~Bpf5+%Y z?!xL)C4#m|^&iy|J;o|yG4i5P6HF+Az2rAO$v6D}ICNSZ(qYv%U{0o)Hp4IF+?t-W%krje%Z{3S|5${}+}^{*Jaa8_=Mqgr zagH3*z-06I<9(^ca11lL!G(8Yug@-thhh1YMN=;ci;Fw-{D&;qQb!8W6v=WEy&+F1KV9 z|De8}nK`}B4@dFwxM;OIv&#I@WxYoEymD3b-0c!Sz6$-mEi&E8A|K@0~} z4GfgY2CuEyvw8w21Nhmk1%$H;se`>I;e=udu2WPLGA7<=mzPY+KwqkVBaX6*`lM-2>VZCh z!Cb!6R@HV+?w@5}IA?EQ*)*tM`kbtP*3zS{jJHlN0tBJ%c?()B{F@=~*3{n0#+QlF z?-J}Xj&nV5@m8zoJA>+A+&C6|0nciCEqW7S=aTU1+kE=SVN>_IW$Pkh+Js~?CltY7 zq+QNkno!Qy!p?OSEiEmsb*=wW*3#n9!4si?A(zZhkI-5uPtepQFzgGpvHfFJ8nKa8 zR(|dL!+7%hd=)nbID?pl=+cuAiL4e*&;R7NG4rf+7RV?tbw~r+6VuN^- zc8vhqG2ZeYTKQJr?S*QfA11qqeKNAe zGuvsavd=)4tBJ;u$NFFJoko^Vc;L*RIOW^U5Gi9^%q5F}43zxxxK?uuETqPRmN5zY zf>h=~U}R7d;>NZUsx!M;jg4l``Ju-t|K*r>hj{S?V+#R>GvV%^+D)pmkP2!ln9`{7 zat>-2x z2B9^T0`MEvbv%eFPR6~(Gympu6rAm?aB{Bra~cY{biQOlyd$u;S>osH)j7I8eZ!xK zE6XFZgW0##mEwjTtVvFq(6XV4D>rg*G}@*B+O1qrR4v}&3qxjIho!KL!{D$Pz{Df_ z3Stqg`Ssq5U=lqthn?v%bUxetGOSe$C@q8Tdbko$pU*kNVXVeO;J_jD{CWXpOtuj! z7PyG0uue0gWYhoJPP#L(=e9tGib}#vyyyMP!p*$Z#|Ie+0)EjU-P!oZr;``i!RU9wRyKRxeYSrCM;hd zY*{R~RcW6kQ|ba1E=C*)yyEjZ^N;qTbtfz!NXHFF+oKZ`#L`P<5(C#bj+G1i9g?Bz zsD^e30~-2CZ9AJoVTINI-kBa$XIz<+lQ`qPmd2-xx&Z%yVT)Z2Wa+Su3p-iCe3}>4 zest%xKTZC1bk*cm-OvL1YebSqfYv$c0&mjE?xNIbUFb4V`cn&Tpa0`i3Ce~#b`^Ap znz+|A+|{P!qf^ojthqE(Y(t_wZTG%au`IH?T+3lvMGq}i}<;ryVgN}JM zXz*u-B^d?IqH6EB38e*2DmKWxqs1fzDu7o5ZgRT#SSf!`MF3MzS}ueph>8VGXR zUQ~>BMkk6(A?RZgizLprGq15ey9xmYs?R7=tY|W6JgTNVKA0uVHYU;@!+;` z=k11cNJz+vobGcjf61-<>}zJ{=>19x4yyTi{4 zCe0Jx(!126gux-SY)M2hqdCAvW6-z$_ClRtmKNEUe9SmWCTCn@DBpd7(b7NFvu z@k&R$mYM+i3|ESO(wn?K(xACZzN<(7k~50uI-Y1i5PoU4l|jh=aHIpB+Xp>TJ#4sE zp+@nYG~3*z#USeVg&Np0`osApe7ZJSqvu)w8%tmQD>^>G5&lrZI4xP%p2p;PggLgm z35TJJGh*^U;GPwE^QE=0WTTJPl1?#yL!&?M-u%eUW8jd18FfYjF~{6q2c)4;@8s~a zVrsgwA?XiZi_G@Mfr{021J)V9{>zg?FM`R;lzgHV3!!@=?6-8R>~9m~y!cW8V9k4-`mbww+Mh zZBvHFqYhu(8LSdrDrInjT{SbPJ->P3*_u6_SwDA2Jcp;OBo6v;}VzqpkuDk}UcDk>^E)c*tT{9brv5$NVh zoEXY)*!32Zao1Vie5-uP_1YNYx$&u??enuQ0-k&KU{Q#!84H26)a6vBE0ORZq3!vW z_j8SV^{rSohZ5v97sPdG1%(^Fd@e`T&+t=j^^|2~p}D>pI}JS5h5rWrabHHie4(19 z8F58gQZ7ujR=yNW*AWQd=&C<#2pEP&9%9MPaU z&u~4yT=q${RmDFF3kr3gKsi9dC53{CmM=F});YIxv$jA|@_M!K#o+BcULnqM=HWfwdd5iY6jYhY5*RrXtA#6hud72F1kC z0IXrsO+wO5Xfh$7Nnj*mq^LqF$x4#|RU{@Tr6D+3l_W4$1!XiMU?ntUGE@;Z)G|Uv zg)t;0MHMt8=}}cOS|KtNDS(jd)5c+vOrj`|^oWx5kkl9q8kiIcDIBmEs3It`DyYIt z0KkfhI*KGZv#h9$27rQ;1wvJ(gJU6)YJx>pB~lqpO_LrKktzdKR8mz?SY#YbL6QZX zB~fJ+Q&N^?Eu)nV9b#326=OwF0;7^i5<^8yWmQp>LQ|y@0Uc!`6HS6+RV9&@2?0RS ziouErAxY7yijhbODhi{?q5=v7m=#r$P!-z5Sew&CK_rtw6;)73L&ZeIl#z)8inOev zQFNq|h>5cxr~o9h5D|-@BJwH# z4N(-a6-lZ!ic&}sbO<$dRg#qiv{jXebV+&=4M|lQIgAulkrs3obVZRkl^IM*Oteu^ zga~yJ3QZ}MMiR9Q6%hq>MO9H!DRqodRkSg2w2V51F?2Ldl^F#ISy@UIg$+q%Nm8YZ z36%_0g-js{OiV!mRTWXCNwhI}K?OynbyZX$giw(Mj0{9k3RM{id09+BL177b7D}oN zP7y^6Aj%p>E2_dO3&W(yJi1CaN~I8*1UkL2fTWTpohsQnBnm180EjUoE=q~fAdX3~ zD8nfWfc9# zijzTyMQ0nK8&G8z5mrV+W}BiGhh>G9Mq5-BRwhPLm7_(b8df3;Mr#mN5=)k6ni547 zXZypfw3rGHhOEXWEG#y!%!JlLO^33ghQ=x_ODhC6!X~pUhfD^fjtrMfBBm}D4vZw$ zvK-8`q$Z9=PY#Zzl1e7bPA*3yg)GiCjLf8rtfmZ(3^qQ$Ae7p|BuXwWhNi3*t}H62 zjgrrOkj?@CDtg0d=hQ_9%CMQ>-CX!ky3O9g) zP9{dDCXOtpj>Jmj5&Js3+BmE>Dg0wAs87hi_VJ0^yHkAqvWs%Nc<0&O5z*<-eiFAi zRB@`R5GJ5=BdSKr4iSR4i6A9y!z3{56-Nc41cxpAFBV9XHc7iH|LlOEBt)6Tf8Ja2 zEU?Au#@8V<>+jHNHzJ0ifqGd22|wJIAal|6oc-o5$W{bw_*xrA%?vw*mS2xsTinLe z(RbDcbdiCjoG~5S8qd0z~=)d^kgpxL7Q#rEdx99>5+L=(9sACAOnr~K4f#3@+rnXuz2 zUiS@G4x@mf+X)jOVjsCtGo}|@Ylf~t)Q4iRsw*}?Wmh%bl=TFeDV7Xb!&P0e8E!xU z;DfFw25A~_tg02E$222W1_#%{FdS#}ZJjt=bx{lxl;dHOl4B$0IhfSLj4J~4B?bw` zOb&#HyfWLB#ZL7NGQ}~e!+MeDtwf@_gy(&MqHiV(5*rm^Vm@j88Va^`2KVcI$HYU= z(Lh8cEc6;?DF9<3q_07gB?rl!GUYelzUkmnTdld}kP&ekHLA}DPzh&}M??&XR5IiN zi67bf(Pb(BG<+r%eayamID8uCk)vg=+^a^t(b6~8A%;@?=(Nckdcge5;f_ZzU7VC# z5`2#G*^49zJR4bi`BS{G9@E-X(rrmWJr+z@42i=nWhOqmt=thj#l#DOSF$^NZjlkR z_{rN3gRm1@){aYoPYVCav4(aB{12#>8yC$QuFM30p<2%A%vTXdugq!Biok&j!u4Zv-ui$G)T33-X zL|TyWq^D_0$}2Obp0a^(@4(3$N9*05v>7Igv!=oKrb2j(S_xDsk1Qg(Dn8^Bz6j9y z3L!=hb@>rKjUrU2n(i>x-vFVZsWDgG9-;hg-SMpY^*>;<`f)CPME=S*@qmq7?E8e{ z0p@8}ys`egQ_ViEyXMy3UX}UsenmL3p{FwB=u?vn^YqcA_ zvvdoP3Su19Xt?KPk-&rR`L^XRe=hF|&AU}yM!(ei|6bE*bS|wWvLN?;=x)~uI%mx5 zZ}V?-b6Sk=WH);_$ZwR<<2D_1x1EjprZV(O7ecXeR>8F&^kvWy?)-gj09~1TMM&Lj zjI_*w%8r!jom0SV6d7>vIyXb0?^z&jb{WreR5@n1E-o?oss-P^rY~M@#jnAFcfI@M zf4NUVFfN2OF82jBvV)ZvSjPo5vP0lXM;X$R<=`*$+3{Sn4t_|Y=T6SVTxryIX%_-V zL$plFm&_}^vJ>*jgL)K_ zDL*fi{c2{8pXJVT^SOoEQd^Xb4uPKHFu~uuJTBTM2A*XV&5W3*3o=Rl%_S!hODACv zD}qib1S@=#>S2$wdEM>agI*s136vBo99O@R zi}gFkTXEUddaVg)n8KjbTH5CGJaqr(*A>6lBP_OM*YS10bq z<<^8B8LkMky_CIXX+%X7Jal1qn4VQKlAGq=8+lU?U-$LXad2d*)x8xW>wg;3K$tZn+95UwSAQbX z9-JO7krJ>|{S0n&b)v6|_Q|Yg#q1EMN4Uyb=J8ZIN9gfXW1Q`Kh`QY)x4GUi!DFvm zZ}L?Zbpt{$HtuaQS?CR4Aa?*<^7MPz`2I=)Z)`LD8iz{CXW1i>KFch zC39SXlO}*@lH{lH2+S+Z2NB5`RspI%3>FW;?*Z4p>N~-pt4o_xb0*rucZD{M!LcAt zQ`n|-=5dYbETg*Q<@3?!!@PHC0jt;VhRtg>?VK_h2#SY3>^Q^8AVTnQS08!uuRT2< zbswL)1ocUb92B6=P3}qnNVQQECl(w!_5yZ}-I=r=|30vW&4dy0=Zs(Zb2OHj?j+{+ zJ$TF#aVq#Flmy5TG7Kj?;<&>7_n-XTgN1WXLDQD%4UZh4XP)3MUFTD$%Q8x|syDoW z7Zv~Mb~(=OSyh8{SQZw8!ibTf(?77K!eA)S;2^FD^zXI;hZn1b-uQP=t{d0(&vx7l zP%exKkpOL&rfsTG4Z2e*gJ&}w32g?OWm-_9m5(`itr?}tj9kv~5g@PRJ=>Dr$)cLg zZ2YWJ{Hf4*Y4~H~z$PU>@_p12pk7j|$)h-*ycIJO)dm7`qImC3Bf6VZbh;CL)|?&+ zmtiAXu6UhR{}88-Rc&J`Gf;*i5OwaU1UY`nSEYGN7pw_@KZAYtOWM@^tYF-1lK0sZQ6dl4ldnPXs z34<6@J`xPXNhAvjNBVw{JQAlZUb)&fv^@1w!vZQ(fQZga4DQrGU3zcNl1ab^Fn%a9 zO|kOB9rSX|nw@V`QaZ0F&Kl7!s!1o}`&3eX=&O{omkagc6*-f zY7s7%Hx!)jE?3uZjeptbiWWY4;pp9{3OK&RiPp?0@dy(zFA)N$ihD!$K$ciUCX_(4 zk*dl+kLT8p4*U6qU{-dEcTDAQA~SlR!2qxX_d2U-8H#L3cEtwHed8Ln{OxdD8#y&? zkL8mCaU}&1xf=ki{9)jQ>$c$6I}tsO;hm3yr9GouJRWaOa*0MG5>@ep5F@LWdhDLs zI&;L_4yC`L^WXhxnGbcVuk;+GF!fCZv>ab%a!OOMj5k(CH;!^@5Oc2n?(rq z%idweqZVj%N2cZ5e}w{?Go zg9T=vJpEzUB>GpH5AB=mA)dDbNM;tOn9cPrg2!or_1&VC*vI?z(2@^!n49_JnDLup zmt-RPJhJ|@umuctNFOjL$kPYv^3ww?Jf^Ev)XI{JrG-AuWr!W4{^PFm$YqZWKg~ zmYW_WMSK+OV^{^e3+LG~FJkg$rL>vrIfo6`1@nAd*Hs~uGy$T?sK{S5jUPxPARV}T$_ z@XG%h7&Px^Zku@$7SmaHU=vA8SNs%g@%~WD-l$I~Y(!!yI=>C?lm#3Vm{88X48%mG zje=!a+N_meXJ*COq4Z1ZWk^P&H*%fSFzkHnuYTe{fNqF$uw=NSUv6m529|C7ko&Ki z;77Wlx`=f^VsimL?Cp&_vO^f^W)hA^2iJO+J^%YO3t8y>xr3Koh*Vyy;#T1|K}pO=KfS) zz16T&)9XlGl=aUIkN)XuZ}%#X>E3j5ayLC&&vNxwxOP^kM|-5FOzfq$F{d*cbU0I2 z^r{!-yL`XV3*b%pJJZ~{}DKK$kqBs9FA9{hq{d3?z-qZ zQ1aOQx0nb(MYItOBnO8KIo$%Dg)WBGNz5j&P7X4E{_UvV`twgCku|&c!l2eSz~Z#N zJElu@>$jGFuGQ($mYX0eZjA75Qn(vmpcW@5&}6+Jx)gs^>t}OY!{rOwpA%aUov+UL z_36H2TD5v@-WHM2d^p>Y>Ts;1zVk-9K+OSgG=5o@7udlUc>HS8Jaze+-_pT7U!gC2 zoVktRsVbP(ddkiAX+4qGh>qA#mV6L2PBb7n4sp5_f4aN)VsPz!$(7IEKuDJ zDA9v=m>X&y&vU6>5d_u@`8MH^sw7$E*wgRoe;uPzM9VU!d7gw+A&mqH4&BwN?;sAJ z0v9Pznp_0IZxhKX@t8(tn%A`I613!#A^C9NN9b^7dl0bIdNv;9OMxo&P2dov(&KJp zrELlm5XHib-EIAzze{rOQ*q6IdLn``8=fb<#;_l71gztocD;?l%6DdZ0NYC zAiyue^dw<$xb8vFa0^^jk|5Gsrf@yZGF!6s!K1!2?5S7!AL{3=J9L#s3kd zqYr_gea&YV;q|J~U=Y3B0#d`UY|G$J(r-T`=xnRC)07c-XI`5!@onxaVnjfIjj})3 z7xR~)Pk?tPb~G|w1i|qMl+yHcbWJrl5U`Mv?0#c*3W9{)PGn;}z1j$3L4{l{bv$m> zB-JCrXzba_#rP?nGt9RA>6EDNKach`hK(1*GnN&ooQ~e|ZLvrPpZGf5yb{Ph%gTwn z<7|I?ybIny#Y@u8N2^e3{aUbQe<5u2mAwTuFy2n#J6bzy{X@CoD<+Gxd*?cKHtR#< zL!@;msM5WB7hYeM)FVtb%`kO0h+H-D;!|=C4xi9$9yM`qh8&6$$`>h%NMn4?&0wXQ zO_GSjfafiLub{+if;tz-^l6J8f5!84RAm2nbUR#Y2))f;N|;(`Bi0S0Ar(<{p9Yrb z32Z?KWgRg!8Q9>@-_UL zSrwd^qxyUd!ztxmtJcqy?}%m%@#18^jtLL$xD5op4Z%`Tr)Lmd?Q)od&$y!Nw&^vY z=JJ0qL1n_PX(CZZhhs6WR|=#DQu`Cpuf21)F>8yYG8H~&vDWkofK(I;@Tm-RK0@@S zfJj)piYjCf@EOQ7ejD^uB@ApCVWA-qYJ^n$YN>CvGO$zR8U&q#-;x8P?M#HK#D|nn z6yD+keCKS~d|FdV*p;_INu3WmF9TXd7e9^wxR@3}?!Ob^V&5yFSL2-*>@|JKwEqMO zXde<6C|}zcr=?dnhG}~npNNeTVs!_K!o!M+u?8ZrNEOc|54ZK6Qa3N$etnwHjaA3` z3f17`CnK9El*~gf--Kh@IaGC!h_S%dYJxCY8s#!xpTV76td7W?e^u+|UfN-NBL*Hv z2_DFUgBRhfwEaMMD+hV2Qprf_9pB*-JZX{Ru3Mk}NaN!26wL0D451Q5Ex!(hUcGfU z+VF;Jq6fl4$m0$(6>9=!tb&=a*2D5vg+qXn8M^8DeYFr6fKxlq4X)^M*Y~%uGN%uC@Up#@}JU{Vy~p@kilMFSyE58)3J$6r)cmMHDWFb&b$W>yt-Cs|PUwBMkw-gtHPirw9x#muRSIE>$aC zhMN(IX-SMpJu3%)$7l!WI^cSeYP|_)=(iCNeJbb)M{jRO#8HFPtdI)emyqjgbJN`; zNH>cOx5w`Vc4N5+RxhbISIq%#21M-#NMSLpHmgj1(C(zI>&oG=csR!xJMUjT_2J|V z_i7#(zk0n25oe+-V3o-xFw}mWD)=TIO!!svrLU3~e?Ity-j$r%Oo)gF!sd+px9iE1 z-q;?N^CB(dMDPhfyXkX_r!zhZu1Uc!;njPXX>|gJRzmwO7y_;SO(;g$=+a$6jQH*w zmaGdfv>D;;6Gp9WA3I{6r2S#9qaubdQ|}purhL6=wwve>K*-T27$_kKWm2B&!C!~K z!3M3|k8>?nzSJt7h#VoPN3 zdjr#xxJUq$7m5re2u%>zQB;j&r3Vzar0EzZVi5eU%vzG-NOK}BD1Z6~aWpa4YMyGo=U;dw)chcbMCz@3qS}270ir;whW3BXZGUp5bwniC7*3Iy`tSU3yEHC;8&P7Uk(1~1AcHd`B zR)dvBHj!-CZBFs&G=YZ4X<4EUUh8kI(ZArl1MB=GT$dM|O1Yriv@8&=^Gp{=qFNj4 zs}OpTSUI2TCj0A721zr&q=gUb)GDptK~ampP_z27i|d`QlL?m=>dl8$49IS}i2FW* z0|Tc$xe)8YT(5REI706-w}wSG?bMA#h62N9e+`?5)+P)xEou3beN#1OHdzvur$0>2 zmPC#+#UmAqwMA+LQ6aL{b=YwSXDqw0Tej*e7a+JyEoe2K3tOZ!tbmuJx<7bBGsF;w6qNq(f*EHNNTaKcnh9V1xOoahw8Wy)xd z0_}m%fec6(8*BD#SkjpXrk*J{Y$b4JsJUVB59ff>rvN02_-BRo+XedsJOzsQEdH&| zV5P|=cc0*UI&YdA`Uj1>K!B8iqzR=DGfv-#$7#3TwL!Ctp3J3YfwbA73IaT5gp*)T zorM@wFjhS0Y!D>e9gdu%94vTnC`usQCv|`M<8F7z>$)BzAu13@-aBkFlSaxx+uNd( zxCB!E*fRy)BE)9Jnlo+dtkhU@gf!Z3X%2x%%eO+}zFj+O7G}aiO_X+k{|5ZC!qLb` zd1qFy9Ux_7Vp%4gFNIe#P4~%r5vwESLM?u%G&o9Q(88&Cs&> zK$|gkbuWNBc6KcEpL?qy$LQkY-d(nTb0;^Q1>EE)F*FO}K8s|n5VDX>>DynlDntK3 z7(0rzz6GXc9^I^#@YpdqD$wM47Rj?A60kVv5I;BZ87MY{x<$YY{vyYHD;PXp7`tMO zFg@HM>1&R@yyTB9AH#{kKbrY|fzOxc!a?)Fh$RbIEyj!ep`vG;$c)m{YDJ!w#Sgmb z=a!q!SDWl4p-U)q?k@3=yggS}qB)y$|9rZq4aWGYYySL7JJZ>&_`p67mMod@npwf$ zhEh6H?19_Pe{)B!08SmudXotwe~30lg%zFMD@~@Bw}*b4SltZ>14fzVwVP@#S2Lq5 ztmaU{=A6XguP#_*A?bpkAyejH68i@b$kVbsv(7V?Zg1<=dWk(+m_WO++*g$CuHyyU zBU1|mc`8;drtK}KJ2A74CmUCt2PqADA^ISbUJ)F>%u?u4@-CIaT_G8GR*=34Wkc6E4 zPg+Jp;#*WEsqK|&;#>95;Y9%GJ*Tsu;{~P+3^p!Y@Hw7Q1>K$dw;V6snMy#)MqnT= zsKSU)z-m-#aVEUtW4=ws(6e67N=Ak_!?b)1Ov^SKQ*SLh95g2S1@hJ4<`&K5SnKU! z*ZM^({|x>2x5`Tz?bIYZ}f&idhuS-z^vp%mdLWfsBGFFWG_NgyZElrPM`hneL)o4aUAgLqh`uczI^& z4=Ds`ZSD=wyK8AOhGKyvk#<9{oWsXoODM}%EFS#2fX7|?LVir#J6-Yk70MWBcV{B` zh1&nR$H4+S^kP$4E6YHqbdLwq7ZnY}WRV$jtP>ceKQXniDrX|g&k)&1u3`{Vf1+Adm*<= zNoi|jCD4PC z%FlI=7d_8=cgO%4ytujdkWMgixVK@0Lkf}@K}a^LT>{~PU=)#cR)sIZn__h#)4izb zl4`EQ~k<2ZJqG)ehp>kGhA{$Xi z2;0C))izX?HoC-n9}-Yyz}5}j_dO^>X4=(HAqL0`CquCkQA@hj+%fojRavT+YN|K+ zIh*B$nr3n|>p&NkN;O0;WV0udwZ(+a_h ztTZ|>f?7_z?DGG*clZZO+Mo9<7C;$65P|fy7d&#d4{SePT`)90{Ul!g?Mut!9)>4oEODJp3gjRs?*G$Rim$OG347f$-u0U!)!GR>HvL@Ul7mN zvIo}pt%}AOa-&Qt2;jjXgkXQ|UOr_LtqV8isB|#C|JzNpR4`x`ZYDm;Ql3T8GEYhgN)37n{ z1_8rQ#Y6bIIyqf{SN`3f_}X$M?~pH`u(4%p!3QffHG4INxb193V2Xe#(W;dn%gx6; zQ>puN{O5`vjJqFl;dksij{6e)N@#-w;{(G58{u3T66}f@+Rqg<$@QNe z;&;WJ5Rb&%&5O&0{58QbEwBC@txg!b@>eloc_A#8g(wt07QNoOs&_qJM#0HgyS|pI zXoVN<3Fasy$}p@`CCY*MDbtvE`pxhB)n6`{Wt`rKfjCi-QkBp-*lS8|<_G9fi zdE&^6vuNsHf(f)ir4H1h<6tlH{F}IeWo>0ivPJ`^88?POz9lZ{l$wKLQ}RUyEEX4PNs$h%Q@oqaf{7Q)6+$#BiB z_hrYQb7dt*#3b)jjd1n;n0`U;llg+p5S3Io(v2Vd0{Kb&JAN+;hSta2J`aw#*13)3 z{gpH5^PDpu0p9{p-#hXN)RU0Ntk+iYKjMX`Q$V2Y*FC|K3`qy_f_cK0Z;<6Y7s^m= z+<8b>a3cb^WIuw)gYW}A5x|-0sl=6G(V^G5*SZvoO9(?c=XVcvi7Xmi3_=Q=EWs!y zkq+lcVZ0RKap(?488BLz^JYJ2lF9BXmyBSz?0*xHgLypjfG)GH&<+bY;NOQyJ*4nq z%J344$NyjjPWZ`N`^c-$vCoaBy^sJdGkWo|-fUZL$opP94=n~IMPmvnB}{Vm07o@E zUyAJ1?Jw$;h539p<(D>T1dqr1%_nS>-!|>`x!;ox^9;)S%=zGnXjs z6Dx`Y)PS+UxLQyJIffA}sk?ToxyG-r6(TQUnF#SB%WTn!Y0b7)G)7XczQ3Ze`{y?& z{wzfRlbaIaj>V%r*I;?!iK# zX^*`qVL+I2A4k2YIqHG5Q#A;A^TiZ&^rT(Y`qUyfkVmX(^~p0Xx#0h|x*{Hwe~I=L zSt0>wo|XJ5vCDYGC{T4|;pSN94JiX1kWHo8Xl$$hC@Ql7#Nar?(pUUnm(%beD5H;>CTIIydTFrH>`ws>#^-oa1aBjI9BIih3?`PsgoPps zs)N;r@7Dsx>=+o+Mst?rX9gat;o;kwY$;u&;CqEQJ)j!l3ki*6na0w(zqp2Fv#3Yo zP^_cKX0oZyd!j%t|FI%#16I?9&^4(<|+{-Cf z^jg^b6`c6>g<(lA;F0o*Ol0B z22m4rODh()O5J{ExP2~Q0&TFHd+rOfA@zU07SjrmWokbf^l8kX%V^@fL z4n-30gMmfT9#n#cI1rr~-HOY0N!=;5rl^P0YwpvfHRwB?9g z;1?x0K#A_OL0!I#c+PWHb;=3zSs@SQVR}udQ6yiPbS$dyqynUG_0)B)&X@d8`e@yB zkyX@xL|CY+tE(FjXQrvEt4ovn&MN+L1%MxQl-rv}yYLD>2dB|WHsM&B}(88xrObqTlkb@KdV-j|i6Ts8}=Ce+kfz z;u%coJ3pJ)Ftyc{XE!i+QodPI8p;ptMC`|k!GV%Qwx6FKfK(|2f10G$yBha z=o?^mUawP8G*~i+%49{rHQfYG;mgEZ3FOH1$4o_yL54jUJf)p-BGnNO?b*hUL6zG( z4Ga>eq|g{N;n#1Ss&I0;niMnK^&e@zYNK_Ys4&N_fkpHfplo77*qv(yz#pEopKZSr zqf)8{s3W-g3+9wjEx@zjFK(%&3j*V~Zo*VK7uO=n4J}uqx#dZPY##3DKfx2PnkuKF zr*Y30p33Nn6X;nz9P27+oMZ}uS<|eUEPl}}UKunk*Wm$mG3j1oLwMVn^13(eRCRC$ z7Hcw`UYc(_e=M$TQM4V~(NEpV03k7Ti>DS78377})Zixz zn&M1SAk0Gt;tJJ*KGsfCpe+6$+3NtL3$SeIwryLxZQFML?cKI*+qSLUwr$(CZR^FI zxifQSUc?ubE3$Iss-o|p$gZ)C17S1QvhQ*f&f9a)&zj)lCS!H(Fe3p40d^kWU||e` zq$v_Sj(d6K{SnUAKeau!=yQ-k zVYYCIqniHW!)Zz5IHbP-q!R@qF-KC^tk^GtLw*?&=n10cY=WG{=}ZQExj51@{5UKW zmT;+Tr&Db{KTd02L5jUMy`FCswlvF@W90fwduF~L9tQf=usU# z8s`a<7w8oKyu3QqY9ZlN%381}8I7D9oRNb=;hSF><%#Zsb zi^Zr{#);T10uP)3chkh{b#j6N50E*(inHEhLA)6O+h3-u!I8P8bX*m-YP#s)KXLPF ziL(Mtb83tCCD99~SoSwy5F7Wzl?~w4UM-Lr6b}6V$d`hqL3kPW?$YqjYj1^=cOTmOr_i1NCJQT-#5S- zkd12%q+uKXR%yrGb&)_QE%W_TP&Z4ETbK(tn42h{e+9wvq%>yDYW|mrm>1m1TTvq> zm~ zex+r*wPt#bNvsV@NDb!Bf|P`@XQ`H$E>UL=>ruTkv=*QYgc$FHl?ox8C;7HlLW<74 zji|w9;1kirKUyhQgHieWN43OHQHcDV!ZOYe?bZMU3k(DffLF-xE|MCdjC1O1zc%xKA6tRd5wF zOK3%GEJD-NZk0o$k;L8IGaS@V#Oq62FUV}}m-;zUhrFEbk@}d)yvRt35+q?YSY|&3 zm^u?U*9qbWdx25oz1h_WNhTHl(r=4FYG*EMbI>}mHNQv7k(6xrAhX34K%$lS0nFaD$yeU zU+D5*A^ke%&>`+H_TY8C!{Z}&l0m3lXS zPCDV}Z)1g+r|>_rN*ZKX-JEI_Tx^^45)X&rB!+!OJ?40^B1%AD|Kfb0>pRej#a<+< zwxOIpXyO4nqlCL)921laxUc@Q90rL&Hq4($s8k0frd1G& z6gn=k>XI!c>wyk8Sm^4o6tgw!&$l(LpVJw3=yMj16ZIbJ-yxCn<#Z^N? zs0GM=|H!6t4H(ckd7#yoA0ejwRp?chT`$*(Mu-B$)~ELNY@fFkiaN!tr+?W~J0eFW z+tx^MjxVOH88mPd)$+^BJ%yq%7_s&SWD6-oK$N1qlx^Pdd!KF>y?Lqh2Iva}PTdh8 zDlu-(LKD=oSW!__pQw?0GPxs!`9z@8-@U&=uJuMt#Z^=+^Qeh$bcui&Fu5Q1o;gNp<(&%wYHU^nNx@)82G6JkYGeR%jHoNO zEX`t>*x-3Vc4$;lIM{#$gaSok=T3YS70xE;1y)g!ccpL4S^{$vQX>>9SX@x;f(xCD zJW#Q?(L-$X54zf&mcRVNeNg^zVs{0DY((f`+~u082dv$2>BIAgQb8<3<~Qo@;A)I! zQ8TyKWn9HkEhAd1S0q>yNkt~y9%s&~>nc=~uPU$tu^}PVwEd7bLom1rBv3H<;$Vl2 zhd;SbBW~HROu-c1Be#}0UWDeULK}n=PFB-Jiei(XI*TeG;L%E`BmtAPq@sGv5t4Q_ zdwb{@p$!@$gRuI$P{3|z13$Fldy0)%Tojau3myL;`BZL5kLgC8F`GBS|8;OwGn}+( zU1Fo%$J>%138h+z9)M3z#5}O9Jp=2 zS$b-q`qA?D+5lZD&uH{*FQeB{R;L&`dHgAFG?9-jY59SrofLqjs93hVufJ|MVK05` zB>4ip8h$6Loj|6d4G~8gW`q9@DSqHD0C`FYmo>bx!Vj3Y?WlSda>qiIq*R|u?`@#D zE2ydSuTt^Tl*|^3e5EEOtEh*!9tNfoS&BzGMhY^F`#S()Q2;-}86ho8vs{POWK|#N z;w&QVpSSZ!MpB1aMFyKXB$5JPJR(3qz=~`I%`pI0u}!y%W#zvrOmC$Z zR%TSDCY|VdlfX;p6@&YuxA-~;MaMorL|FfcS=9k$KRD00yrnB#p$J^D zKnNOMd6jL0rl#RGm*t1DV&V_AB!Xg#Za3Xe9{}*jql6q#5;Yw-<9zN=?DX6}Yg~iY zL2{3Y?+~MhAOSVJc$`-tG!g}ip7JHjF|Q0evjQwn(*&lr$%K`u7Km1^4Mk8oIOnWp z@Rhubu!St8VfdexWt^hXd=;kO!HDAEHF4 zvKx^QFN(-bDS@6S=JpZax^20!;$qfcf6}PY1zHQYte%w<#EF!gAdY(VlxrkMujYIT z(}DKI?BoF=#Vl~X{lU5ziMmuPVRiAauOg=O7UVLi^Z$t$Su~)Zx^v81jjU_*(uBdZ zX{_nxSE=VFYlvB-wE8OAjtLesa)8nCK<;0n+~NNaGb8E`AvNA#jtb1DR2MWJVT-ZE zS^eQ)F%o7xM$%Kji_zd}*f>y}mL$@G**TF}ak}$dC=8Qh207GmlLDE%a*U6wdCh`_ z0C(qixPdF562is~V2BV*3l(i&78E8`2nrAazlxSup)>@6R%mrWG&+2zOpBr zVi{1&yk!!>P02>I8RBHj792AWcpIQ*HdW12e=)@%`WMnOs~tmNe1iU>IaQhhP9@!u z%gyk;Dg1z@K!Bv~lEtE&)B^MX#0~%I!+wY8B-jPLf}31{PCQkU?Cg41c^s}YAv7nn z*S9XzHI)TAsX>hQcQaexz_f#cEL2zwcp0d9@+k7B-VS&F+ zQAGk89)m`iC}K#^p0iBN?esWbdOFxCkPc%+zHr(XuY|j)_DzgNhf^@4%JeyeW#Lk_$M9H6U{A8dO?nQ+o`jZJQ&bCEm!%%POmc@lq@zvvQN| zo32T?bK&P)F+{PsYIx_6L#@-!O(k!3suw{qbNgAFsJ*N!-Q@9rLK%}G6+9O+RM@J! zvCP*+xMJ9An>_vB1Z+WG=P2`dSa~B8KCT*DvJg#3sw|ALKfA|5YGnVAn5^(_e(uM( zUXVMmT&#k3XuoFEA$imoX+TGWo5_a?)z}8gK)3F2!!cw9Qv@Uzh~J-`sif_9u1jv~ z7o2NDdwwz=;a7J2QWObp=J&B+)erluV>_FPAWWph#K5RQUZf=A6M&<-d25y*%~7ik zB9^~|#l7`0E9RS2-8OcY5&4c z#JW7tmOJk6e|-MyW{ZJUTB0#s{VYNz#cbevpcStIropAXRauIE#1|a5_Uh56N76r; zD_!}&nj}>tVuj27%K6|i$k8E6LKq}`Dx}+5+`<3#;=+QCDf5&Rk%B0~m(Hy_M}qi< z;WM=OTvhSsA{woFB-;748~)jBLNL3CNn$kG&)1_D@G&#^yWGp$dES)f%YW~9hM>S4 zw&v0Ttr@%_dMMF6Z8C1f7g5euXz-fP!NxaJslJ#w?0DNg|L(bID&>K5orh~WyxEz& zN8gZGhHKenp{Q$B296JJ1Rk-qSQIc}FI%mE8fe8uc$K#PE;=95VmUcZckr!hG=emS zR`~OZsWvx!b#!@6Gzo!0`yM5=359LN&kDjq?9Eice~{Kj;kz~Vgdo>dgI5tU3#QUTCOC)uvvLV*`jSHq1GO4EzB5A zhkqxQo46)1w;%G^*K;1r0P-dO?4_3Ogbp3RNEA$)hyp`}WgIdBYO!%36>IM|r~wQj zEsFlWQ*_EWGOJLdJVWMP)Y_zUSzFt2T2(haZx1I)xiw>!LNNAMuTlnFiY@b47R->T zIN0n40mF2;WgD5=9&EVZe+D0_|AWXsc2k1ud#WEp)PQL4Z7n<8^IKK!xke%&Kf7{O zzmoWrXJxwFeD{o9haayL@tTVgni&En-_?!rh@_?VHuXk0&K)udjTeoLeN5XF$_lLpy z=%{a_*>>6yZZT9+xF3tCLJ4J5xztI8wj0#BXLWqf)O|u|18v!PzWjJ=^Z5rs7d&OV z&6q+_Gj&%{$rNUaooT1@xp5T+{TowE4G_=miCF zU_X-}TuHwPO*C`RTt(|aAE}#euMP-`jjyl0yqQ(gDar13_vpEvQ|oQY zNq}9W2D9VEJB;VKgQ0iar6 zTN}czTnGNKY5ZBocfo~R5v@_%8i&4i?MRDVxAGfHQ<;9*MEgsAR?XW6oC?YVf&X9t zMEkBiv>Dx4G7)7GC9#=8gk?4{Vrms6eC>U0 z=*r3nqzQPzn6kRO)bQ>mP%J!J&n9zJT-sX)#j0B+sn zFe8MQn^ELIGG_x^nlOL}3lL(AlzgypOd@kCX{2J%*LmrEIv}OFWMmKk8PJeFpimaA1g)uJ4gdsz zhe0Do7xfQ;i9nW8MgssPQKJF!MU_=Tkin^okl;Zj!2~0OnMeSX$>owIL<@jqRuXU! zv35V27+_(v5*V~(C^Qfy025kdQzR=C8mt@< z2mnn93XQr6TDXZinOL$ODj8ZDR*VE0sz45g44e)gicS<}E=Wj>jD(C*bU{V3DIX0U zY5@&IsZgm2z}oYv*Svd4dhZu^>K7I=winCi`Lg02`-dm#*^;$=MYh6mxhb8u<( zd$gz2gNYRv_=`Q?L3vzTs_jK}z#K^+g0HCkH|TFu#;%LbDa?}7*JQlBxG;;bq^!FS z4{DMk7H-HuicBye=Uo*#)5=Rh2|dHJ47h50KKV!0pzSLO-G0>Va-&6w6=Oqc8n{iG ztFoNn!R46WYfCO-Wk1Ji>Gb9y#h!uvMd0th&+e^#<7!i?L4E}VXU-|s&pgVfwAsBJ zUNe@ya|hYT?J~tIMsJVmQbk^cwVJ%fS)UANyq@Q(iY2Hd@4{kyS~7WSW)&pF-|<-y zWUq2qOUuO&7gyYv3J!v;c4>E}yUY>P@^zZtq)(6D4icSmoSRO``s~~%%3p@T%p2TP zJ7UIcu7uXXoiwN5+rqa(7_Q4RDXzMPvN>wu!+%1k<01Fq7Jx8ubJs{Ar8gw?BGIkJ zf1-BxZaJdgD?gYdD}bYkYAdTgI#foPx3rhhGD9~Ws~}$LiY{UTBU3}HS4>e5FtTXt zS?g4)#+*;>m-ODp=mdXnA=-!6d4NCa$eGK(#j=q3UL~!IZZ_V_s^@aYpUn+VwRBbg z?iXZl4$98~=a^=SKKEInLvb0+n65vrQ)>y6}7bM1K$?FO65m)sZB^@hn>6 zeV0YF5pFta5|+pfceyVL$SUZOm*K5kqT1&(NVguozdI7l z8hg3MH&l(r8-1^cbSiFX#0&{4pWvyA^5l(9?&u2N45qb^@0)G#=9H~8%hbt zHMyaxMRizugv{N97_%rz#R$l4T{y=hcn=~nMIw#mH>J^IH#d2~dbL}q%L`AHy$bl9 zJX0yC#VWu4{`!`djm*S`(2+&OK>!jo{7$#0SIUuHMQILyVpC)fea20LS;IB9;s)+- zhV@GR=)WRYN#9vdv4)c~10wt5DXjjIq<|wp2?`s+jWGhL2*RZk!3|er&&?k<#C1ry zCbcF+GZg$_}9D2J$0b zIe-&jziyX}UAS8Q@z)az&cOl+osM;9&T0eWW+$5>!4 zS~++nX?^4dSQ3oF4(}nLB{k$*FEMlCyL6L8Cdny8ofBHW%VG%~j7?qF$16r>=@vW%m6jY>lIcllBCeHw?V$wBW*~_U}x%HjDn)?TA>iCc_x5|_hEdr*S*?x6+U+3#t(jc_TE=~ zbfZpl>hF*>^X%rPt%T`=d$MvRaULr$i`hG;l>D&6x%I=p1{sCUD=v~U=O=RTzPv#2hSh2((fAi29O6lnVXy~R zsJw(rT`IXEHgU2JSh~hwsDILDrG$w!KvK0$8oqOdFI?zupRKDgkM19e!FVqbSsD~X z(rLOEHqHOBk>0ZnKf>8m;n|AE!J@fjHCp?<0cfYHY+|)fsaOs>w3rW1^)MS5RknL} zEd7nj(ZilC#l7g~GS0vAYZdW&xMW!Vp=-TNSU&IBka?A0$l3Dgj-$&xRDGPbcKofG z$$A)cY|yiXxNRv~JG!dZi)~H%Rd?rF_nBcR=kod)cB;(`$kuC-27eR^t=yC&^793& zV3lD-E~|5U5ZZ?<^4IZ_PWGcDGD24@d!6A(gD)6)UPbU~>Y%4c^{SIMXF??+U=waY zXR1&|xVy96@Nt0aaW%(#?B_pFe)o}WPQ2X{s7doi0^TzrS6k0KGnNty3>vJTp&PE7 zy1j@*rjb8F_Ku60tW^~W^u#knU>q$^bS4BgAXhR|?~)Xkgo%gPOnHm}jx=urfc3_} zL~v1aGrpUo-8E=`Hhv2b1FT{%8x6L1*foN-?RRC|Y6s#g?*wjWmlBMH! z#a#>64GHKM0V0M%5_IIJ8ec1%S7sfT%Lt=CzEkZ|L~kE?IU)Jdy_PjPxwYW#D;aVM zJ(hpt@V7mYt&4CZ5&<2>Y^Nzw)6fVfZ~Z%xTi>TyR}16j|}G3kV-GLzCZ#`4R$uPls8h>KTt5X$MccBX!bB6 zGP>z z^LN#VclZV;tvx?fay#ykwPW8jVcnp6Nx}cA3f-d+`}hG2qqMA7-9$;J1HWX{?BPNtYOz~Yb_B6gR zS&ccDV%-h4J+^f&a0$5AKzVPzq9QlM{iWBadq9gqhRY%ADnmhBD$92b}pRn232=DIVlWD`D8gVm_~gl{Tt~_4sAR#^r1hvv+=1*fCwCAtH75O1 zE3Ok3tJ}=Mu43+e@jPPtIJazF@5&%x=WNiq)4nu={D;!(Wu!?7+qO3Jrk;NsmhrR5 z1x>it`edY+G|*_ki>gYg!Fe0z`p)q54O`CJ+U}OHP-~P*)xb1}60bj*~ zd9!qDU6a+n%XX5@CDd`;vuE(Q(N$aa9DZ`~%u%b|*>p4H`t#>!1X^IvRdjBDZ(ko4 z#uz9x%{^I3c_xX}2Pn`Kwd&@8cujN*LOSYK;wx=zU$VcF_>$?J%!PAdD>uXC!pQy5 zqTp$xWH88kIeu-5@4_cT#%w*~T>PrnYHjWpJ5Gf#mZSQ6qW6fKNry*P@BZiWE+ckj zG)08v)%An$dKHzexpT88G5KlvTV+)X&n=D175A>wq(sm{RXVC$jiao*WEH6BKx-Sj_m^E^NTOJ!m=C9kkUb@$?J_NPZ$28=MX;4fa#@0)I$KXsjw#2CW9GrzpV zPdNp@aeQXO5abtWyXOt^D-3mBSKa9Nwc+6|63-*dmIB_P-tp98GOL_n0+94A8LM)4 z&0c2EIy-OZd7Rj?1P;%f>1sZs{I9s^&`MV!N*hlE8#VF)If*V*i0$ThzA`|~afMu2 zh56RzqmW2+y$x-ZC>vp15TZBZh&#o6gvz0TcVk2_S|fqmwgp~2iZg>}8fS0FU#_l} zHM?AuM`z6|jBD6X47=X&t1QUIFSY*$dWs?sOF73H)DFVel0zT%=J?{`21n*~$J0ns zU~ygIBoh%|y*C`Hun76Uc@}csv0)6Qa?lX^N=^?p_ZcPn%(rf8vx5dKu$=plSfk|djebj6bQ+t-h4n^6dCtQRszxYSNxRcj;#F2i2m zjE!)pO_73n$F1iD7Te{PolISy`7T5_#W(6_>kxvv2Rpn1VgJl}$+6XPzVX5S6#}dY+BMMDu_0o7W-}Kt~ z`a3XpY%$<~_y59%?An>_Xj!(<7aWO1`6puBa}$chUz9#Nst+(Q){vV-yNd0Ni~JFW z@;}HUbU`|mi|Xx&Aq}1B>{|p4h4>((50n&)8uYcH`)vPku<>8)WJ(>?>x4W~K<|pCjo`(Fld#I+pG^2^ATkGV! zn}NELVBVDp>ktd^1YOa1gj7dG^!OYT=~`8_Mz{KsR**UjUj8MY0^|7=&V zMu%HrG}=kEAF^6SH`rus4qpQ^ZBs3S!&uPxUf~5fx@XbfuIH@FGyW#g+glI@iBV#e zlxW2N)$|u_*$AOEuiAC!J=@QLb&Y>kGeyR;?#0}-CVe&n1YOvSy_;gTz1}kbbGmM()H}87skwZ0Ot!=F}+l?wcRqT<%gae~vJf}~$e~8%l zqalY7$mn_dy`XwHP)pMKA{H0t)UAa%Y?yVMcy+vT{(3}}eH{z)L+{K=L3Jk^su?46 z@FMHSVd0&4N@h+aMq)h+6V+rYzufcCGHXW|C!ARtP`bKe&&W{S=oYcwwn-&Kc^vX# zjK!X-*Ta-%k={>Vpy{ej5W;IT`+T;I1{*3=bn~|St$TNzzS6%u*JUrf%pxd z8i!Q#cy7Py2R{FlVp2*BsG??ui-RqHdE+g$oHFRjNcfjfnw)Bhpvm-Yy>X&$5PJVm zyjeY1JK>17?sL63H{CDI>gc0aGRT)&qHf@U);B1ELzFKFuZhbRmX1q%ij96rph z`)9fVnV8oma)^z-wsF3?3;t=`i zO64PPNvn>+XzI%doPK~y0=D2ENJ3FjH5&Ys`-`IVGw_)-)n7D!I`wnQ6VfudKRZ|# z9$py{8R4AVi2j&#{ndeiszc5)RT;secx^~Tw4g7(UUg;YA2Pl3rCk4Gszz_O`D|wL z3Hacf?v1~c>p35Ral#5C<1#LEVAO}bH3=E#ypqm;| z!i`S0)Hhkb(RmZS?$2LEA6G_R*wL76Exg=}dm5>)yyBRRN0Q@g|15EA@U%MB?u*|X zl{7RE^yImFCC*g)*W7fU`3LND>@feqErFDUkz@yvl!gBdLu5(D-Tw*suQZNl zYCzHdj{Tpae-}8CpfA~-2_j?(OIS$=R2K4(S*74lFJ;vGir{JQ2>WD!7%mnHv`!ZN zrLQIeO-uZ}85P)`j|P%6s4|%3Wfs)0#b&#+e0cDJs8@?pNW!JDpc~xq_@C5XHi(o_ zipw%JrhMwUH!eWX$d!TJw>RtqYYYJ^gios5T*A#8HGc(#|2`HTt(@p3A6AQ_dX!Li ziregOBYGFF&!yt>ND~kX6WC2GRg}O;Aek)ePJF z*NH$Cr_nU*wU)NOz3;vHjx#bN1`@*gUjUP8JS31DCtc#m_sx`fLpN6;-8alT!_li-QT|0o3%-SBCZ@Scbf0 z935@@v0O3cV8t}W992zq`BxFvNX%z|!18uyaPa2rS}RrH#Ux#UE!s(Y3CDN9_Tjg& zNI}BC_rPu)<<``j^Jj3%$k3*XnV-P}f%71`%*ah~5}b*`*kkOkr}?CmjS%P z{3uSYLJ3Nn4*K2DC|<3kl@l$J=z1DhyWr}fW^;_iJfp8c;p*%w}m+W=erP`v-zd_8BEY0jMp zar`661q-wUa3o1$-eJ}u=l>C5_C@z z#iT`h6GrTsHD;DDbG5t?V|H^u5CcRr()@L&!Bxx7<1dSha$%~-a#h+xNM{R6*t z=U&@9PC~u0crJj?+GU%T2c(I}26}uw71xdIRm?Z?6o^#H%O`=|emCfLLg$>)mN))G zhjm0ZH=fLQfuihZ&~Ty}G=h5Z2)}Z}CG(We`=bTr55INIHfGjhwYV>;$dJ+Yi%esv z$E1+grK7FKoEJr6peCqADgC9xP3{-2Q@n}*H+D7yZEV!An@E7zhrT1ty6+NQ2 zdJ2MF?2<#>>9%X;N9PnvvzeuX3J`&Q5mV_Hs{szLwbw;RVJ{I%PPIsv&XQN_UBk}!YIE2i%B(7u0S zqjMT`LM-g~)6VtE63}Pu-8Qs?r3q9)E-Z4sNkpa0s1vsn`PB)H9JB}T#B*_wnu+k0 zcvpmg%q3M1(K?K9exE|dOP9+C4?@Rk83y5rxPALUxA(LCyhM~;sb&%Aw>A>$s=sO@Jrue21%rE+<@eRrwS2mV z5rU3Yr?^CJiENbin3?v4}s*&gR>S zdsXIDur#ZE;rnd+Vl}zRmpxzXg=TK|f^0bO9k4vqA}nmMh4S37zU?$t-vIvWfg21s zQaQ|wb*41jBssp~?V(wgMawp%ptOS|sT>$qq)qSWItn+BR6~-IcTrY&AoZ_T zYgxGW!KR#ePd+gWvV-{Pf;XAh1??1*RD~8IzEU1t3mbj8n~Mp($40wpYI=KGSiM*! z(baF1Qatq@I|wt*$myhROki=fPo{|(CmE&B_FXW4EdKek&N|&VqtI*o(;<19x4AKo z`<7OM3TLgxs-0*1ww>LHO;Uz^>1^I_GU0(oUz7C_>?Z2-WkI`o@EtWF^L?CZ`$o)h zRLks`w*%anH96Z_TK+YB+wu+99vBay%0}YpQB-oT5nJvbqqe4$3!VOW7N9th1m(%Q zG*0;t(Jim^HV+S(X7RnZEfb^kDSD5-&%`}jAlAi3wmaa4`Z{}5W-BWEhd0~D2Pa_F zdvsZKNZr)i9g=$hE64D;Zir$Kg|vy?XRD-(SQY4X#vCdH`ItWpR5TC-u*%h4R^Bfj z)g6exDt!u9nlSCzt?p~pNjmP|*v6jLFEHkRW0)?fStTk9?fdhQ=Bv;3awNxj88`YO z@;G?yBz^YE{FB#e{g(qZP!#E1UN-~mL0spMEOUHRn%OPZURJ72z(guAYDGJBZ}(Wu zH@)2#zgvYR@uI;mf|V}?Y>2eFmS-C~>W6T$=8eglu#(u)+dqb-;7Ii0gbJ@{ZmIE8x zDs+UbZUsxHx;Y3&;OIa4HMxc{L_9+Cm_sL%S^7P0S|Uac@O30IxG zFp|Ic-N&_~S-z=y_e2S=MrHP|A*NRRAEpaC+S$!uLVq2do|`qs@_LVcSAV@2s-35K z{jUq%UoK~xZi%|vw@E@x7bCh{_0Q?wUV_kR%&i4d02{XAk3|V4V*GluMNDF1q@i1u z0?8#eXfb}oZ61a+U>&5>SJ=AIxw(e2K2{)M9UgSvh@dy4oyV{U0k5;(Gl_P4Q!P$B zfBAqTZGKO3u77{mu7(dG30iyBguJHrEv`O$H>9J-fWNV2*E_g3+@z^=?c=4U+|zmKy7n zFWYYkg2=TYIZ|9l&}RrFs`J|wN4Dh zfaTf-MFrOrDzU0YYBMh0Fn;z~1Xe1cF z7%B51Wc@m_~^ijDPE zaAY<5Lmw(1@{=RzoBZ9+*#B|FOvV=uof#{Q;8NqU(IS0Ve3Ih$&CtOp#WEyVme>;v z`48wDtNM?aWv_YupU^yoDFPaKVd^Y*X@J9i4=-PL-xUb|_FM^fi zn%<5cz3Wdb#5d5~+e|7wsGQqx5ji<1>GdK2=evIBlxeQxzn-3E+EY1Dr3Cb14oMaM$>it0cZ{(jLxRA{5x08&u*Vb6SG!j z_Aox5Z$pNBHazjaH17hRTV(7csE1PJwXX}X~8iwLLl?%PnZsv$fm z9eP#$ats zugits-C=8=S~WlBu537|2E%o^$rqKVFPg^o%9F^z9~mq@f(9Z;DSBR}LHp_V`T({W z+z}K&-o@?idqKD^-6>zzXQ5OK^!C%2s!-5pd&w`?iq64aK3P8AR#8q;ty+e{yY`Cx zF=D5qQka%2FnU`%Z3U; zEGPIu%pbx~;O^-KSoif(o&wC1!%i1`&zPOTVQ+dAmKdxu_eO|pRYL`de_2vY@_vX4 znWzR1)q*iNP39u}j-_9>Hq;_k$a&O4FR5#Fpz%7wHE@HAi%VLQjb(^Ly=NSXz@R`G zX8y|^0eUP}>TnjT+AKYBAvfA*c_`hosOdUgr@aLiG#t1Rv`wkK-k|%=8O#VooqsuSVwAA4q!47kDm8RnW%HqR>?u_XniL9VLO@W78ad_3xys^=Pj&p6g;`7~URhucG;kX5p>w+J>`X54;`6Ao7!Fi2? zm6_$et=6KB=<*p=n37Sh$WE9WxRDxuNTLk zYz^ma#>}sp&a}a?V@vVu`pQj?W*~xpi#G5YX^Jl_K+~JL#0}!QAwXO0ipyuVj~~^V z&ykhRkaWHc3&r}xtEGEo29AQfKL<88{3{~BBqc@PG4x4%Y?ItD>ibob*p4rkBB&qZ zX`eneA+=GouPtbCj)ISZVBm&mV|r#;0^t=c;BPB>0ii%s1A43tkA&4GfH&5nXkmm? z6U)6I?e?mcsk5mq9V^;-_I^3IJ?m?%McLZ=MLl&So%q1i&~0gB4NNFC#7d=pA+~O6 zjOf;_d|k3Vn0d?4GInFyC4zSKx#V~-)p1GZ?aLxA=aFu zTwMPn^{pOElgC4i^J^tdSp$B!phjKS^)wNxYr^cfkDIjq&kO#m((7-#k_a!h{wg9u zIkniaY8B5ytaxbKvp)iq$p z>EoXmg}ENVhK6Yaf#*U*(nGeQjmec&ZGDGaS>=`kyV?xQNH|^c*NGM8%Qi?qdcTVh z_4wZK+zlgq9<*EUbm**8-D41H?$J=FutJ+!XC8hoP*qYd&zlE0!CAJX13vKWxNhY~lIiq}; zi;vk^$bChx%m^t1Pn@^Z>#IcS1Zu%D@I8NN@Msfou8m4IekOr#$wuo^)QRk(KvBwv z^3IVP#-6(HvJrwu$0y5|9lb;XslX_E?jXD8gBmqL{ieOw4_UqI=*&C_WtPNGD-n_G zm&|N{X*(X~LHt`v#c8gM$=XO>bKqnHrTBw@L6H`qj>P6jc*5 zJ9n=0`ILC?{S#4zqquvG->_KXfj;b4Bg$A8sd?a%LfqYl?BMpH>?8m2xq4!0n6tw zu(s}r)+XEc464^JCaIaI;ETg(2}z9I9s5Jq0I!lDMh_L}LXT)F8YE zEFH!%IHghuvZRnwW(y@0(f?PaUA{HJFkAp1j2zt{wb9K;VSvC00Rcy+FlwZ9Nw>tn zF*?MNBHbY%Asr&p(vpG_B8Y^(*L^?NTfYzII{(1=b{s9%F^mG#pAoCEG|P}!!GSIB ztwOQo-LCAmzkJ_0$36j;cuENI2qB(HV5r^mi*6`0I@+*-)!1>^m|}YyxsCin2(S*w zv;Q;LU=cV^OAAR#{Xz`~WO56L7|2@DBC&7i)aklV8G^EWY2{56BI6`O1C@Xo*{ZC} z3eKm{WQ3Wy6IE8;GNZ(3l)daHzOo?#eI0a&i~7>RE5dOnDz>(IT0WKabJr=&;IqOl^&6hI3}o*To@%VD#$0e(e-T7x_|b4fhU4(pN!|h(bKo1 z(D%8p*7zp{!Tw&-UI82m81}3|X)NL*$#0D9Kma83to-OTBN}TA zS|DS|6%%#0vLDq=VF7&_jmxD+3}TAmVx6Bn7>vgfE8C8Cg9BR>6(rRq_TpR0e==A~9Qlp+Aqwho90=DP7&(+uLQrwuD5 zV?3oMFS!M%eIa>k7XPNAm9t{H$RMq408439`yhaE4|?xh$CW~a8#;-^5qS;Y+CnthB` zaKkTLuEM1X3j?g)r1KO5mvlbsaxKJMwk22TQ_iDn22Sat3$Z$2>rF6r*e65@l8!-t zvP&O8=B4r4YiS3WVb_f-5LE=jBxXJ`nv&?%~V{Iv>ufZ@wsinNQ4(o)dAeCNQz7kS3AHpYYmb5lFXwJhD8 zA1#LSzF-;=+&bzWUW>w81;B?valB~Rj?|F&^D1(R3y)f+V8>H;++g~lfRnSpI(m5jKWOIRZ5I&IUF&#sH}nO z9Qp>rNn_p0XcwR=Po^r4fbv4aFrSVA`K6|u)p%35I6)*Q8;YCSuuPNEACsd8Q&5Cd z!}btRU#Z${rE31dW*d&2+W7ulmK;IeXnGCV444PM>4R1^41vo9m)PKF60LlEg8fV4Ax-begu@Or zVu>i!dprdJHo&@anT4cvsq}T|)-=j>DWiimIM{pMWYyY>d64Y<9t`9hszx|j%!V?n zQseFXUKwCj#(qDDZ4+TNdQh)0bpY%)EO>#>PZ^pv!uPFQ!;oc=x;;v>rpcqVn6XOO z>2CNa==93}#h+X3ElaooX2GR7va^Zyn6P11 zbtQdbX*VMhUB!b?<^P=Y`BIdRVJ)4YPnSb$C!W@ojbN)G*EMe-i46OAVOX=j45e&Y z3no#uYap+860sv${PRwxEdlAri;ua_Qe?VmqVXMhPb6cKkW8|JS+-=CFm}!Y8)rr& zZ3(N9=O?m^O6FoHYb0lcK$ekZ3UVd^_O*rMkSurZ+?95#SR;-KFZz(eU6` zN;r)gi5Wy=ZB-~#1-t-+v?Y0!T0_3pf><~QMHCBDa1_m!0d1whOe&78fiWq`feUEU z2N-4iRzoei0BI9xsDO(w2tw$3cml+*Tw0_Vyt>*Nf&t%}hTT)L>6zl_s&RO!$>LG_1)s2hLR+b%xd)O!^aJ?Br2|Ht0|u03Edw)Iy#6GSaM5p?7i{n%kZ=hW zpN>=sS04BMsqic7S!7upT!l$O-eSxi;M=!jQ80-U9k&BuoSjTm$jL<1^MF9(hOt-; zvZ-&=5{%`z7_`=X$*4G-h&2{F$_N;8b98JcQTHL_4M3!aXg5F`JNBibH)3MtJMCsY ze%cdRRIU~%7$_cM?XIin*kXa&5^+qpQ8DwZ>~~B{(P#i3e(cjHW7e^DBqOin-S(CO z_`a=3CHk*C)?kMgjLNpZ`~c}nSo#Q``nbC1I(A>Nua5#Tn(;hlRK|`z+S^LQ*jQ|I zhMEVTh`>BCt=ij|q-4u&N6x{Yu+C3sJpM`cEx`XniAI$f99O|Dp#8k*#{L;$wBtCv zp0WL8BAOIw0HBi|crUyqDXkb+R;SSy1HzA|{h9+_312p4dr)iBPl}+?0+p!5F?O^t zs+x}evL^{Ooz3&t*c;(_^XNm1i8xpcp~o--c+>}15g;w5G%xp+xvC{7BXDtgu1+pc ziPt8T67P+dqw+Evtd=kq->eD%^bJ@SqqYcZ+L?7XB|6W;%__-`^LZKyblr#E3$|=G z#ocF8Bf0ew?45FUREeMM6N^zv(IG$3@XAuAIzipBrkq<$UEgSYd%S-nQgD5eZwle& z(I%}oETy}S-11P&o+ey~PtkKy9_la-wLz$LhZ9Xc;@`!~X7qSj}7OSc&4_?(lItdAhvhxSxFGp;y=R^v(|FTrt z)}=Uy%vz7Ft!xaxaq&N~H0Gb*0uZWJx=1d(b{)EVmX-}0zgz<2FJraB58G1U zH3bQuo0Jv&e$1#6{}Q9?|9m~&?&pvM(@*YrN@CZZEwNA%j=&+{g+PT)?EJjVQI~WD zK8>egwuj+F#8W#idx>v|MU)ZK*V zy`+Z~0V2eVRLTki5yy&Y1#u*oBcIpACC)wEUO(u~%4xTJ%N!cn`S^OJ9WM}0mqF=f zCodjex*N;bK4|kGncz!fnHFFzhP&UJ6wnRot_?Be(e3h81pT=przEVxsTu49DjmHD zFRH&ijWDF8rKPf6WyPexVwzKDI?ROT+|Le2P{*0!oxtk5fq;LGDyIM5RRUkiNyJBQ zefS=HHJaD9WNN6wY#ws1oxID1KQ4BI-qNb0#{7Rd!PA(+W{&6P)5j+lERi_1z8>~Q zhk#xf;n($ZHc0!@g6w&x6IVKYStWH-ig$L9h zQTd+U?rX-8TroWoaH4d$Jb;ohq2bsbbdsbk9}{c<#eCbRlJb<1Jp`1Q!ij-w+++?b{nF zJ@k#vZ}ar@d|I=*B<1J#6t!P(9}vNgKO3G@BCXvuFtOuT*QAjh z_M3CBvh54#`VZpS*WG6cBbjn{E)`~;_eJ)8elc3jfwnb z-uF-?(`^)(R`gB}P8-%j%^~GAdlTHf8YslYpA)WGAgm6oRL799q~}VqiYLJTFBlw7 z0MlC)uL@nV25I~Iat|gdl*^udMQS>?NUHaDz-O+FSs=Ha4k>l5&Ys<6rZwN)=Buqu zYb_5C55=wMdME!Z4gwOXMKBhQQIwXEXs`e>CW~Y~SCrtGbAO?^ydYy*P1GtVjPkyg1r$`DWf|w~=#9>Ll(g)nrYPPN)S?Fg)?QEvTUre!q)1 z(msz@_ts(B;Z8e^<$BHM%6>Ms_6*+K>lj_xXg@TR!f>=$Z!;8f!o2vqGOQ+>35zpE zWXFP(5ORMa%v#4NzA8}-@m;LBrHiL*&-|6jvhB;QNk3kS?OiiV?+@ylcIG)&Ush~4 zb=imIl*|YIcyKdL|7!0Lm)@@&;m7e#{RP>~bH~X`KP{$ny2o^n8J~Yf%^DdQ8Trp< zWG*Iv7 z(qGGVD-M78dw}F&(bAIr?*S)aFrLg|kp;U0M-TP!PYJXxA~tLc;&=VM3H7pUMs`<5 z!aTTt_s*efh#$&z7S^pu6=aEEUi?Sm3*Y~geq<+`=g58*fI;f$`UfJ&lwlX)ZXOYBRjfcW_?rRHO;a{(~QB=Zs zW%NA8L|jBr))y0DW%hG7EO{AzQc_ZaD22R#N%{fUm_CDqXsj$g$~ z%Yfekw6$X=;uu~kWO+Fs49Bf4O#bC)^j~;5MVX5G{M)VRiNX+F?F0Fjm#K@-UAMa* zI$-!5Q2)bna&q!4LTq>36F*4#@nxy)kVEX>o}RG}bC!}My2t=s?%}Dh4{sN5Z)3Z^ zDgbk~iqpC8?hU%uP3X6A5(GREwXntr^o^!}* zu_u1GbnE5tO}XA|?L_?YK~e8?&R7!c;JFup9Sf~G#*T;v1YFEmzENv8^E~jg<*+r0 zznSXadHep0K56t7nA8CRSfhVkMueZxVFeeiE`L*9UEOSUbNAWKa-3Z2ci)bO8fNTOKAmPd+pKChfA6BjC>j zD;oI~mX?;utLBOWo}PeLC`e8|!yl#0t4;^+#qFW)SZznTN<0sgflu%_`%RADsnbuT z*7dG`R9SiY>dZlY=X0&}y)q6#zys-Mt?0$JWI6TS!O74|HHIzK z_S<}YLgJsjKb(VvlC+5<9wbhpPxq|r8G4_3-gnn*MKM^uHz+1nfv@-#im~Qd4V^j% z9iatE5!^r<{mgyjYoVsXfOjvmPpfrmhFRgMavKj!Xg%(Hdz0*|2&DT{Nepr{AnMSrttjxMGJ95 z4fEMdpLNXA03RPU%6WCx(FpVLmJ~5?DE!vyYy0Dse2G!yeGiQ`vfmv-`uZn2T!06` zY$POI`Qf^KA?y(T=Zbno8b;s>TLV)}Ils2KWn3FQX3Q8#FqN${zEqA%av-qSt)3Rm p9>PHxP(U&Fz6)k#QP>6G1uF2Uoqgf&-!I2nuR*k&7loq8{{r=*KH2~P From 3bb662da98c330c501f9fdb46315d0e57dc2b446 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Mon, 4 Mar 2024 15:40:54 -0500 Subject: [PATCH 31/56] Correct another SPDX license formula Operators must be capitalized. --- elfutils.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 8f2521a..16152ac 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Version: 0.191 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 +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 Summary: A collection of utilities and DSOs to handle ELF files and DWARF data From 3bd65efc371c4dd6d6a096d9976baae86a8e5ece Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Mon, 4 Mar 2024 15:57:00 -0500 Subject: [PATCH 32/56] Increment baserelease --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 16152ac..3011716 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.191 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -442,6 +442,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Mar 4 2024 Aaron Merey - 0.191-2 +- Update SPDX license. + * Mon Mar 4 2024 Aaron Merey - 0.191-1 - Upgrade to upstream elfutils 0.191 - Drop upstreamed patches From f5ae9e95e9e2cc69cafeb5c14654af08eb90ae71 Mon Sep 17 00:00:00 2001 From: Michel Lind Date: Wed, 28 Feb 2024 20:20:54 -0600 Subject: [PATCH 33/56] Add feature flag to reenable elfutils-libelf-devel-static and elfutils-devel-static This reverts commit ec548c1605c3f672001b4eae3f52a1c20bcdbbbb. Signed-off-by: Michel Lind --- elfutils.spec | 53 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 3011716..5e64ed3 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,10 @@ +# Rebuild --with static to enable static subpackages +# This is *not* supported by elfutils maintainers +%bcond_with static + Name: elfutils Version: 0.191 -%global baserelease 2 +%global baserelease 3 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -119,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 @@ -127,6 +130,21 @@ 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} + +%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 @@ -149,7 +167,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 @@ -157,6 +174,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 @@ -284,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 %find_lang %{name} @@ -376,6 +409,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 @@ -389,6 +428,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 @@ -442,6 +486,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Mar 11 2024 Michel Lind - 0.191-3 +- Add feature flag for reenabling elfutils-libelf-devel-static and elfutils-devel-static + * Mon Mar 4 2024 Aaron Merey - 0.191-2 - Update SPDX license. From b3d29104fe5a92803216d2b2207abc0512930ace Mon Sep 17 00:00:00 2001 From: Michel Lind Date: Fri, 15 Mar 2024 11:10:43 -0700 Subject: [PATCH 34/56] Make elfutils-libelf-static subpackage (not built by default) pull in libzstd-static Signed-off-by: Michel Lind --- elfutils.spec | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 5e64ed3..5a2677d 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -182,6 +182,7 @@ License: GPL-2.0-or-later or LGPL-3.0-or-later Provides: elfutils-libelf-devel-static%{depsuffix} = %{version}-%{release} %endif Requires: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} +Requires: libzstd-static%{depsuffix} %description libelf-devel-static The elfutils-libelf-static package contains the static archive @@ -486,8 +487,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog -* Mon Mar 11 2024 Michel Lind - 0.191-3 +* Fri Mar 15 2024 Michel Lind - 0.191-3 - Add feature flag for reenabling elfutils-libelf-devel-static and elfutils-devel-static +- Add dependency on libzstd-static for elfutils-libelf-devel-static * Mon Mar 4 2024 Aaron Merey - 0.191-2 - Update SPDX license. From abfa37e359a2d0a86cb02ac8d78f6b04417f7224 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 20 Mar 2024 16:47:31 +0100 Subject: [PATCH 35/56] 0.191-4 - Add elfutils-0.190-riscv-flatten.patch --- elfutils-0.190-riscv-flatten.patch | 359 +++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 365 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.190-riscv-flatten.patch diff --git a/elfutils-0.190-riscv-flatten.patch b/elfutils-0.190-riscv-flatten.patch new file mode 100644 index 0000000..a96d339 --- /dev/null +++ b/elfutils-0.190-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 5a2677d..232864a 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.191 -%global baserelease 3 +%global baserelease 4 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -79,6 +79,8 @@ BuildRequires: gettext-devel # For s390x... FDO package notes are bogus. Patch1: elfutils-0.186-fdo-swap.patch +Patch2: elfutils-0.190-riscv-flatten.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -487,6 +489,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Mar 20 2024 Mark Wielaard - 0.191-4 +- Add elfutils-0.190-riscv-flatten.patch + * Fri Mar 15 2024 Michel Lind - 0.191-3 - Add feature flag for reenabling elfutils-libelf-devel-static and elfutils-devel-static - Add dependency on libzstd-static for elfutils-libelf-devel-static From 42ca992686dc3781c9fbfe2523d3e44932a588e9 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 27 Mar 2024 15:48:18 +0100 Subject: [PATCH 36/56] 0.191-5 - Add elfutils-0.190-profile-empty-urls.patch --- elfutils-0.190-profile-empty-urls.patch | 96 +++++++++++++++++++++++++ elfutils.spec | 9 ++- 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.190-profile-empty-urls.patch diff --git a/elfutils-0.190-profile-empty-urls.patch b/elfutils-0.190-profile-empty-urls.patch new file mode 100644 index 0000000..dab4d9b --- /dev/null +++ b/elfutils-0.190-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.spec b/elfutils.spec index 232864a..064396c 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.191 -%global baserelease 4 +%global baserelease 5 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -79,8 +79,12 @@ BuildRequires: gettext-devel # For s390x... FDO package notes are bogus. Patch1: elfutils-0.186-fdo-swap.patch +# https://sourceware.org/bugzilla/show_bug.cgi?id=31142 Patch2: elfutils-0.190-riscv-flatten.patch +# https://sourceware.org/bugzilla/show_bug.cgi?id=31562 +Patch3: elfutils-0.190-profile-empty-urls.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -489,6 +493,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Mar 27 2024 Mark Wielaard - 0.191-5 +- Add elfutils-0.190-profile-empty-urls.patch + * Wed Mar 20 2024 Mark Wielaard - 0.191-4 - Add elfutils-0.190-riscv-flatten.patch From 8201cf798437a5af2fc3dd68a92b34856526a7a4 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 19 Apr 2024 14:30:24 +0200 Subject: [PATCH 37/56] 0.191-6 - eu-srcfiles directly links to libdebuginfod.so add Requires eu-srcfiles directly links to libdebuginfod.so so explicitly Require elfutils-debuginfod-client not just Recommends. --- elfutils.spec | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 064396c..f17762b 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.191 -%global baserelease 5 +%global baserelease 6 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -18,11 +18,7 @@ Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} -%if 0%{?rhel} >= 8 || 0%{?fedora} >= 20 -Recommends: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} -%else Requires: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} -%endif BuildRequires: gcc # For libstdc++ demangle support @@ -493,6 +489,10 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Fri Apr 19 2024 Mark Wielaard - 0.191-6 +- eu-srcfiles directly links to libdebuginfod.so so explicitly + Require elfutils-debuginfod-client not just Recommends. + * Wed Mar 27 2024 Mark Wielaard - 0.191-5 - Add elfutils-0.190-profile-empty-urls.patch From 58b9fb4783130e27dae845f5f016d98e2a66e015 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Mon, 22 Apr 2024 16:40:49 -0400 Subject: [PATCH 38/56] 0.191-7 Capitalize SPDX booleans. --- elfutils.spec | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index f17762b..5ca5340 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.191 -%global baserelease 6 +%global baserelease 7 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -135,7 +135,7 @@ 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 +License: GPL-2.0-or-later OR LGPL-3.0-or-later %if 0%{!?_isa:1} Provides: elfutils-devel-static%{depsuffix} = %{version}-%{release} %endif @@ -179,7 +179,7 @@ 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 +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 @@ -489,6 +489,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Apr 22 2024 Aaron Merey - 0.191-7 +- Capitalize SPDX booleans. + * Fri Apr 19 2024 Mark Wielaard - 0.191-6 - eu-srcfiles directly links to libdebuginfod.so so explicitly Require elfutils-debuginfod-client not just Recommends. From 53f97b514f048d1b18749b0c36dda13a8448e422 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 17 Jul 2024 21:51:45 +0000 Subject: [PATCH 39/56] Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 5ca5340..2fa3fe1 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.191 -%global baserelease 7 +%global baserelease 8 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -489,6 +489,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Jul 17 2024 Fedora Release Engineering - 0.191-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + * Mon Apr 22 2024 Aaron Merey - 0.191-7 - Capitalize SPDX booleans. From b91c7473d0956d36b5fcbbeaab620be5d5bfca3a Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Mon, 21 Oct 2024 16:24:21 -0400 Subject: [PATCH 40/56] 0.192-1 - Upgrade to upstream elfutils 0.192 - Drop upstreamed patches Add elfutils-0.190-profile-empty-urls.patch Add elfutils-0.190-riscv-flatten.patch --- .gitignore | 1 + elfutils-0.190-profile-empty-urls.patch | 96 ------- elfutils-0.190-riscv-flatten.patch | 359 ------------------------ elfutils.spec | 20 +- sources | 2 +- 5 files changed, 14 insertions(+), 464 deletions(-) delete mode 100644 elfutils-0.190-profile-empty-urls.patch delete mode 100644 elfutils-0.190-riscv-flatten.patch diff --git a/.gitignore b/.gitignore index fa7036f..abe9c2b 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ /elfutils-0.189.tar.bz2 /elfutils-0.190.tar.bz2 /elfutils-0.191.tar.bz2 +/elfutils-0.192.tar.bz2 diff --git a/elfutils-0.190-profile-empty-urls.patch b/elfutils-0.190-profile-empty-urls.patch deleted file mode 100644 index dab4d9b..0000000 --- a/elfutils-0.190-profile-empty-urls.patch +++ /dev/null @@ -1,96 +0,0 @@ -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.190-riscv-flatten.patch b/elfutils-0.190-riscv-flatten.patch deleted file mode 100644 index a96d339..0000000 --- a/elfutils-0.190-riscv-flatten.patch +++ /dev/null @@ -1,359 +0,0 @@ -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 2fa3fe1..3789ce3 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -3,8 +3,8 @@ %bcond_with static Name: elfutils -Version: 0.191 -%global baserelease 8 +Version: 0.192 +%global baserelease 1 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -75,12 +75,6 @@ BuildRequires: gettext-devel # For s390x... FDO package notes are bogus. Patch1: elfutils-0.186-fdo-swap.patch -# https://sourceware.org/bugzilla/show_bug.cgi?id=31142 -Patch2: elfutils-0.190-riscv-flatten.patch - -# https://sourceware.org/bugzilla/show_bug.cgi?id=31562 -Patch3: elfutils-0.190-profile-empty-urls.patch - %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -430,6 +424,9 @@ fi %{_libdir}/libelf.so %{_libdir}/pkgconfig/libelf.pc %{_mandir}/man3/elf_*.3* +%{_mandir}/man3/elf32_*.3* +%{_mandir}/man3/elf64_*.3* +%{_mandir}/man3/libelf.3* %if %{with static} %files libelf-devel-static @@ -450,6 +447,7 @@ fi %config(noreplace) %{_sysconfdir}/profile.d/* %if "%{?dist_debuginfod_url}" %config(noreplace) %{_sysconfdir}/debuginfod/* +%config(noreplace) %{_datadir}/fish/vendor_conf.d/* %endif %files debuginfod-client-devel @@ -489,6 +487,12 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Oct 21 2024 Aaron Merey - 0.192-1 +- Upgrade to upstream elfutils 0.192 +- Drop upstreamed patches + Add elfutils-0.190-profile-empty-urls.patch + Add elfutils-0.190-riscv-flatten.patch + * Wed Jul 17 2024 Fedora Release Engineering - 0.191-8 - Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild diff --git a/sources b/sources index 6091854..52f4826 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.191.tar.bz2) = e22d85f25317a79b36d370347e50284c9120c86f9830f08791b7b6a7b4ad89b9bf4c7c71129133b8d193a0edffb2a2c17987b7e48428b9670aff5ce918777e04 +SHA512 (elfutils-0.192.tar.bz2) = 543188f5f2cfe5bc7955a878416c5f252edff9926754e5de0c6c57b132f21d9285c9b29e41281e93baad11d4ae7efbbf93580c114579c182103565fe99bd3909 From 309360885cf9e6e427ef338ed53ee5fd192d1de5 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Mon, 21 Oct 2024 17:46:30 -0400 Subject: [PATCH 41/56] Add BuildRequires for json-c New libdebuginfod dependency. --- elfutils.spec | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 3789ce3..e8c6055 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.192 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -39,6 +39,8 @@ BuildRequires: pkgconfig(libmicrohttpd) >= 0.9.33 BuildRequires: pkgconfig(libcurl) >= 7.29.0 BuildRequires: pkgconfig(sqlite3) >= 3.7.17 BuildRequires: pkgconfig(libarchive) >= 3.1.2 +# For debugindod metadata query +BuildRequires: pkgconfig(json-c) >= 0.11 # For tests need to bunzip2 test files. BuildRequires: bzip2 @@ -487,6 +489,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Oct 21 2024 Aaron Merey - 0.192-2 +- Add BuildRequires for json-c + * Mon Oct 21 2024 Aaron Merey - 0.192-1 - Upgrade to upstream elfutils 0.192 - Drop upstreamed patches From e50c1eff305b5651b04abc6aa8a7529de0814b49 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Tue, 22 Oct 2024 14:03:15 -0400 Subject: [PATCH 42/56] 0.192-3 Add elfutils-0.192-libelf-static.patch --- elfutils-0.192-libelf-static.patch | 36 ++++++++++++++++++++++++++++++ elfutils.spec | 8 ++++++- 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.192-libelf-static.patch diff --git a/elfutils-0.192-libelf-static.patch b/elfutils-0.192-libelf-static.patch new file mode 100644 index 0000000..799cfb4 --- /dev/null +++ b/elfutils-0.192-libelf-static.patch @@ -0,0 +1,36 @@ +From 0a65a54593ae489d40cb993caa74095d45bc47fd Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Tue, 22 Oct 2024 15:03:42 +0200 +Subject: [PATCH] libelf: Add libeu objects to libelf.a static archive + +libelf might use some symbols from libeu.a, specifically the eu-search +wrappers. But we don't ship libeu.a separately. So include the libeu +objects in the libelf.a archive to facilitate static linking. + + * libelf/Makefile.am (libeu_objects): New variable. + (libelf_a_LIBADD): New, add libeu_objects. + +https://sourceware.org/bugzilla/show_bug.cgi?id=32293 + +Signed-off-by: Mark Wielaard +--- + libelf/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/libelf/Makefile.am b/libelf/Makefile.am +index 3402863e..2d3dbdf2 100644 +--- a/libelf/Makefile.am ++++ b/libelf/Makefile.am +@@ -122,6 +122,9 @@ libelf.so: $(srcdir)/libelf.map $(libelf_so_LIBS) $(libelf_so_DEPS) + @$(textrel_check) + $(AM_V_at)ln -fs $@ $@.$(VERSION) + ++libeu_objects = $(shell $(AR) t ../lib/libeu.a) ++libelf_a_LIBADD = $(addprefix ../lib/,$(libeu_objects)) ++ + install: install-am libelf.so + $(mkinstalldirs) $(DESTDIR)$(libdir) + $(INSTALL_PROGRAM) libelf.so $(DESTDIR)$(libdir)/libelf-$(PACKAGE_VERSION).so +-- +2.47.0 + diff --git a/elfutils.spec b/elfutils.spec index e8c6055..130110f 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.192 -%global baserelease 2 +%global baserelease 3 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -77,6 +77,9 @@ BuildRequires: gettext-devel # For s390x... FDO package notes are bogus. Patch1: elfutils-0.186-fdo-swap.patch +# Include libeu.a objects in libelf.a for static linking. +Patch2: elfutils-0.192-libelf-static.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -489,6 +492,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Tue Oct 22 2024 Aaron Merey - 0.192-3 +- Add elfutils-0.192-libelf-static.patch + * Mon Oct 21 2024 Aaron Merey - 0.192-2 - Add BuildRequires for json-c From 72bb5b7f423a9c807e862b99827a43d925afaced Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 24 Oct 2024 15:21:23 +0200 Subject: [PATCH 43/56] 0.192-4 - Enable eu-stacktrace on x86_64 --- elfutils-0.192-stacktrace-lto.patch | 35 +++++++++++++++++++++++++++++ elfutils.spec | 35 +++++++++++++++++++++++++---- 2 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 elfutils-0.192-stacktrace-lto.patch diff --git a/elfutils-0.192-stacktrace-lto.patch b/elfutils-0.192-stacktrace-lto.patch new file mode 100644 index 0000000..9f110f8 --- /dev/null +++ b/elfutils-0.192-stacktrace-lto.patch @@ -0,0 +1,35 @@ +commit 43829fb8780ecbe9d17aaed22d3dfcb806cb5f45 +Author: Mark Wielaard +Date: Thu Oct 24 10:44:25 2024 +0200 + + stacktrace: Init elf_fd in sysprof_init_dwfl + + When building with LTO gcc believes elf_fd can be used uninitialized: + + In function ‘sysprof_init_dwfl’, + inlined from ‘sysprof_unwind_cb’ at stacktrace.c:1235:16: + stacktrace.c:1087:7: error: ‘elf_fd’ may be used uninitialized [-Werror=maybe-uninitialized] + 1087 | close (elf_fd); + | ^ + + This code won't be reached because if find_procfile doesn't initialize + elf_fd, it will return an error. But help the compiler by initializing + elf_fd to -1. + + * src/stacktrace.c (sysprof_init_dwfl): Init elf_fd to -1. + + Signed-off-by: Mark Wielaard + +diff --git a/src/stacktrace.c b/src/stacktrace.c +index 438cb1dd0d38..b912ca5de502 100644 +--- a/src/stacktrace.c ++++ b/src/stacktrace.c +@@ -1033,7 +1033,7 @@ sysprof_init_dwfl (struct sysprof_unwind_info *sui, + } + + Elf *elf = NULL; +- int elf_fd; ++ int elf_fd = -1; + err = find_procfile (dwfl, &pid, &elf, &elf_fd); + if (err < 0) + { diff --git a/elfutils.spec b/elfutils.spec index 130110f..e415af8 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.192 -%global baserelease 3 +%global baserelease 4 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -16,6 +16,13 @@ Summary: A collection of utilities and DSOs to handle ELF files and DWARF data # Needed for isa specific Provides and Requires. %global depsuffix %{?_isa}%{!?_isa:-%{_arch}} +# eu-stacktrace currently only supports x86_64 +%ifarch x86_64 +%global enable_stacktrace 1 +%else +%global enable_stacktrace 0 +%endif + Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} Requires: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} @@ -52,6 +59,13 @@ BuildRequires: bsdtar BuildRequires: curl # For run-debuginfod-response-headers.sh test case BuildRequires: socat +# For run-debuginfod-find-metadata.sh +BuildRequires: jq + +# For eu-stacktrace +%if %{enable_stacktrace} +BuildRequires: sysprof-capture-devel +%endif BuildRequires: automake BuildRequires: autoconf @@ -80,6 +94,9 @@ Patch1: elfutils-0.186-fdo-swap.patch # Include libeu.a objects in libelf.a for static linking. Patch2: elfutils-0.192-libelf-static.patch +# Fix eu-stacktrace build with lto enabled. +Patch3: elfutils-0.192-stacktrace-lto.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -305,11 +322,14 @@ trap 'cat config.log' EXIT # dist_debuginfod_url is defined in macros.dist. Fedora and CentOS have # URLs pointing to their respective servers. RHEL and Amazon Linux do # not configure a default server. +%configure CFLAGS="$RPM_OPT_FLAGS" \ %if "%{?dist_debuginfod_url}" -%configure CFLAGS="$RPM_OPT_FLAGS" --enable-debuginfod-urls=%{dist_debuginfod_url} -%else -%configure CFLAGS="$RPM_OPT_FLAGS" + --enable-debuginfod-urls=%{dist_debuginfod_url} \ %endif +%if %{enable_stacktrace} + --enable-stacktrace \ +%endif + --enable-debuginfod trap '' EXIT %make_build @@ -385,6 +405,9 @@ fi %{_bindir}/eu-size %{_bindir}/eu-srcfiles %{_bindir}/eu-stack +%if %{enable_stacktrace} +%{_bindir}/eu-stacktrace +%endif %{_bindir}/eu-strings %{_bindir}/eu-strip %{_bindir}/eu-unstrip @@ -492,6 +515,10 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Thu Oct 24 2024 Mark Wielaard - 0.192-4 +- Add elfutils-0.192-stacktrace-lto.patch +- Enable eu-stacktrace on x86_64 + * Tue Oct 22 2024 Aaron Merey - 0.192-3 - Add elfutils-0.192-libelf-static.patch From 347c8e91ee1c65b9d7dc1cc83446a1d7bdb0c013 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Tue, 29 Oct 2024 12:43:39 -0400 Subject: [PATCH 44/56] 0.192-5 - Enable debuginfod IMA verification - Add elfutils-0.192-fix-configure-conditional.patch - Add elfutils-0.192-fix-zsh-profile.patch --- ...tils-0.192-fix-configure-conditional.patch | 25 +++++++++++++ elfutils-0.192-fix-zsh-profile.patch | 37 +++++++++++++++++++ elfutils.spec | 22 ++++++++++- 3 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.192-fix-configure-conditional.patch create mode 100644 elfutils-0.192-fix-zsh-profile.patch diff --git a/elfutils-0.192-fix-configure-conditional.patch b/elfutils-0.192-fix-configure-conditional.patch new file mode 100644 index 0000000..608782a --- /dev/null +++ b/elfutils-0.192-fix-configure-conditional.patch @@ -0,0 +1,25 @@ +From fb4753feb0ed7e3387f52b54bb02c6c74aac6a3e Mon Sep 17 00:00:00 2001 +From: Aaron Merey +Date: Tue, 29 Oct 2024 14:54:10 -0400 +Subject: [PATCH] m + +--- + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure.ac b/configure.ac +index f191488..3d2d3ee 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -892,7 +892,7 @@ AS_IF([test "x$enable_debuginfod" != "xno"],AC_DEFINE([ENABLE_DEBUGINFOD],[1],[B + AM_CONDITIONAL([DEBUGINFOD],[test "x$enable_debuginfod" = "xyes"]) + AS_IF([test "x$enable_debuginfod_ima_verification" = "xyes"],AC_DEFINE([ENABLE_IMA_VERIFICATION],[1],[Build IMA verification])) + AS_IF([test "x$have_libarchive" = "xyes"],AC_DEFINE([HAVE_LIBARCHIVE],[1],[Define to 1 if libarchive is available])) +-AM_CONDITIONAL([ENABLE_IMA_VERIFICATION],[test "$enable_debuginfod_ima_verification" = "xyes"]) ++AM_CONDITIONAL([ENABLE_IMA_VERIFICATION],[test "x$enable_debuginfod_ima_verification" = "xyes"]) + AM_CONDITIONAL([OLD_LIBMICROHTTPD],[test "x$old_libmicrohttpd" = "xyes"]) + + dnl for /etc/profile.d/elfutils.{csh,sh} +-- +2.47.0 + diff --git a/elfutils-0.192-fix-zsh-profile.patch b/elfutils-0.192-fix-zsh-profile.patch new file mode 100644 index 0000000..6df2df8 --- /dev/null +++ b/elfutils-0.192-fix-zsh-profile.patch @@ -0,0 +1,37 @@ +From 00cb3efe36337f27925dbff9b2e7d97c7df95bf8 Mon Sep 17 00:00:00 2001 +From: RocketDev +Date: Sat, 26 Oct 2024 22:18:09 +0800 +Subject: [PATCH] config: fix globing error for zsh + +Zsh treat unmatched glob as error while bash treat that as the original +string. Substitute globing with find to solve. + + * config/profile.sh.in: Fix globing error for zsh + +Signed-off-by: RocketDev +--- + config/profile.sh.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/config/profile.sh.in b/config/profile.sh.in +index 5e86f433..9f3e415a 100644 +--- a/config/profile.sh.in ++++ b/config/profile.sh.in +@@ -6,12 +6,12 @@ + + prefix="@prefix@" + if [ -z "$DEBUGINFOD_URLS" ]; then +- DEBUGINFOD_URLS=$(cat /dev/null "@sysconfdir@/debuginfod"/*.urls 2>/dev/null | tr '\n' ' ' || :) ++ DEBUGINFOD_URLS=$(find "@sysconfdir@/debuginfod" -name "*.urls" -print0 2>/dev/null | xargs -0 cat 2>/dev/null | tr '\n' ' ' || :) + [ -n "$DEBUGINFOD_URLS" ] && export DEBUGINFOD_URLS || unset DEBUGINFOD_URLS + fi + + if [ -z "$DEBUGINFOD_IMA_CERT_PATH" ]; then +- DEBUGINFOD_IMA_CERT_PATH=$(cat /dev/null "@sysconfdir@/debuginfod"/*.certpath 2>/dev/null | tr '\n' ':' || :) ++ DEBUGINFOD_IMA_CERT_PATH=$(find "@sysconfdir@/debuginfod" -name "*.certpath" -print0 2>/dev/null | xargs -0 cat 2>/dev/null | tr '\n' ':' || :) + [ -n "$DEBUGINFOD_IMA_CERT_PATH" ] && export DEBUGINFOD_IMA_CERT_PATH || unset DEBUGINFOD_IMA_CERT_PATH + fi + unset prefix +-- +2.47.0 + diff --git a/elfutils.spec b/elfutils.spec index e415af8..4d9b44d 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.192 -%global baserelease 4 +%global baserelease 5 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -62,6 +62,12 @@ BuildRequires: socat # For run-debuginfod-find-metadata.sh BuildRequires: jq +# For debuginfod rpm IMA verification +BuildRequires: rpm-devel +BuildRequires: ima-evm-utils-devel +BuildRequires: openssl-devel +BuildRequires: rpm-sign + # For eu-stacktrace %if %{enable_stacktrace} BuildRequires: sysprof-capture-devel @@ -97,6 +103,12 @@ Patch2: elfutils-0.192-libelf-static.patch # Fix eu-stacktrace build with lto enabled. Patch3: elfutils-0.192-stacktrace-lto.patch +# Fix ENABLE_IMA_VERIFICATION always evaluating to false. +Patch4: elfutils-0.192-fix-configure-conditional.patch + +# Fix empty glob error on zsh. +Patch5: elfutils-0.192-fix-zsh-profile.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -324,12 +336,13 @@ trap 'cat config.log' EXIT # not configure a default server. %configure CFLAGS="$RPM_OPT_FLAGS" \ %if "%{?dist_debuginfod_url}" + --enable-debuginfod \ --enable-debuginfod-urls=%{dist_debuginfod_url} \ %endif %if %{enable_stacktrace} --enable-stacktrace \ %endif - --enable-debuginfod + --enable-debuginfod-ima-verification trap '' EXIT %make_build @@ -515,6 +528,11 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Tue Oct 29 2024 Aaron Merey - 0.192-5 +- Enable debuginfod IMA verification +- Add elfutils-0.192-fix-configure-conditional.patch +- Add elfutils-0.192-fix-zsh-profile.patch + * Thu Oct 24 2024 Mark Wielaard - 0.192-4 - Add elfutils-0.192-stacktrace-lto.patch - Enable eu-stacktrace on x86_64 From 861e4d63d5203347beaf3e1b43e76619fa115ae2 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Tue, 12 Nov 2024 13:44:16 -0500 Subject: [PATCH 45/56] 0.192-6 - Add elfutils-0.192-strip-ignore-non-ET_REL.patch - Set debuginfod IMA cert path --- elfutils-0.192-strip-ignore-non-ET_REL.patch | 48 ++++++++++++++++++++ elfutils.spec | 12 ++++- 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.192-strip-ignore-non-ET_REL.patch diff --git a/elfutils-0.192-strip-ignore-non-ET_REL.patch b/elfutils-0.192-strip-ignore-non-ET_REL.patch new file mode 100644 index 0000000..bef6ca6 --- /dev/null +++ b/elfutils-0.192-strip-ignore-non-ET_REL.patch @@ -0,0 +1,48 @@ +From e425a70469436c704e6c24dd4bc2abb8fb24b61d Mon Sep 17 00:00:00 2001 +From: Aaron Merey +Date: Tue, 5 Nov 2024 17:41:26 -0500 +Subject: [PATCH] strip: Ignore --reloc-debug-sections-only for non-ET_REL + files. + +strip --reloc-debug-sections-only is expected to be a no-op for +non-ET_REL files. This was not enforced in the code. Sections +were copied over to a new output file and normally its contents +would be identical to the input file. + +However the output file is not identical to a non-ET_REL input +file if the linker organized sections such that the indices of +SHF_ALLOC sections are not in a contigous group. + +In this case strip will modify sections in order to keep all SHF_ALLOC +sections in a contiguous group. + +Fix this by ignoring --reloc-debug-sections-only for non-ET_REL files. + +https://sourceware.org/bugzilla/show_bug.cgi?id=32253 + +Signed-off-by: Aaron Merey +--- + src/strip.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/src/strip.c b/src/strip.c +index 403e0f6f..3812fb17 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -1139,6 +1139,13 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + + if (reloc_debug_only) + { ++ if (ehdr->e_type != ET_REL) ++ { ++ /* Only ET_REL files can have debug relocations to remove. */ ++ error (0, 0, _("Ignoring --reloc-debug-sections-only for " \ ++ "non-ET_REL file '%s'"), fname); ++ goto fail_close; ++ } + if (handle_debug_relocs (elf, ebl, newelf, ehdr, fname, shstrndx, + &lastsec_offset, &lastsec_size) != 0) + { +-- +2.47.0 + diff --git a/elfutils.spec b/elfutils.spec index 4d9b44d..01e85ad 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.192 -%global baserelease 5 +%global baserelease 6 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -109,6 +109,9 @@ Patch4: elfutils-0.192-fix-configure-conditional.patch # Fix empty glob error on zsh. Patch5: elfutils-0.192-fix-zsh-profile.patch +# Fix testsuite failure caused by ld changes. +Patch6: elfutils-0.192-strip-ignore-non-ET_REL.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -342,7 +345,8 @@ trap 'cat config.log' EXIT %if %{enable_stacktrace} --enable-stacktrace \ %endif - --enable-debuginfod-ima-verification + --enable-debuginfod-ima-verification \ + --enable-debuginfod-ima-cert-path=%{_sysconfdir}/keys/ima trap '' EXIT %make_build @@ -528,6 +532,10 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Tue Nov 12 2024 Aaron Merey - 0.192-6 +- Add elfutils-0.192-strip-ignore-non-ET_REL.patch +- Set debuginfod IMA cert path + * Tue Oct 29 2024 Aaron Merey - 0.192-5 - Enable debuginfod IMA verification - Add elfutils-0.192-fix-configure-conditional.patch From 1e27db2f4c45bf0f7dff00e341f60d8b6d8317a7 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 2 Dec 2024 23:41:40 +0100 Subject: [PATCH 46/56] 0.192-7 - Add elfutils-0.192-ATOMIC_VAR_INIT.patch - Add elfutils-0.192-more-dwarf5-lang.patch --- elfutils-0.192-ATOMIC_VAR_INIT.patch | 28 ++++ elfutils-0.192-more-dwarf5-lang.patch | 204 ++++++++++++++++++++++++++ elfutils.spec | 13 +- 3 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.192-ATOMIC_VAR_INIT.patch create mode 100644 elfutils-0.192-more-dwarf5-lang.patch diff --git a/elfutils-0.192-ATOMIC_VAR_INIT.patch b/elfutils-0.192-ATOMIC_VAR_INIT.patch new file mode 100644 index 0000000..962d4c9 --- /dev/null +++ b/elfutils-0.192-ATOMIC_VAR_INIT.patch @@ -0,0 +1,28 @@ +commit 5cc89c78499cd37465d7b0b3f35ef0e5d07a98cc +Author: Mark Wielaard +Date: Mon Nov 18 19:50:17 2024 +0100 + + libdw: Don't use ATOMIC_VAR_INIT + + ATOMIC_VAR_INIT was introduced in C11, but not deemed necessary to + implement atomics. So deprecated in C17 and removed in C23. Normal + initialization syntax should be sufficient. + + * libdw/libdw_alloc.c (next_id): Initialize to zero without + using ATOMIC_VAR_INIT. + + Signed-off-by: Mark Wielaard + +diff --git a/libdw/libdw_alloc.c b/libdw/libdw_alloc.c +index b3e533434939..adc729f525f2 100644 +--- a/libdw/libdw_alloc.c ++++ b/libdw/libdw_alloc.c +@@ -45,7 +45,7 @@ + + #define THREAD_ID_UNSET ((size_t) -1) + static __thread size_t thread_id = THREAD_ID_UNSET; +-static atomic_size_t next_id = ATOMIC_VAR_INIT(0); ++static atomic_size_t next_id = 0; + + struct libdw_memblock * + __libdw_alloc_tail (Dwarf *dbg) diff --git a/elfutils-0.192-more-dwarf5-lang.patch b/elfutils-0.192-more-dwarf5-lang.patch new file mode 100644 index 0000000..2aa0d3b --- /dev/null +++ b/elfutils-0.192-more-dwarf5-lang.patch @@ -0,0 +1,204 @@ +commit 04ba163e813f6b88da850c658a03ac7b5f19f7ad +Author: Mark Wielaard +Date: Fri Nov 22 18:17:29 2024 +0100 + + libdw: Update DW_LANG codes + + Pick up the language codes published after DWARF5 was published. + The are listed at https://dwarfstd.org/languages.html + + Also adjust C language dectection in dwarf_getfuncs and update the + dwarf_default_lower_bound function to return the default lower bounds + for the new langauge codes. + + There is one small change in dwarf_default_lower_bound. We now return + zero instead of an error when called for DW_LANG_Mips_Assembler. Since + there is now an "official" DW_LANG_Assembly which is explicitly + defined as having a default lower bound of zero. It seems better to do + the same for the vendor code too. + + * libdw/dwarf.h: Add new DW_LANG codes. + * libdw/dwarf_default_lower_bound.c (dwarf_default_lower_bound): + Handle new language codes and remove a special case for + DW_LANG_Mips_Assembler. + * libdw/dwarf_getfuncs.c (dwarf_getfuncs): Check against + DW_LANG_C17 and DW_LANG_C23. + * tests/dwarf_default_lower_bound.c: Also check for + DW_LANG_Mips_Assembler. + + Signed-off-by: Mark Wielaard + +diff --git a/libdw/dwarf.h b/libdw/dwarf.h +index 4be32de5a67d..573ffd6925b2 100644 +--- a/libdw/dwarf.h ++++ b/libdw/dwarf.h +@@ -1,5 +1,6 @@ + /* This file defines standard DWARF types, structures, and macros. + Copyright (C) 2000-2011, 2014, 2016, 2017, 2018 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 +@@ -697,7 +698,11 @@ enum + }; + + +-/* DWARF language encodings. */ ++/* DWARF language encodings. ++ ++ See https://dwarfstd.org/languages.html for language code published ++ after DWARF5 was published (but before DWARF6 has been released, ++ which will introduce a new DW_AT_language_name/version scheme). */ + enum + { + DW_LANG_C89 = 0x0001, /* ISO C:1989 */ +@@ -738,6 +743,35 @@ enum + DW_LANG_RenderScript = 0x0024, /* RenderScript Kernal Language */ + DW_LANG_BLISS = 0x0025, /* BLISS */ + ++ DW_LANG_Kotlin = 0x0026, /* Kotlin */ ++ DW_LANG_Zig = 0x0027, /* Zig */ ++ DW_LANG_Crystal = 0x0028, /* Crystal */ ++ DW_LANG_C_plus_plus_17 = 0x002a, /* ISO C++:2017 */ ++ DW_LANG_C_plus_plus_20 = 0x002b, /* ISO C++:2018 */ ++ DW_LANG_C17 = 0x002c, /* ISO C:2017 */ ++ DW_LANG_Fortran18 = 0x002d, /* ISO/IEC 1539-1:2018 */ ++ DW_LANG_Ada2005 = 0x002e, /* ISO Ada:2005 */ ++ DW_LANG_Ada2012 = 0x002f, /* ISO Ada:2005 */ ++ DW_LANG_HIP = 0x0030, /* HIP */ ++ DW_LANG_Assembly = 0x0031, /* Assembly */ ++ DW_LANG_C_sharp = 0x0032, /* C# */ ++ DW_LANG_Mojo = 0x0033, /* Mojo */ ++ DW_LANG_GLSL = 0x0034, /* OpenGL Shading Language */ ++ DW_LANG_GLSL_ES = 0x0035, /* OpenGL ES Shading Language */ ++ DW_LANG_HLSL = 0x0036, /* High-Level Shading Language */ ++ DW_LANG_OpenCL_CPP = 0x0037, /* OpenCL C++ */ ++ DW_LANG_CPP_for_OpenCL = 0x0038, /* C++ for OpenCL */ ++ DW_LANG_SYCL = 0x0039, /* SYCL */ ++ DW_LANG_C_plus_plus_23 = 0x003a, /* ISO C++:2023 */ ++ DW_LANG_Odin = 0x003b, /* Odin */ ++ DW_LANG_P4 = 0x003c, /* P4 */ ++ DW_LANG_Metal = 0x003d, /* Metal */ ++ DW_LANG_C23 = 0x003e, /* ISO C:2023 */ ++ DW_LANG_Fortran23 = 0x003f, /* ISO/IEC 1539-1:2023 */ ++ DW_LANG_Ruby = 0x0040, /* Ruby */ ++ DW_LANG_Move = 0x0041, /* Move */ ++ DW_LANG_Hylo = 0x0042, /* Hylo */ ++ + DW_LANG_lo_user = 0x8000, + DW_LANG_Mips_Assembler = 0x8001, /* Assembler */ + DW_LANG_hi_user = 0xffff +diff --git a/libdw/dwarf_default_lower_bound.c b/libdw/dwarf_default_lower_bound.c +index a33a34335b1b..50639e32428e 100644 +--- a/libdw/dwarf_default_lower_bound.c ++++ b/libdw/dwarf_default_lower_bound.c +@@ -1,5 +1,6 @@ + /* Get the default subrange lower bound for a given language. + Copyright (C) 2016 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 +@@ -63,6 +64,30 @@ dwarf_default_lower_bound (int lang, Dwarf_Sword *result) + case DW_LANG_Dylan: + case DW_LANG_RenderScript: + case DW_LANG_BLISS: ++ case DW_LANG_Kotlin: ++ case DW_LANG_Zig: ++ case DW_LANG_Crystal: ++ case DW_LANG_C_plus_plus_17: ++ case DW_LANG_C_plus_plus_20: ++ case DW_LANG_C17: ++ case DW_LANG_HIP: ++ case DW_LANG_Assembly: ++ case DW_LANG_C_sharp: ++ case DW_LANG_Mojo: ++ case DW_LANG_GLSL: ++ case DW_LANG_GLSL_ES: ++ case DW_LANG_HLSL: ++ case DW_LANG_OpenCL_CPP: ++ case DW_LANG_CPP_for_OpenCL: ++ case DW_LANG_SYCL: ++ case DW_LANG_C_plus_plus_23: ++ case DW_LANG_Odin: ++ case DW_LANG_P4: ++ case DW_LANG_Metal: ++ case DW_LANG_C23: ++ case DW_LANG_Ruby: ++ case DW_LANG_Move: ++ case DW_LANG_Hylo: + *result = 0; + return 0; + +@@ -80,9 +105,18 @@ dwarf_default_lower_bound (int lang, Dwarf_Sword *result) + case DW_LANG_Modula3: + case DW_LANG_PLI: + case DW_LANG_Julia: ++ case DW_LANG_Fortran18: ++ case DW_LANG_Ada2005: ++ case DW_LANG_Ada2012: ++ case DW_LANG_Fortran23: + *result = 1; + return 0; + ++ /* Special case vendor Assembly variant. */ ++ case DW_LANG_Mips_Assembler: ++ *result = 0; ++ return 0; ++ + default: + __libdw_seterrno (DWARF_E_UNKNOWN_LANGUAGE); + return -1; +diff --git a/libdw/dwarf_getfuncs.c b/libdw/dwarf_getfuncs.c +index b95f06f403d1..f6968f0081d4 100644 +--- a/libdw/dwarf_getfuncs.c ++++ b/libdw/dwarf_getfuncs.c +@@ -1,5 +1,6 @@ + /* Get function information. + Copyright (C) 2005, 2013, 2015 Red Hat, Inc. ++ Copyright (C) 2024 Mark J. Wielaard + This file is part of elfutils. + Written by Ulrich Drepper , 2005. + +@@ -104,7 +105,9 @@ dwarf_getfuncs (Dwarf_Die *cudie, int (*callback) (Dwarf_Die *, void *), + bool c_cu = (lang == DW_LANG_C89 + || lang == DW_LANG_C + || lang == DW_LANG_C99 +- || lang == DW_LANG_C11); ++ || lang == DW_LANG_C11 ++ || lang == DW_LANG_C17 ++ || lang == DW_LANG_C23); + + struct visitor_info v = { callback, arg, (void *) offset, NULL, c_cu }; + struct Dwarf_Die_Chain chain = { .die = CUDIE (cudie->cu), +diff --git a/tests/dwarf_default_lower_bound.c b/tests/dwarf_default_lower_bound.c +index d57424fc77fe..46e26f885a6b 100644 +--- a/tests/dwarf_default_lower_bound.c ++++ b/tests/dwarf_default_lower_bound.c +@@ -1,6 +1,7 @@ + /* Test all DW_LANG constants are handled by dwarf_default_lower_bound. + + Copyright (C) 2016 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 +@@ -34,18 +35,6 @@ test_lang (const char *name, int lang) + Dwarf_Sword low; + int res = dwarf_default_lower_bound (lang, &low); + +- /* Assembler is special, it doesn't really have arrays. */ +- if (lang == DW_LANG_Mips_Assembler) +- { +- if (res == 0) +- { +- printf ("%s shouldn't have a known lower bound\n", name); +- exit (-1); +- } +- printf ("%s: \n", name); +- return; +- } +- + if (res != 0) + { + printf ("dwarf_default_lower_bound failed (%d) for %s\n", res, name); diff --git a/elfutils.spec b/elfutils.spec index 01e85ad..ea03564 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.192 -%global baserelease 6 +%global baserelease 7 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -112,6 +112,12 @@ Patch5: elfutils-0.192-fix-zsh-profile.patch # Fix testsuite failure caused by ld changes. Patch6: elfutils-0.192-strip-ignore-non-ET_REL.patch +# In c23 ATOMIC_VAR_INIT has been removed +Patch7: elfutils-0.192-ATOMIC_VAR_INIT.patch + +# New DWARF5 language constants +Patch8: elfutils-0.192-more-dwarf5-lang.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -532,6 +538,11 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog + +* Mon Dec 2 2024 Mark Wielaard - 0.192-7 +- Add elfutils-0.192-ATOMIC_VAR_INIT.patch +- Add elfutils-0.192-more-dwarf5-lang.patch + * Tue Nov 12 2024 Aaron Merey - 0.192-6 - Add elfutils-0.192-strip-ignore-non-ET_REL.patch - Set debuginfod IMA cert path From f6430a4ebda42fcb5088cd5731c5f3fc11cc5667 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 16 Jan 2025 16:47:28 +0000 Subject: [PATCH 47/56] Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index ea03564..70ec135 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.192 -%global baserelease 7 +%global baserelease 8 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -538,6 +538,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Thu Jan 16 2025 Fedora Release Engineering - 0.192-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + * Mon Dec 2 2024 Mark Wielaard - 0.192-7 - Add elfutils-0.192-ATOMIC_VAR_INIT.patch From d699b959583150a338063b89425f4805bd886b47 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sun, 23 Feb 2025 13:32:24 +0100 Subject: [PATCH 48/56] 0.192-9 - Add elfutils-0.192-imasig-fail-free.patch --- elfutils-0.192-imasig-fail-free.patch | 33 +++++++++++++++++++++++++++ elfutils.spec | 9 ++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.192-imasig-fail-free.patch diff --git a/elfutils-0.192-imasig-fail-free.patch b/elfutils-0.192-imasig-fail-free.patch new file mode 100644 index 0000000..8840fcd --- /dev/null +++ b/elfutils-0.192-imasig-fail-free.patch @@ -0,0 +1,33 @@ +commit 1be0787d6654ed71bf659e8bfd34895fea7589eb +Author: Aaron Merey +Date: Fri Jan 24 19:43:19 2025 -0500 + + debuginfod-client.c: Avoid freeing uninitialized value + + debuginfod_validate_imasig might call free on an uninitialized sig_buf + due to a goto that can occur before sig_buf is set to NULL. + + Fix this by setting sig_buf to NULL before the goto. + + Signed-off-by: Aaron Merey + +diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c +index deff19ff4568..d89beae93ea1 100644 +--- a/debuginfod/debuginfod-client.c ++++ b/debuginfod/debuginfod-client.c +@@ -1587,6 +1587,7 @@ debuginfod_validate_imasig (debuginfod_client *c, int fd) + { + int rc = ENOSYS; + ++ char* sig_buf = NULL; + EVP_MD_CTX *ctx = NULL; + if (!c || !c->winning_headers) + { +@@ -1594,7 +1595,6 @@ debuginfod_validate_imasig (debuginfod_client *c, int fd) + goto exit_validate; + } + // Extract the HEX IMA-signature from the header +- char* sig_buf = NULL; + char* hdr_ima_sig = strcasestr(c->winning_headers, "x-debuginfod-imasignature"); + if (!hdr_ima_sig || 1 != sscanf(hdr_ima_sig + strlen("x-debuginfod-imasignature:"), "%ms", &sig_buf)) + { diff --git a/elfutils.spec b/elfutils.spec index 70ec135..5e1ef20 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.192 -%global baserelease 8 +%global baserelease 9 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -118,6 +118,9 @@ Patch7: elfutils-0.192-ATOMIC_VAR_INIT.patch # New DWARF5 language constants Patch8: elfutils-0.192-more-dwarf5-lang.patch +# debuginfod-client.c: Avoid freeing uninitialized value +patch9: elfutils-0.192-imasig-fail-free.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -538,10 +541,12 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Sun Feb 23 2025 Mark Wielaard - 0.192-9 +- Add elfutils-0.192-imasig-fail-free.patch + * Thu Jan 16 2025 Fedora Release Engineering - 0.192-8 - Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - * Mon Dec 2 2024 Mark Wielaard - 0.192-7 - Add elfutils-0.192-ATOMIC_VAR_INIT.patch - Add elfutils-0.192-more-dwarf5-lang.patch From 3e1c6bb1d8bae31db498ad4d9b181c195e90669a Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Tue, 8 Apr 2025 17:32:01 +0000 Subject: [PATCH 49/56] Update elfutils.spec, supporting dist_debuginfod_url values with spaces --- elfutils.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 5e1ef20..281eb0f 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -349,7 +349,7 @@ trap 'cat config.log' EXIT %configure CFLAGS="$RPM_OPT_FLAGS" \ %if "%{?dist_debuginfod_url}" --enable-debuginfod \ - --enable-debuginfod-urls=%{dist_debuginfod_url} \ + --enable-debuginfod-urls="%{dist_debuginfod_url}" \ %endif %if %{enable_stacktrace} --enable-stacktrace \ From 34ae6eb109ec01600b21b615add4098e0b3f65ea Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Mon, 28 Apr 2025 18:01:43 -0400 Subject: [PATCH 50/56] 0.193-1 - Upgrade to upstream elfutils 0.193 - Drop upstreamed patches elfutils-0.192-ATOMIC_VAR_INIT.patch elfutils-0.192-libelf-static.patch elfutils-0.192-fix-configure-conditional.patch elfutils-0.192-more-dwarf5-lang.patch elfutils-0.192-fix-zsh-profile.patch elfutils-0.192-stacktrace-lto.patch elfutils-0.192-imasig-fail-free.patch elfutils-0.192-strip-ignore-non-ET_REL.patch --- .gitignore | 1 + elfutils-0.192-ATOMIC_VAR_INIT.patch | 28 --- ...tils-0.192-fix-configure-conditional.patch | 25 --- elfutils-0.192-fix-zsh-profile.patch | 37 ---- elfutils-0.192-imasig-fail-free.patch | 33 --- elfutils-0.192-libelf-static.patch | 36 ---- elfutils-0.192-more-dwarf5-lang.patch | 204 ------------------ elfutils-0.192-stacktrace-lto.patch | 35 --- elfutils-0.192-strip-ignore-non-ET_REL.patch | 48 ----- elfutils.spec | 40 ++-- sources | 2 +- 11 files changed, 16 insertions(+), 473 deletions(-) delete mode 100644 elfutils-0.192-ATOMIC_VAR_INIT.patch delete mode 100644 elfutils-0.192-fix-configure-conditional.patch delete mode 100644 elfutils-0.192-fix-zsh-profile.patch delete mode 100644 elfutils-0.192-imasig-fail-free.patch delete mode 100644 elfutils-0.192-libelf-static.patch delete mode 100644 elfutils-0.192-more-dwarf5-lang.patch delete mode 100644 elfutils-0.192-stacktrace-lto.patch delete mode 100644 elfutils-0.192-strip-ignore-non-ET_REL.patch diff --git a/.gitignore b/.gitignore index abe9c2b..a406bd1 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ /elfutils-0.190.tar.bz2 /elfutils-0.191.tar.bz2 /elfutils-0.192.tar.bz2 +/elfutils-0.193.tar.bz2 diff --git a/elfutils-0.192-ATOMIC_VAR_INIT.patch b/elfutils-0.192-ATOMIC_VAR_INIT.patch deleted file mode 100644 index 962d4c9..0000000 --- a/elfutils-0.192-ATOMIC_VAR_INIT.patch +++ /dev/null @@ -1,28 +0,0 @@ -commit 5cc89c78499cd37465d7b0b3f35ef0e5d07a98cc -Author: Mark Wielaard -Date: Mon Nov 18 19:50:17 2024 +0100 - - libdw: Don't use ATOMIC_VAR_INIT - - ATOMIC_VAR_INIT was introduced in C11, but not deemed necessary to - implement atomics. So deprecated in C17 and removed in C23. Normal - initialization syntax should be sufficient. - - * libdw/libdw_alloc.c (next_id): Initialize to zero without - using ATOMIC_VAR_INIT. - - Signed-off-by: Mark Wielaard - -diff --git a/libdw/libdw_alloc.c b/libdw/libdw_alloc.c -index b3e533434939..adc729f525f2 100644 ---- a/libdw/libdw_alloc.c -+++ b/libdw/libdw_alloc.c -@@ -45,7 +45,7 @@ - - #define THREAD_ID_UNSET ((size_t) -1) - static __thread size_t thread_id = THREAD_ID_UNSET; --static atomic_size_t next_id = ATOMIC_VAR_INIT(0); -+static atomic_size_t next_id = 0; - - struct libdw_memblock * - __libdw_alloc_tail (Dwarf *dbg) diff --git a/elfutils-0.192-fix-configure-conditional.patch b/elfutils-0.192-fix-configure-conditional.patch deleted file mode 100644 index 608782a..0000000 --- a/elfutils-0.192-fix-configure-conditional.patch +++ /dev/null @@ -1,25 +0,0 @@ -From fb4753feb0ed7e3387f52b54bb02c6c74aac6a3e Mon Sep 17 00:00:00 2001 -From: Aaron Merey -Date: Tue, 29 Oct 2024 14:54:10 -0400 -Subject: [PATCH] m - ---- - configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/configure.ac b/configure.ac -index f191488..3d2d3ee 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -892,7 +892,7 @@ AS_IF([test "x$enable_debuginfod" != "xno"],AC_DEFINE([ENABLE_DEBUGINFOD],[1],[B - AM_CONDITIONAL([DEBUGINFOD],[test "x$enable_debuginfod" = "xyes"]) - AS_IF([test "x$enable_debuginfod_ima_verification" = "xyes"],AC_DEFINE([ENABLE_IMA_VERIFICATION],[1],[Build IMA verification])) - AS_IF([test "x$have_libarchive" = "xyes"],AC_DEFINE([HAVE_LIBARCHIVE],[1],[Define to 1 if libarchive is available])) --AM_CONDITIONAL([ENABLE_IMA_VERIFICATION],[test "$enable_debuginfod_ima_verification" = "xyes"]) -+AM_CONDITIONAL([ENABLE_IMA_VERIFICATION],[test "x$enable_debuginfod_ima_verification" = "xyes"]) - AM_CONDITIONAL([OLD_LIBMICROHTTPD],[test "x$old_libmicrohttpd" = "xyes"]) - - dnl for /etc/profile.d/elfutils.{csh,sh} --- -2.47.0 - diff --git a/elfutils-0.192-fix-zsh-profile.patch b/elfutils-0.192-fix-zsh-profile.patch deleted file mode 100644 index 6df2df8..0000000 --- a/elfutils-0.192-fix-zsh-profile.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 00cb3efe36337f27925dbff9b2e7d97c7df95bf8 Mon Sep 17 00:00:00 2001 -From: RocketDev -Date: Sat, 26 Oct 2024 22:18:09 +0800 -Subject: [PATCH] config: fix globing error for zsh - -Zsh treat unmatched glob as error while bash treat that as the original -string. Substitute globing with find to solve. - - * config/profile.sh.in: Fix globing error for zsh - -Signed-off-by: RocketDev ---- - config/profile.sh.in | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/config/profile.sh.in b/config/profile.sh.in -index 5e86f433..9f3e415a 100644 ---- a/config/profile.sh.in -+++ b/config/profile.sh.in -@@ -6,12 +6,12 @@ - - prefix="@prefix@" - if [ -z "$DEBUGINFOD_URLS" ]; then -- DEBUGINFOD_URLS=$(cat /dev/null "@sysconfdir@/debuginfod"/*.urls 2>/dev/null | tr '\n' ' ' || :) -+ DEBUGINFOD_URLS=$(find "@sysconfdir@/debuginfod" -name "*.urls" -print0 2>/dev/null | xargs -0 cat 2>/dev/null | tr '\n' ' ' || :) - [ -n "$DEBUGINFOD_URLS" ] && export DEBUGINFOD_URLS || unset DEBUGINFOD_URLS - fi - - if [ -z "$DEBUGINFOD_IMA_CERT_PATH" ]; then -- DEBUGINFOD_IMA_CERT_PATH=$(cat /dev/null "@sysconfdir@/debuginfod"/*.certpath 2>/dev/null | tr '\n' ':' || :) -+ DEBUGINFOD_IMA_CERT_PATH=$(find "@sysconfdir@/debuginfod" -name "*.certpath" -print0 2>/dev/null | xargs -0 cat 2>/dev/null | tr '\n' ':' || :) - [ -n "$DEBUGINFOD_IMA_CERT_PATH" ] && export DEBUGINFOD_IMA_CERT_PATH || unset DEBUGINFOD_IMA_CERT_PATH - fi - unset prefix --- -2.47.0 - diff --git a/elfutils-0.192-imasig-fail-free.patch b/elfutils-0.192-imasig-fail-free.patch deleted file mode 100644 index 8840fcd..0000000 --- a/elfutils-0.192-imasig-fail-free.patch +++ /dev/null @@ -1,33 +0,0 @@ -commit 1be0787d6654ed71bf659e8bfd34895fea7589eb -Author: Aaron Merey -Date: Fri Jan 24 19:43:19 2025 -0500 - - debuginfod-client.c: Avoid freeing uninitialized value - - debuginfod_validate_imasig might call free on an uninitialized sig_buf - due to a goto that can occur before sig_buf is set to NULL. - - Fix this by setting sig_buf to NULL before the goto. - - Signed-off-by: Aaron Merey - -diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c -index deff19ff4568..d89beae93ea1 100644 ---- a/debuginfod/debuginfod-client.c -+++ b/debuginfod/debuginfod-client.c -@@ -1587,6 +1587,7 @@ debuginfod_validate_imasig (debuginfod_client *c, int fd) - { - int rc = ENOSYS; - -+ char* sig_buf = NULL; - EVP_MD_CTX *ctx = NULL; - if (!c || !c->winning_headers) - { -@@ -1594,7 +1595,6 @@ debuginfod_validate_imasig (debuginfod_client *c, int fd) - goto exit_validate; - } - // Extract the HEX IMA-signature from the header -- char* sig_buf = NULL; - char* hdr_ima_sig = strcasestr(c->winning_headers, "x-debuginfod-imasignature"); - if (!hdr_ima_sig || 1 != sscanf(hdr_ima_sig + strlen("x-debuginfod-imasignature:"), "%ms", &sig_buf)) - { diff --git a/elfutils-0.192-libelf-static.patch b/elfutils-0.192-libelf-static.patch deleted file mode 100644 index 799cfb4..0000000 --- a/elfutils-0.192-libelf-static.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 0a65a54593ae489d40cb993caa74095d45bc47fd Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Tue, 22 Oct 2024 15:03:42 +0200 -Subject: [PATCH] libelf: Add libeu objects to libelf.a static archive - -libelf might use some symbols from libeu.a, specifically the eu-search -wrappers. But we don't ship libeu.a separately. So include the libeu -objects in the libelf.a archive to facilitate static linking. - - * libelf/Makefile.am (libeu_objects): New variable. - (libelf_a_LIBADD): New, add libeu_objects. - -https://sourceware.org/bugzilla/show_bug.cgi?id=32293 - -Signed-off-by: Mark Wielaard ---- - libelf/Makefile.am | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/libelf/Makefile.am b/libelf/Makefile.am -index 3402863e..2d3dbdf2 100644 ---- a/libelf/Makefile.am -+++ b/libelf/Makefile.am -@@ -122,6 +122,9 @@ libelf.so: $(srcdir)/libelf.map $(libelf_so_LIBS) $(libelf_so_DEPS) - @$(textrel_check) - $(AM_V_at)ln -fs $@ $@.$(VERSION) - -+libeu_objects = $(shell $(AR) t ../lib/libeu.a) -+libelf_a_LIBADD = $(addprefix ../lib/,$(libeu_objects)) -+ - install: install-am libelf.so - $(mkinstalldirs) $(DESTDIR)$(libdir) - $(INSTALL_PROGRAM) libelf.so $(DESTDIR)$(libdir)/libelf-$(PACKAGE_VERSION).so --- -2.47.0 - diff --git a/elfutils-0.192-more-dwarf5-lang.patch b/elfutils-0.192-more-dwarf5-lang.patch deleted file mode 100644 index 2aa0d3b..0000000 --- a/elfutils-0.192-more-dwarf5-lang.patch +++ /dev/null @@ -1,204 +0,0 @@ -commit 04ba163e813f6b88da850c658a03ac7b5f19f7ad -Author: Mark Wielaard -Date: Fri Nov 22 18:17:29 2024 +0100 - - libdw: Update DW_LANG codes - - Pick up the language codes published after DWARF5 was published. - The are listed at https://dwarfstd.org/languages.html - - Also adjust C language dectection in dwarf_getfuncs and update the - dwarf_default_lower_bound function to return the default lower bounds - for the new langauge codes. - - There is one small change in dwarf_default_lower_bound. We now return - zero instead of an error when called for DW_LANG_Mips_Assembler. Since - there is now an "official" DW_LANG_Assembly which is explicitly - defined as having a default lower bound of zero. It seems better to do - the same for the vendor code too. - - * libdw/dwarf.h: Add new DW_LANG codes. - * libdw/dwarf_default_lower_bound.c (dwarf_default_lower_bound): - Handle new language codes and remove a special case for - DW_LANG_Mips_Assembler. - * libdw/dwarf_getfuncs.c (dwarf_getfuncs): Check against - DW_LANG_C17 and DW_LANG_C23. - * tests/dwarf_default_lower_bound.c: Also check for - DW_LANG_Mips_Assembler. - - Signed-off-by: Mark Wielaard - -diff --git a/libdw/dwarf.h b/libdw/dwarf.h -index 4be32de5a67d..573ffd6925b2 100644 ---- a/libdw/dwarf.h -+++ b/libdw/dwarf.h -@@ -1,5 +1,6 @@ - /* This file defines standard DWARF types, structures, and macros. - Copyright (C) 2000-2011, 2014, 2016, 2017, 2018 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 -@@ -697,7 +698,11 @@ enum - }; - - --/* DWARF language encodings. */ -+/* DWARF language encodings. -+ -+ See https://dwarfstd.org/languages.html for language code published -+ after DWARF5 was published (but before DWARF6 has been released, -+ which will introduce a new DW_AT_language_name/version scheme). */ - enum - { - DW_LANG_C89 = 0x0001, /* ISO C:1989 */ -@@ -738,6 +743,35 @@ enum - DW_LANG_RenderScript = 0x0024, /* RenderScript Kernal Language */ - DW_LANG_BLISS = 0x0025, /* BLISS */ - -+ DW_LANG_Kotlin = 0x0026, /* Kotlin */ -+ DW_LANG_Zig = 0x0027, /* Zig */ -+ DW_LANG_Crystal = 0x0028, /* Crystal */ -+ DW_LANG_C_plus_plus_17 = 0x002a, /* ISO C++:2017 */ -+ DW_LANG_C_plus_plus_20 = 0x002b, /* ISO C++:2018 */ -+ DW_LANG_C17 = 0x002c, /* ISO C:2017 */ -+ DW_LANG_Fortran18 = 0x002d, /* ISO/IEC 1539-1:2018 */ -+ DW_LANG_Ada2005 = 0x002e, /* ISO Ada:2005 */ -+ DW_LANG_Ada2012 = 0x002f, /* ISO Ada:2005 */ -+ DW_LANG_HIP = 0x0030, /* HIP */ -+ DW_LANG_Assembly = 0x0031, /* Assembly */ -+ DW_LANG_C_sharp = 0x0032, /* C# */ -+ DW_LANG_Mojo = 0x0033, /* Mojo */ -+ DW_LANG_GLSL = 0x0034, /* OpenGL Shading Language */ -+ DW_LANG_GLSL_ES = 0x0035, /* OpenGL ES Shading Language */ -+ DW_LANG_HLSL = 0x0036, /* High-Level Shading Language */ -+ DW_LANG_OpenCL_CPP = 0x0037, /* OpenCL C++ */ -+ DW_LANG_CPP_for_OpenCL = 0x0038, /* C++ for OpenCL */ -+ DW_LANG_SYCL = 0x0039, /* SYCL */ -+ DW_LANG_C_plus_plus_23 = 0x003a, /* ISO C++:2023 */ -+ DW_LANG_Odin = 0x003b, /* Odin */ -+ DW_LANG_P4 = 0x003c, /* P4 */ -+ DW_LANG_Metal = 0x003d, /* Metal */ -+ DW_LANG_C23 = 0x003e, /* ISO C:2023 */ -+ DW_LANG_Fortran23 = 0x003f, /* ISO/IEC 1539-1:2023 */ -+ DW_LANG_Ruby = 0x0040, /* Ruby */ -+ DW_LANG_Move = 0x0041, /* Move */ -+ DW_LANG_Hylo = 0x0042, /* Hylo */ -+ - DW_LANG_lo_user = 0x8000, - DW_LANG_Mips_Assembler = 0x8001, /* Assembler */ - DW_LANG_hi_user = 0xffff -diff --git a/libdw/dwarf_default_lower_bound.c b/libdw/dwarf_default_lower_bound.c -index a33a34335b1b..50639e32428e 100644 ---- a/libdw/dwarf_default_lower_bound.c -+++ b/libdw/dwarf_default_lower_bound.c -@@ -1,5 +1,6 @@ - /* Get the default subrange lower bound for a given language. - Copyright (C) 2016 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 -@@ -63,6 +64,30 @@ dwarf_default_lower_bound (int lang, Dwarf_Sword *result) - case DW_LANG_Dylan: - case DW_LANG_RenderScript: - case DW_LANG_BLISS: -+ case DW_LANG_Kotlin: -+ case DW_LANG_Zig: -+ case DW_LANG_Crystal: -+ case DW_LANG_C_plus_plus_17: -+ case DW_LANG_C_plus_plus_20: -+ case DW_LANG_C17: -+ case DW_LANG_HIP: -+ case DW_LANG_Assembly: -+ case DW_LANG_C_sharp: -+ case DW_LANG_Mojo: -+ case DW_LANG_GLSL: -+ case DW_LANG_GLSL_ES: -+ case DW_LANG_HLSL: -+ case DW_LANG_OpenCL_CPP: -+ case DW_LANG_CPP_for_OpenCL: -+ case DW_LANG_SYCL: -+ case DW_LANG_C_plus_plus_23: -+ case DW_LANG_Odin: -+ case DW_LANG_P4: -+ case DW_LANG_Metal: -+ case DW_LANG_C23: -+ case DW_LANG_Ruby: -+ case DW_LANG_Move: -+ case DW_LANG_Hylo: - *result = 0; - return 0; - -@@ -80,9 +105,18 @@ dwarf_default_lower_bound (int lang, Dwarf_Sword *result) - case DW_LANG_Modula3: - case DW_LANG_PLI: - case DW_LANG_Julia: -+ case DW_LANG_Fortran18: -+ case DW_LANG_Ada2005: -+ case DW_LANG_Ada2012: -+ case DW_LANG_Fortran23: - *result = 1; - return 0; - -+ /* Special case vendor Assembly variant. */ -+ case DW_LANG_Mips_Assembler: -+ *result = 0; -+ return 0; -+ - default: - __libdw_seterrno (DWARF_E_UNKNOWN_LANGUAGE); - return -1; -diff --git a/libdw/dwarf_getfuncs.c b/libdw/dwarf_getfuncs.c -index b95f06f403d1..f6968f0081d4 100644 ---- a/libdw/dwarf_getfuncs.c -+++ b/libdw/dwarf_getfuncs.c -@@ -1,5 +1,6 @@ - /* Get function information. - Copyright (C) 2005, 2013, 2015 Red Hat, Inc. -+ Copyright (C) 2024 Mark J. Wielaard - This file is part of elfutils. - Written by Ulrich Drepper , 2005. - -@@ -104,7 +105,9 @@ dwarf_getfuncs (Dwarf_Die *cudie, int (*callback) (Dwarf_Die *, void *), - bool c_cu = (lang == DW_LANG_C89 - || lang == DW_LANG_C - || lang == DW_LANG_C99 -- || lang == DW_LANG_C11); -+ || lang == DW_LANG_C11 -+ || lang == DW_LANG_C17 -+ || lang == DW_LANG_C23); - - struct visitor_info v = { callback, arg, (void *) offset, NULL, c_cu }; - struct Dwarf_Die_Chain chain = { .die = CUDIE (cudie->cu), -diff --git a/tests/dwarf_default_lower_bound.c b/tests/dwarf_default_lower_bound.c -index d57424fc77fe..46e26f885a6b 100644 ---- a/tests/dwarf_default_lower_bound.c -+++ b/tests/dwarf_default_lower_bound.c -@@ -1,6 +1,7 @@ - /* Test all DW_LANG constants are handled by dwarf_default_lower_bound. - - Copyright (C) 2016 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 -@@ -34,18 +35,6 @@ test_lang (const char *name, int lang) - Dwarf_Sword low; - int res = dwarf_default_lower_bound (lang, &low); - -- /* Assembler is special, it doesn't really have arrays. */ -- if (lang == DW_LANG_Mips_Assembler) -- { -- if (res == 0) -- { -- printf ("%s shouldn't have a known lower bound\n", name); -- exit (-1); -- } -- printf ("%s: \n", name); -- return; -- } -- - if (res != 0) - { - printf ("dwarf_default_lower_bound failed (%d) for %s\n", res, name); diff --git a/elfutils-0.192-stacktrace-lto.patch b/elfutils-0.192-stacktrace-lto.patch deleted file mode 100644 index 9f110f8..0000000 --- a/elfutils-0.192-stacktrace-lto.patch +++ /dev/null @@ -1,35 +0,0 @@ -commit 43829fb8780ecbe9d17aaed22d3dfcb806cb5f45 -Author: Mark Wielaard -Date: Thu Oct 24 10:44:25 2024 +0200 - - stacktrace: Init elf_fd in sysprof_init_dwfl - - When building with LTO gcc believes elf_fd can be used uninitialized: - - In function ‘sysprof_init_dwfl’, - inlined from ‘sysprof_unwind_cb’ at stacktrace.c:1235:16: - stacktrace.c:1087:7: error: ‘elf_fd’ may be used uninitialized [-Werror=maybe-uninitialized] - 1087 | close (elf_fd); - | ^ - - This code won't be reached because if find_procfile doesn't initialize - elf_fd, it will return an error. But help the compiler by initializing - elf_fd to -1. - - * src/stacktrace.c (sysprof_init_dwfl): Init elf_fd to -1. - - Signed-off-by: Mark Wielaard - -diff --git a/src/stacktrace.c b/src/stacktrace.c -index 438cb1dd0d38..b912ca5de502 100644 ---- a/src/stacktrace.c -+++ b/src/stacktrace.c -@@ -1033,7 +1033,7 @@ sysprof_init_dwfl (struct sysprof_unwind_info *sui, - } - - Elf *elf = NULL; -- int elf_fd; -+ int elf_fd = -1; - err = find_procfile (dwfl, &pid, &elf, &elf_fd); - if (err < 0) - { diff --git a/elfutils-0.192-strip-ignore-non-ET_REL.patch b/elfutils-0.192-strip-ignore-non-ET_REL.patch deleted file mode 100644 index bef6ca6..0000000 --- a/elfutils-0.192-strip-ignore-non-ET_REL.patch +++ /dev/null @@ -1,48 +0,0 @@ -From e425a70469436c704e6c24dd4bc2abb8fb24b61d Mon Sep 17 00:00:00 2001 -From: Aaron Merey -Date: Tue, 5 Nov 2024 17:41:26 -0500 -Subject: [PATCH] strip: Ignore --reloc-debug-sections-only for non-ET_REL - files. - -strip --reloc-debug-sections-only is expected to be a no-op for -non-ET_REL files. This was not enforced in the code. Sections -were copied over to a new output file and normally its contents -would be identical to the input file. - -However the output file is not identical to a non-ET_REL input -file if the linker organized sections such that the indices of -SHF_ALLOC sections are not in a contigous group. - -In this case strip will modify sections in order to keep all SHF_ALLOC -sections in a contiguous group. - -Fix this by ignoring --reloc-debug-sections-only for non-ET_REL files. - -https://sourceware.org/bugzilla/show_bug.cgi?id=32253 - -Signed-off-by: Aaron Merey ---- - src/strip.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/src/strip.c b/src/strip.c -index 403e0f6f..3812fb17 100644 ---- a/src/strip.c -+++ b/src/strip.c -@@ -1139,6 +1139,13 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - - if (reloc_debug_only) - { -+ if (ehdr->e_type != ET_REL) -+ { -+ /* Only ET_REL files can have debug relocations to remove. */ -+ error (0, 0, _("Ignoring --reloc-debug-sections-only for " \ -+ "non-ET_REL file '%s'"), fname); -+ goto fail_close; -+ } - if (handle_debug_relocs (elf, ebl, newelf, ehdr, fname, shstrndx, - &lastsec_offset, &lastsec_size) != 0) - { --- -2.47.0 - diff --git a/elfutils.spec b/elfutils.spec index 281eb0f..a220b32 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -3,8 +3,8 @@ %bcond_with static Name: elfutils -Version: 0.192 -%global baserelease 9 +Version: 0.193 +%global baserelease 1 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -97,30 +97,6 @@ BuildRequires: gettext-devel # For s390x... FDO package notes are bogus. Patch1: elfutils-0.186-fdo-swap.patch -# Include libeu.a objects in libelf.a for static linking. -Patch2: elfutils-0.192-libelf-static.patch - -# Fix eu-stacktrace build with lto enabled. -Patch3: elfutils-0.192-stacktrace-lto.patch - -# Fix ENABLE_IMA_VERIFICATION always evaluating to false. -Patch4: elfutils-0.192-fix-configure-conditional.patch - -# Fix empty glob error on zsh. -Patch5: elfutils-0.192-fix-zsh-profile.patch - -# Fix testsuite failure caused by ld changes. -Patch6: elfutils-0.192-strip-ignore-non-ET_REL.patch - -# In c23 ATOMIC_VAR_INIT has been removed -Patch7: elfutils-0.192-ATOMIC_VAR_INIT.patch - -# New DWARF5 language constants -Patch8: elfutils-0.192-more-dwarf5-lang.patch - -# debuginfod-client.c: Avoid freeing uninitialized value -patch9: elfutils-0.192-imasig-fail-free.patch - %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -541,6 +517,18 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Apr 28 2025 Aaron Merey - 0.193-1 +- Upgrade to upstream elfutils 0.193 +- Drop upstreamed patches + elfutils-0.192-ATOMIC_VAR_INIT.patch + elfutils-0.192-libelf-static.patch + elfutils-0.192-fix-configure-conditional.patch + elfutils-0.192-more-dwarf5-lang.patch + elfutils-0.192-fix-zsh-profile.patch + elfutils-0.192-stacktrace-lto.patch + elfutils-0.192-imasig-fail-free.patch + elfutils-0.192-strip-ignore-non-ET_REL.patch + * Sun Feb 23 2025 Mark Wielaard - 0.192-9 - Add elfutils-0.192-imasig-fail-free.patch diff --git a/sources b/sources index 52f4826..7c1ca7e 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.192.tar.bz2) = 543188f5f2cfe5bc7955a878416c5f252edff9926754e5de0c6c57b132f21d9285c9b29e41281e93baad11d4ae7efbbf93580c114579c182103565fe99bd3909 +SHA512 (elfutils-0.193.tar.bz2) = 557e328e3de0d2a69d09c15a9333f705f3233584e2c6a7d3ce855d06a12dc129e69168d6be64082803630397bd64e1660a8b5324d4f162d17922e10ddb367d76 From 6d89dc3f7ea5dc28c5b1d50b5596662d6555f75a Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Wed, 30 Apr 2025 08:38:12 -0400 Subject: [PATCH 51/56] Include libdwfl_stacktrace.h when building eu-stacktrace --- elfutils.spec | 3 +++ 1 file changed, 3 insertions(+) diff --git a/elfutils.spec b/elfutils.spec index a220b32..fb4094a 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -432,6 +432,9 @@ fi %{_includedir}/elfutils/libdwfl.h %{_includedir}/elfutils/libdwelf.h %{_includedir}/elfutils/version.h +%if %{enable_stacktrace} +%{_includedir}/elfutils/libdwfl_stacktrace.h +%endif %{_libdir}/libasm.so %{_libdir}/libdw.so %{_libdir}/pkgconfig/libdw.pc From 1e730db939dd7ab34e5f5142ceff6cb6f5ea2433 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Wed, 30 Apr 2025 08:54:03 -0400 Subject: [PATCH 52/56] 0.193-2 Include libdwfl_stacktrace.h unconditionally --- elfutils.spec | 2 -- 1 file changed, 2 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index fb4094a..f677ca3 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -432,9 +432,7 @@ fi %{_includedir}/elfutils/libdwfl.h %{_includedir}/elfutils/libdwelf.h %{_includedir}/elfutils/version.h -%if %{enable_stacktrace} %{_includedir}/elfutils/libdwfl_stacktrace.h -%endif %{_libdir}/libasm.so %{_libdir}/libdw.so %{_libdir}/pkgconfig/libdw.pc From accba9105dc16f095930fe2a75aef0f559ccca65 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Wed, 30 Apr 2025 08:56:27 -0400 Subject: [PATCH 53/56] Bump release version --- elfutils.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index f677ca3..0a545aa 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.193 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ From d93e194c37525d17f6c497b6712a56bf0f971598 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 23 Jul 2025 19:47:24 +0000 Subject: [PATCH 54/56] Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 0a545aa..6c79016 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.193 -%global baserelease 2 +%global baserelease 3 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -518,6 +518,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Jul 23 2025 Fedora Release Engineering - 0.193-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + * Mon Apr 28 2025 Aaron Merey - 0.193-1 - Upgrade to upstream elfutils 0.193 - Drop upstreamed patches From 77509c6ab099e628f22724f74c09bdf78e92cad5 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Tue, 28 Oct 2025 16:10:55 -0400 Subject: [PATCH 55/56] 0.194-1 - Upgrade to upstream elfutils 0.194 - Add elfutils-0.194-alloc-jobs.patch --- .gitignore | 1 + elfutils-0.194-alloc-jobs.patch | 135 ++++++++++++++++++++++++++++++++ elfutils.spec | 12 ++- sources | 2 +- 4 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 elfutils-0.194-alloc-jobs.patch diff --git a/.gitignore b/.gitignore index a406bd1..6aac4df 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ /elfutils-0.191.tar.bz2 /elfutils-0.192.tar.bz2 /elfutils-0.193.tar.bz2 +/elfutils-0.194.tar.bz2 diff --git a/elfutils-0.194-alloc-jobs.patch b/elfutils-0.194-alloc-jobs.patch new file mode 100644 index 0000000..cabf590 --- /dev/null +++ b/elfutils-0.194-alloc-jobs.patch @@ -0,0 +1,135 @@ +From f66135f16fe44182a3fc5b651d7e5071c936217d Mon Sep 17 00:00:00 2001 +From: Aaron Merey +Date: Mon, 27 Oct 2025 22:00:12 -0400 +Subject: [PATCH] readelf: Allocate job_data one-by-one as needed + +Currently, job_data is stored in an array whose size is equal to the +number of debug sections (.debug_*, .eh_frame, .gdb_index, etc.). + +This size may be too small if a binary contains multiple debug sections +with the same name. For example an ET_REL binary compiled with -ggdb3 +can contain multiple .debug_macro sections. + +Fix this by allocating job_data on the fly when preparing to read a +debug section. This supports an arbitrary number of debug sections +while also avoiding unnecessary memory allocation. + +https://sourceware.org/bugzilla/show_bug.cgi?id=33580 + +Signed-off-by: Aaron Merey +--- + src/readelf.c | 49 +++++++++++++++++++++++++------------------------ + 1 file changed, 25 insertions(+), 24 deletions(-) + +diff --git a/src/readelf.c b/src/readelf.c +index ee6c203d..a2d17358 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -12200,7 +12200,8 @@ getone_dwflmod (Dwfl_Module *dwflmod, + return DWARF_CB_OK; + } + +-typedef struct { ++typedef struct Job_Data { ++ struct Job_Data *next; + Dwfl_Module *dwflmod; + Ebl *ebl; + GElf_Ehdr *ehdr; +@@ -12230,7 +12231,7 @@ do_job (void *data, FILE *out) + If thread safety is not supported or the maximum number of threads is set + to 1, then immediately call START_ROUTINE with the given arguments. */ + static void +-schedule_job (job_data jdata[], size_t idx, ++schedule_job (job_data **jdatalist, + void (*start_routine) (Dwfl_Module *, Ebl *, GElf_Ehdr *, + Elf_Scn *, GElf_Shdr *, Dwarf *, FILE *), + Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, +@@ -12239,21 +12240,24 @@ schedule_job (job_data jdata[], size_t idx, + #ifdef USE_LOCKS + if (max_threads > 1) + { +- /* Add to the job queue. */ +- jdata[idx].dwflmod = dwflmod; +- jdata[idx].ebl = ebl; +- jdata[idx].ehdr = ehdr; +- jdata[idx].scn = *scn; +- jdata[idx].shdr = *shdr; +- jdata[idx].dbg = dbg; +- jdata[idx].fp = start_routine; ++ job_data *jdata = xmalloc (sizeof (job_data)); ++ ++ jdata->dwflmod = dwflmod; ++ jdata->ebl = ebl; ++ jdata->ehdr = ehdr; ++ jdata->scn = *scn; ++ jdata->shdr = *shdr; ++ jdata->dbg = dbg; ++ jdata->fp = start_routine; ++ jdata->next = *jdatalist; ++ *jdatalist = jdata; + +- add_job (do_job, (void *) &jdata[idx]); ++ add_job (do_job, (void *) jdata); + } + else + start_routine (dwflmod, ebl, ehdr, scn, shdr, dbg, stdout); + #else +- (void) jdata; (void) idx; ++ (void) jdatalist; + + start_routine (dwflmod, ebl, ehdr, scn, shdr, dbg, stdout); + #endif +@@ -12431,8 +12435,7 @@ print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr) + if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)) + error_exit (0, _("cannot get section header string table index")); + +- ssize_t num_jobs = 0; +- job_data *jdata = NULL; ++ job_data *jdatalist = NULL; + + /* If the .debug_info section is listed as implicitly required then + we must make sure to handle it before handling any other debug +@@ -12531,13 +12534,6 @@ print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr) + if (name == NULL) + continue; + +- if (jdata == NULL) +- { +- jdata = calloc (ndebug_sections, sizeof (*jdata)); +- if (jdata == NULL) +- error_exit (0, _("failed to allocate job data")); +- } +- + int n; + for (n = 0; n < ndebug_sections; ++n) + { +@@ -12561,10 +12557,9 @@ print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr) + { + if (((print_debug_sections | implicit_debug_sections) + & debug_sections[n].bitmask)) +- schedule_job (jdata, num_jobs++, debug_sections[n].fp, ++ schedule_job (&jdatalist, debug_sections[n].fp, + dwflmod, ebl, ehdr, scn, shdr, dbg); + +- assert (num_jobs <= ndebug_sections); + break; + } + } +@@ -12579,7 +12574,13 @@ print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr) + + dwfl_end (skel_dwfl); + free (skel_name); +- free (jdata); ++ ++ while (jdatalist != NULL) ++ { ++ job_data *jdata = jdatalist; ++ jdatalist = jdatalist->next; ++ free (jdata); ++ } + + /* Turn implicit and/or explicit back on in case we go over another file. */ + if (implicit_info) +-- +2.51.0 + diff --git a/elfutils.spec b/elfutils.spec index 6c79016..cbd3bf3 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -3,8 +3,8 @@ %bcond_with static Name: elfutils -Version: 0.193 -%global baserelease 3 +Version: 0.194 +%global baserelease 1 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -97,6 +97,9 @@ BuildRequires: gettext-devel # For s390x... FDO package notes are bogus. Patch1: elfutils-0.186-fdo-swap.patch +# Prevent assert failure in readelf for some -ggdb3 binaries. +Patch2: elfutils-0.194-alloc-jobs.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -457,6 +460,7 @@ fi %{_mandir}/man3/elf_*.3* %{_mandir}/man3/elf32_*.3* %{_mandir}/man3/elf64_*.3* +%{_mandir}/man3/gelf_*.3* %{_mandir}/man3/libelf.3* %if %{with static} @@ -518,6 +522,10 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Tue Oct 28 2025 Aaron Merey - 0.194-1 +- Upgrade to upstream elfutils 0.194 +- Add elfutils-0.194-alloc-jobs.patch + * Wed Jul 23 2025 Fedora Release Engineering - 0.193-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild diff --git a/sources b/sources index 7c1ca7e..bd25645 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.193.tar.bz2) = 557e328e3de0d2a69d09c15a9333f705f3233584e2c6a7d3ce855d06a12dc129e69168d6be64082803630397bd64e1660a8b5324d4f162d17922e10ddb367d76 +SHA512 (elfutils-0.194.tar.bz2) = 5d00502f61b92643bf61dc61da4ddded36c423466388d992bcd388c5208761b8ed9db1a01492c085cd0984eef30c08f895a8e307e78e0df8df40b56ae35b78a5 From fe811227810613065ff5d02ef25edcc82ddae288 Mon Sep 17 00:00:00 2001 From: Aaron Merey Date: Tue, 9 Dec 2025 10:23:48 -0500 Subject: [PATCH 56/56] 0.194-2 Add elfutils-0.194-fix-const.patch --- elfutils-0.194-fix-const.patch | 301 +++++++++++++++++++++++++++++++++ elfutils.spec | 8 +- 2 files changed, 308 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.194-fix-const.patch diff --git a/elfutils-0.194-fix-const.patch b/elfutils-0.194-fix-const.patch new file mode 100644 index 0000000..085f899 --- /dev/null +++ b/elfutils-0.194-fix-const.patch @@ -0,0 +1,301 @@ +From 4a5cf8be906d5991e7527e69e3f2ceaa74811301 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Mon, 24 Nov 2025 13:46:16 +0100 +Subject: [PATCH] Fix const-correctness issues + +These were uncovered by the C23 const-preserving library macros. +--- + debuginfod/debuginfod-client.c | 2 +- + libcpu/riscv_disasm.c | 52 +++++++++++++++++----------------- + libdw/dwarf_getsrclines.c | 6 ++-- + src/readelf.c | 8 +++--- + 4 files changed, 34 insertions(+), 34 deletions(-) + +diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c +index c0ff5967..c5bc8a4f 100644 +--- a/debuginfod/debuginfod-client.c ++++ b/debuginfod/debuginfod-client.c +@@ -3104,7 +3104,7 @@ int debuginfod_add_http_header (debuginfod_client *client, const char* header) + /* Sanity check header value is of the form Header: Value. + It should contain at least one colon that isn't the first or + last character. */ +- char *colon = strchr (header, ':'); /* first colon */ ++ const char *colon = strchr (header, ':'); /* first colon */ + if (colon == NULL /* present */ + || colon == header /* not at beginning - i.e., have a header name */ + || *(colon + 1) == '\0') /* not at end - i.e., have a value */ +diff --git a/libcpu/riscv_disasm.c b/libcpu/riscv_disasm.c +index 0dee842a..749d4567 100644 +--- a/libcpu/riscv_disasm.c ++++ b/libcpu/riscv_disasm.c +@@ -77,7 +77,7 @@ static const char *regnames[32] = + "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", + "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6" + }; +-#define REG(nr) ((char *) regnames[nr]) ++#define REG(nr) regnames[nr] + #define REGP(nr) REG (8 + (nr)) + + +@@ -88,7 +88,7 @@ static const char *fregnames[32] = + "fa6", "fa7", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", + "fs8", "fs9", "fs10", "fs11", "ft8", "ft9", "ft10", "ft11" + }; +-#define FREG(nr) ((char *) fregnames[nr]) ++#define FREG(nr) fregnames[nr] + #define FREGP(nr) FREG (8 + (nr)) + + +@@ -163,12 +163,12 @@ riscv_disasm (Ebl *ebl, + break; + } + +- char *mne = NULL; ++ const char *mne = NULL; + /* Max length is 24, which is "illegal", so we print it as + "0x<48 hex chars>" + See: No instruction encodings defined for these sizes yet, below */ + char mnebuf[50]; +- char *op[5] = { NULL, NULL, NULL, NULL, NULL }; ++ const char *op[5] = { NULL, NULL, NULL, NULL, NULL }; + char immbuf[32]; + size_t len; + char *strp = NULL; +@@ -400,7 +400,7 @@ riscv_disasm (Ebl *ebl, + { + "sub", "xor", "or", "and", "subw", "addw", NULL, NULL + }; +- mne = (char *) arithmne[((first >> 10) & 0x4) | ((first >> 5) & 0x3)]; ++ mne = arithmne[((first >> 10) & 0x4) | ((first >> 5) & 0x3)]; + } + op[0] = op[1] = REGP ((first >> 7) & 0x7); + break; +@@ -572,7 +572,7 @@ riscv_disasm (Ebl *ebl, + { + NULL, NULL, "flw", "fld", "flq", NULL, NULL, NULL + }; +- mne = (char *) (idx == 0x00 ? loadmne[func] : floadmne[func]); ++ mne = idx == 0x00 ? loadmne[func] : floadmne[func]; + break; + case 0x03: + // MISC-MEM +@@ -595,8 +595,8 @@ riscv_disasm (Ebl *ebl, + uint32_t succ = (word >> 24) & 0xf; + if (pred != 0xf || succ != 0xf) + { +- op[0] = (char *) order[succ]; +- op[1] = (char *) order[pred]; ++ op[0] = order[succ]; ++ op[1] = order[pred]; + } + mne = "fence"; + } +@@ -614,7 +614,7 @@ riscv_disasm (Ebl *ebl, + "addi", NULL, "slti", "sltiu", "xori", NULL, "ori", "andi" + }; + func = (word >> 12) & 0x7; +- mne = (char *) opimmmne[func]; ++ mne = opimmmne[func]; + if (mne == NULL) + { + const uint64_t shiftmask = ebl->class == ELFCLASS32 ? 0x1f : 0x3f; +@@ -697,7 +697,7 @@ riscv_disasm (Ebl *ebl, + { + NULL, NULL, "fsw", "fsd", "fsq", NULL, NULL, NULL + }; +- mne = (char *) (idx == 0x08 ? storemne[func] : fstoremne[func]); ++ mne = idx == 0x08 ? storemne[func] : fstoremne[func]; + break; + case 0x0b: + // AMO +@@ -778,7 +778,7 @@ riscv_disasm (Ebl *ebl, + } + else + { +- mne = (char *) (idx == 0x0c ? arithmne2[func] : arithmne3[func]); ++ mne = idx == 0x0c ? arithmne2[func] : arithmne3[func]; + op[1] = REG (rs1); + op[2] = REG (rs2); + } +@@ -811,7 +811,7 @@ riscv_disasm (Ebl *ebl, + op[2] = FREG (rs2); + op[3] = FREG (rs3); + if (rm != 0x7) +- op[4] = (char *) rndmode[rm]; ++ op[4] = rndmode[rm]; + } + break; + case 0x14: +@@ -839,7 +839,7 @@ riscv_disasm (Ebl *ebl, + op[1] = FREG (rs1); + op[2] = FREG (rs2); + if (rm != 0x7) +- op[3] = (char *) rndmode[rm]; ++ op[3] = rndmode[rm]; + } + else if (func == 0x1c && width != 2 && rs2 == 0 && rm <= 1) + { +@@ -950,7 +950,7 @@ riscv_disasm (Ebl *ebl, + } + mne = mnebuf; + if (rm != 0x7 && (func == 0x18 || width == 0 || rs2 >= 2)) +- op[2] = (char *) rndmode[rm]; ++ op[2] = rndmode[rm]; + } + else if (func == 0x0b && rs2 == 0) + { +@@ -961,7 +961,7 @@ riscv_disasm (Ebl *ebl, + *cp = '\0'; + mne = mnebuf; + if (rm != 0x7) +- op[2] = (char *) rndmode[rm]; ++ op[2] = rndmode[rm]; + } + else if (func == 0x05 && rm < 2) + { +@@ -1007,7 +1007,7 @@ riscv_disasm (Ebl *ebl, + "beq", "bne", NULL, NULL, "blt", "bge", "bltu", "bgeu" + }; + func = (word >> 12) & 0x7; +- mne = (char *) branchmne[func]; ++ mne = branchmne[func]; + if (rs1 == 0 && func == 5) + { + op[0] = op[1]; +@@ -1035,7 +1035,7 @@ riscv_disasm (Ebl *ebl, + else if (func == 5 || func == 7) + { + // binutils use these opcodes and the reverse parameter order +- char *tmp = op[0]; ++ const char *tmp = op[0]; + op[0] = op[1]; + op[1] = tmp; + mne = func == 5 ? "ble" : "bleu"; +@@ -1103,7 +1103,7 @@ riscv_disasm (Ebl *ebl, + { + NULL, "frflags", "frrm", "frsr", + }; +- mne = (char *) unprivrw[csr - 0x000]; ++ mne = unprivrw[csr - 0x000]; + } + else if (csr >= 0xc00 && csr <= 0xc03) + { +@@ -1111,7 +1111,7 @@ riscv_disasm (Ebl *ebl, + { + "rdcycle", "rdtime", "rdinstret" + }; +- mne = (char *) unprivrolow[csr - 0xc00]; ++ mne = unprivrolow[csr - 0xc00]; + } + op[0] = REG ((word >> 7) & 0x1f); + } +@@ -1128,7 +1128,7 @@ riscv_disasm (Ebl *ebl, + { + NULL, "fsflagsi", "fsrmi", NULL + }; +- mne = (char *) ((word & 0x4000) == 0 ? unprivrs : unprivrsi)[csr - 0x000]; ++ mne = ((word & 0x4000) == 0 ? unprivrs : unprivrsi)[csr - 0x000]; + + if ((word & 0x4000) == 0) + op[0] = REG ((word >> 15) & 0x1f); +@@ -1259,12 +1259,12 @@ riscv_disasm (Ebl *ebl, + if (rd != 0) + op[last++] = REG (rd); + struct known_csrs key = { csr, NULL }; +- struct known_csrs *found = bsearch (&key, known, +- sizeof (known) / sizeof (known[0]), +- sizeof (known[0]), +- compare_csr); ++ const struct known_csrs *found = bsearch (&key, known, ++ sizeof (known) / sizeof (known[0]), ++ sizeof (known[0]), ++ compare_csr); + if (found) +- op[last] = (char *) found->name; ++ op[last] = found->name; + else + { + snprintf (addrbuf, sizeof (addrbuf), "0x%" PRIx32, csr); +@@ -1289,7 +1289,7 @@ riscv_disasm (Ebl *ebl, + else if (instr == 3 && rd == 0) + mne = "csrc"; + else +- mne = (char *) mnecsr[instr]; ++ mne = mnecsr[instr]; + } + break; + default: +diff --git a/libdw/dwarf_getsrclines.c b/libdw/dwarf_getsrclines.c +index be10cdee..76db2929 100644 +--- a/libdw/dwarf_getsrclines.c ++++ b/libdw/dwarf_getsrclines.c +@@ -364,7 +364,7 @@ read_srcfiles (Dwarf *dbg, + const unsigned char *dirp = linep; + while (dirp < lineendp && *dirp != 0) + { +- uint8_t *endp = memchr (dirp, '\0', lineendp - dirp); ++ const uint8_t *endp = memchr (dirp, '\0', lineendp - dirp); + if (endp == NULL) + goto invalid_data; + ++ndirs; +@@ -440,7 +440,7 @@ read_srcfiles (Dwarf *dbg, + for (unsigned int n = 1; n < ndirlist; n++) + { + dirarray[n].dir = (char *) linep; +- uint8_t *endp = memchr (linep, '\0', lineendp - linep); ++ const uint8_t *endp = memchr (linep, '\0', lineendp - linep); + assert (endp != NULL); // Checked above when calculating ndirlist. + dirarray[n].len = endp - linep; + linep = endp + 1; +@@ -927,7 +927,7 @@ read_srclines (Dwarf *dbg, + case DW_LNE_define_file: + { + char *fname = (char *) linep; +- uint8_t *endp = memchr (linep, '\0', lineendp - linep); ++ const uint8_t *endp = memchr (linep, '\0', lineendp - linep); + if (endp == NULL) + goto invalid_data; + size_t fnamelen = endp - linep; +diff --git a/src/readelf.c b/src/readelf.c +index a2d17358..fbdf8c71 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -8269,7 +8269,7 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) + valuestr = dwarf_filesrc (files, num, NULL, NULL); + if (valuestr != NULL) + { +- char *filename = strrchr (valuestr, '/'); ++ const char *filename = strrchr (valuestr, '/'); + if (filename != NULL) + valuestr = filename + 1; + } +@@ -9033,7 +9033,7 @@ print_form_data (Dwarf *dbg, int form, const unsigned char *readp, + Dwarf_Off str_offsets_base, FILE *out) + { + Dwarf_Word val; +- unsigned char *endp; ++ const unsigned char *endp; + Elf_Data *data; + char *str; + switch (form) +@@ -9530,7 +9530,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr, + { + while (linep < lineendp && *linep != 0) + { +- unsigned char *endp = memchr (linep, '\0', lineendp - linep); ++ const unsigned char *endp = memchr (linep, '\0', lineendp - linep); + if (unlikely (endp == NULL)) + goto invalid_unit; + +@@ -9764,7 +9764,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr, + case DW_LNE_define_file: + { + char *fname = (char *) linep; +- unsigned char *endp = memchr (linep, '\0', ++ const unsigned char *endp = memchr (linep, '\0', + lineendp - linep); + if (unlikely (endp == NULL)) + goto invalid_unit; +-- +2.52.0 + diff --git a/elfutils.spec b/elfutils.spec index cbd3bf3..803a824 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -4,7 +4,7 @@ Name: elfutils Version: 0.194 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -100,6 +100,9 @@ Patch1: elfutils-0.186-fdo-swap.patch # Prevent assert failure in readelf for some -ggdb3 binaries. Patch2: elfutils-0.194-alloc-jobs.patch +# Fix const warning from newer GCC. +Patch3: elfutils-0.194-fix-const.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -522,6 +525,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Tue Dec 09 2025 Aaron Merey - 0.194-2 +- Add elfutils-0.194-fix-const.patch + * Tue Oct 28 2025 Aaron Merey - 0.194-1 - Upgrade to upstream elfutils 0.194 - Add elfutils-0.194-alloc-jobs.patch