From d6169014dd19a04b254b15f7dbd4ee269b620c9c Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 3 Nov 2023 21:11:40 +0100 Subject: [PATCH] 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