From 57303b84db898f94dab3f910b880df1ee3f84e6c Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 3 Nov 2023 21:11:40 +0100 Subject: [PATCH] 0.190-1 Resolves: #RHEL-12489 Routine Rebase of elfutils - 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 - Only package debuginfod-client-config.7 manpage for debuginfod-client --- .gitignore | 1 + ...debuginfod_config_cache-double-close.patch | 73 ------ elfutils-0.189-elf_getdata_rawchunk.patch | 224 ------------------ elfutils-0.189-elfcompress.patch | 95 -------- elfutils.spec | 21 +- sources | 2 +- 6 files changed, 14 insertions(+), 402 deletions(-) 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 cb7bc43..141a176 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,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-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 39e7f14..1585d5f 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}/ @@ -73,12 +73,6 @@ BuildRequires: gettext-devel # Patches -# elfcompress: Don't compress if section already compressed unless forced -Patch1: elfutils-0.189-elfcompress.patch -# libelf: Replace list of elf_getdata_rawchunk results with a tree -Patch2: elfutils-0.189-elf_getdata_rawchunk.patch -# PR29696: Removed secondary fd close in cache config causing race condition -Patch3: elfutils-0.189-debuginfod_config_cache-double-close.patch %description Elfutils is a collection of utilities, including stack (to show @@ -361,6 +355,7 @@ fi %{_bindir}/eu-ranlib %{_bindir}/eu-readelf %{_bindir}/eu-size +%{_bindir}/eu-srcfiles %{_bindir}/eu-stack %{_bindir}/eu-strings %{_bindir}/eu-strip @@ -431,7 +426,6 @@ fi %{_sysusersdir}/elfutils-debuginfod.conf %endif %{_mandir}/man8/debuginfod*.8* -%{_mandir}/man7/debuginfod*.7* %dir %attr(0700,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod @@ -455,6 +449,15 @@ 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-debuginfod_config_cache-double-close.patch + elfutils-0.189-elf_getdata_rawchunk.patch + elfutils-0.189-elfcompress.patch +- Only package debuginfod-client-config.7 manpage for debuginfod-client + * Wed Jun 28 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