From 84280fcced2fcea66f563212dde5ab6ea40b75de Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 10 Jun 2014 15:28:11 +0200 Subject: [PATCH 001/216] 0.158-4 Add elfutils-0.158-argp-attach.patch (#1107654) --- elfutils-0.158-argp-attach.patch | 359 +++++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 365 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.158-argp-attach.patch diff --git a/elfutils-0.158-argp-attach.patch b/elfutils-0.158-argp-attach.patch new file mode 100644 index 0000000..6d7354b --- /dev/null +++ b/elfutils-0.158-argp-attach.patch @@ -0,0 +1,359 @@ +commit 68b1afa36d2389c4f2fb526d0b134e5a3c68dedb +Author: Mark Wielaard +Date: Tue Jun 10 15:09:23 2014 +0200 + + libdwfl: dwfl_standard_argp should not fail when not able to attach Dwfl. + + As pointed out in https://bugzilla.redhat.com/show_bug.cgi?id=1107654 + commit 191080 introduced a thinko that caused dwfl_standard_argp + to fail if the Dwfl couldn't be attached. Instead of generating a warning + as the comment intended, the failure would be fatal. But even warning + about dwfl_core_file_attach () or dwfl_linux_proc_attach () failing + would be a mistake. The caller/user might not be interested in such + a non-fatal issue. So just ignore if the call failed for whatever reason. + If the caller is interested in warning up front about this issue, then + dwfl_pid () should be called to check the Dwfl is attached. Things should + work just fine for anything that doesn't call any of the dwfl_state related + functions. + + Signed-off-by: Mark Wielaard + +diff --git a/libdwfl/argp-std.c b/libdwfl/argp-std.c +index 8d2bc6a..42b7e78 100644 +--- a/libdwfl/argp-std.c ++++ b/libdwfl/argp-std.c +@@ -171,10 +171,9 @@ parse_opt (int key, char *arg, struct argp_state *state) + if (result != 0) + return fail (dwfl, result, arg); + +- result = INTUSE(dwfl_linux_proc_attach) (dwfl, atoi (arg), false); +- if (result != 0) +- /* Non-fatal to not be able to attach to process. */ +- failure (dwfl, result, _("cannot attach to process")); ++ /* Non-fatal to not be able to attach to process, ignore error. */ ++ INTUSE(dwfl_linux_proc_attach) (dwfl, atoi (arg), false); ++ + opt->dwfl = dwfl; + } + else +@@ -301,10 +300,8 @@ parse_opt (int key, char *arg, struct argp_state *state) + return fail (dwfl, result, opt->core); + } + +- result = INTUSE(dwfl_core_file_attach) (dwfl, core); +- if (result < 0) +- /* Non-fatal to not be able to attach to core. */ +- failure (dwfl, result, _("cannot attach to core")); ++ /* Non-fatal to not be able to attach to core, ignore error. */ ++ INTUSE(dwfl_core_file_attach) (dwfl, core); + + /* From now we leak FD and CORE. */ + +commit 14beac3b6f22b8d7a054980f74c4f8d33b969fc4 +Author: Mark Wielaard +Date: Wed Jun 11 15:14:23 2014 +0200 + + libdwfl: Record dwfl_attach_state error and return it on failure. + + When dwfl_attach_state fails functions that need the process state should + return the error that caused the attach to fail. Use this in the backtrace + test to signal any attach failure. This makes sure that architectures that + don't provide unwinder support get properly detected (and the tests SKIPs) + Also don't assert when trying to attach a non-core ELF file, but return an + error to indicate failure. + + Signed-off-by: Mark Wielaard + +diff --git a/libdwfl/dwfl_frame.c b/libdwfl/dwfl_frame.c +index fd0b9ae..f6f86c0 100644 +--- a/libdwfl/dwfl_frame.c ++++ b/libdwfl/dwfl_frame.c +@@ -117,6 +117,7 @@ __libdwfl_process_free (Dwfl_Process *process) + if (process->ebl_close) + ebl_closebackend (process->ebl); + free (process); ++ dwfl->attacherr = DWFL_E_NOERROR; + } + + /* Allocate new Dwfl_Process for DWFL. */ +@@ -134,17 +135,24 @@ bool + dwfl_attach_state (Dwfl *dwfl, Elf *elf, pid_t pid, + const Dwfl_Thread_Callbacks *thread_callbacks, void *arg) + { +- if (thread_callbacks == NULL || thread_callbacks->next_thread == NULL +- || thread_callbacks->set_initial_registers == NULL) ++ if (dwfl->process != NULL) + { +- __libdwfl_seterrno (DWFL_E_INVALID_ARGUMENT); ++ __libdwfl_seterrno (DWFL_E_ATTACH_STATE_CONFLICT); + return false; + } +- if (dwfl->process != NULL) ++ ++ /* Reset any previous error, we are just going to try again. */ ++ dwfl->attacherr = DWFL_E_NOERROR; ++ if (thread_callbacks == NULL || thread_callbacks->next_thread == NULL ++ || thread_callbacks->set_initial_registers == NULL) + { +- __libdwfl_seterrno (DWFL_E_ATTACH_STATE_CONFLICT); ++ dwfl->attacherr = DWFL_E_INVALID_ARGUMENT; ++ fail: ++ dwfl->attacherr = __libdwfl_canon_error (dwfl->attacherr); ++ __libdwfl_seterrno (dwfl->attacherr); + return false; + } ++ + Ebl *ebl; + bool ebl_close; + if (elf != NULL) +@@ -180,8 +188,8 @@ dwfl_attach_state (Dwfl *dwfl, Elf *elf, pid_t pid, + if (ebl == NULL) + { + /* Not identified EBL from any of the modules. */ +- __libdwfl_seterrno (DWFL_E_PROCESS_NO_ARCH); +- return false; ++ dwfl->attacherr = DWFL_E_PROCESS_NO_ARCH; ++ goto fail; + } + process_alloc (dwfl); + Dwfl_Process *process = dwfl->process; +@@ -189,8 +197,8 @@ dwfl_attach_state (Dwfl *dwfl, Elf *elf, pid_t pid, + { + if (ebl_close) + ebl_closebackend (ebl); +- __libdwfl_seterrno (DWFL_E_NOMEM); +- return false; ++ dwfl->attacherr = DWFL_E_NOMEM; ++ goto fail; + } + process->ebl = ebl; + process->ebl_close = ebl_close; +@@ -204,6 +212,12 @@ INTDEF(dwfl_attach_state) + pid_t + dwfl_pid (Dwfl *dwfl) + { ++ if (dwfl->attacherr != DWFL_E_NOERROR) ++ { ++ __libdwfl_seterrno (dwfl->attacherr); ++ return -1; ++ } ++ + if (dwfl->process == NULL) + { + __libdwfl_seterrno (DWFL_E_NO_ATTACH_STATE); +@@ -238,6 +252,12 @@ int + dwfl_getthreads (Dwfl *dwfl, int (*callback) (Dwfl_Thread *thread, void *arg), + void *arg) + { ++ if (dwfl->attacherr != DWFL_E_NOERROR) ++ { ++ __libdwfl_seterrno (dwfl->attacherr); ++ return -1; ++ } ++ + Dwfl_Process *process = dwfl->process; + if (process == NULL) + { +@@ -309,6 +329,12 @@ getthread (Dwfl *dwfl, pid_t tid, + int (*callback) (Dwfl_Thread *thread, void *arg), + void *arg) + { ++ if (dwfl->attacherr != DWFL_E_NOERROR) ++ { ++ __libdwfl_seterrno (dwfl->attacherr); ++ return -1; ++ } ++ + Dwfl_Process *process = dwfl->process; + if (process == NULL) + { +diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h +index 9b03d8a..30c0f8a 100644 +--- a/libdwfl/libdwflP.h ++++ b/libdwfl/libdwflP.h +@@ -91,7 +91,8 @@ typedef struct Dwfl_Process Dwfl_Process; + DWFL_ERROR (ATTACH_STATE_CONFLICT, N_("Dwfl already has attached state")) \ + DWFL_ERROR (NO_ATTACH_STATE, N_("Dwfl has no attached state")) \ + DWFL_ERROR (NO_UNWIND, N_("Unwinding not supported for this architecture")) \ +- DWFL_ERROR (INVALID_ARGUMENT, N_("Invalid argument")) ++ DWFL_ERROR (INVALID_ARGUMENT, N_("Invalid argument")) \ ++ DWFL_ERROR (NO_CORE_FILE, N_("Not an ET_CORE ELF file")) + + #define DWFL_ERROR(name, text) DWFL_E_##name, + typedef enum { DWFL_ERRORS DWFL_E_NUM } Dwfl_Error; +@@ -110,6 +111,7 @@ struct Dwfl + Dwfl_Module *modulelist; /* List in order used by full traversals. */ + + Dwfl_Process *process; ++ Dwfl_Error attacherr; /* Previous error attaching process. */ + + GElf_Addr offline_next_address; + +diff --git a/libdwfl/linux-core-attach.c b/libdwfl/linux-core-attach.c +index 1002788..7ef3f25 100644 +--- a/libdwfl/linux-core-attach.c ++++ b/libdwfl/linux-core-attach.c +@@ -309,33 +309,41 @@ static const Dwfl_Thread_Callbacks core_thread_callbacks = + int + dwfl_core_file_attach (Dwfl *dwfl, Elf *core) + { ++ Dwfl_Error err = DWFL_E_NOERROR; + Ebl *ebl = ebl_openbackend (core); + if (ebl == NULL) + { +- __libdwfl_seterrno (DWFL_E_LIBEBL); ++ err = DWFL_E_LIBEBL; ++ fail_err: ++ if (dwfl->process == NULL && dwfl->attacherr == DWFL_E_NOERROR) ++ dwfl->attacherr = __libdwfl_canon_error (err); ++ __libdwfl_seterrno (err); + return -1; + } + size_t nregs = ebl_frame_nregs (ebl); + if (nregs == 0) + { +- __libdwfl_seterrno (DWFL_E_NO_UNWIND); ++ err = DWFL_E_NO_UNWIND; ++ fail: + ebl_closebackend (ebl); +- return -1; ++ goto fail_err; + } + GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (core, &ehdr_mem); + if (ehdr == NULL) + { +- __libdwfl_seterrno (DWFL_E_LIBELF); +- ebl_closebackend (ebl); +- return -1; ++ err = DWFL_E_LIBELF; ++ goto fail; ++ } ++ if (ehdr->e_type != ET_CORE) ++ { ++ err = DWFL_E_NO_CORE_FILE; ++ goto fail; + } +- assert (ehdr->e_type == ET_CORE); + size_t phnum; + if (elf_getphdrnum (core, &phnum) < 0) + { +- __libdwfl_seterrno (DWFL_E_LIBELF); +- ebl_closebackend (ebl); +- return -1; ++ err = DWFL_E_LIBELF; ++ goto fail; + } + pid_t pid = -1; + Elf_Data *note_data = NULL; +@@ -351,8 +359,8 @@ dwfl_core_file_attach (Dwfl *dwfl, Elf *core) + } + if (note_data == NULL) + { +- ebl_closebackend (ebl); +- return DWFL_E_LIBELF; ++ err = DWFL_E_LIBELF; ++ goto fail; + } + size_t offset = 0; + GElf_Nhdr nhdr; +@@ -394,16 +402,14 @@ dwfl_core_file_attach (Dwfl *dwfl, Elf *core) + if (pid == -1) + { + /* No valid NT_PRPSINFO recognized in this CORE. */ +- __libdwfl_seterrno (DWFL_E_BADELF); +- ebl_closebackend (ebl); +- return -1; ++ err = DWFL_E_BADELF; ++ goto fail; + } + struct core_arg *core_arg = malloc (sizeof *core_arg); + if (core_arg == NULL) + { +- __libdwfl_seterrno (DWFL_E_NOMEM); +- ebl_closebackend (ebl); +- return -1; ++ err = DWFL_E_NOMEM; ++ goto fail; + } + core_arg->core = core; + core_arg->note_data = note_data; +diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c +index 58d6942..b919275 100644 +--- a/libdwfl/linux-pid-attach.c ++++ b/libdwfl/linux-pid-attach.c +@@ -293,13 +293,23 @@ dwfl_linux_proc_attach (Dwfl *dwfl, pid_t pid, bool assume_ptrace_stopped) + { + char buffer[36]; + FILE *procfile; ++ int err = 0; /* The errno to return and set for dwfl->attcherr. */ + + /* Make sure to report the actual PID (thread group leader) to + dwfl_attach_state. */ + snprintf (buffer, sizeof (buffer), "/proc/%ld/status", (long) pid); + procfile = fopen (buffer, "r"); + if (procfile == NULL) +- return errno; ++ { ++ err = errno; ++ fail: ++ if (dwfl->process == NULL && dwfl->attacherr == DWFL_E_NOERROR) ++ { ++ errno = err; ++ dwfl->attacherr = __libdwfl_canon_error (DWFL_E_ERRNO); ++ } ++ return err; ++ } + + char *line = NULL; + size_t linelen = 0; +@@ -320,19 +330,26 @@ dwfl_linux_proc_attach (Dwfl *dwfl, pid_t pid, bool assume_ptrace_stopped) + fclose (procfile); + + if (pid == 0) +- return ESRCH; ++ { ++ err = ESRCH; ++ goto fail; ++ } + + char dirname[64]; + int i = snprintf (dirname, sizeof (dirname), "/proc/%ld/task", (long) pid); + assert (i > 0 && i < (ssize_t) sizeof (dirname) - 1); + DIR *dir = opendir (dirname); + if (dir == NULL) +- return errno; ++ { ++ err = errno; ++ goto fail; ++ } + struct pid_arg *pid_arg = malloc (sizeof *pid_arg); + if (pid_arg == NULL) + { + closedir (dir); +- return ENOMEM; ++ err = ENOMEM; ++ goto fail; + } + pid_arg->dir = dir; + pid_arg->tid_attached = 0; +diff --git a/tests/backtrace.c b/tests/backtrace.c +index 1a4709b..ce0bd17 100644 +--- a/tests/backtrace.c ++++ b/tests/backtrace.c +@@ -1,5 +1,5 @@ + /* Test program for unwinding of frames. +- Copyright (C) 2013 Red Hat, Inc. ++ Copyright (C) 2013, 2014 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -459,6 +459,9 @@ main (int argc __attribute__ ((unused)), char **argv) + }; + (void) argp_parse (&argp, argc, argv, 0, NULL, &dwfl); + assert (dwfl != NULL); ++ /* We want to make sure the dwfl was properly attached. */ ++ if (dwfl_pid (dwfl) < 0) ++ error (2, 0, "dwfl_pid: %s", dwfl_errmsg (-1)); + dump (dwfl); + dwfl_end (dwfl); + return 0; diff --git a/elfutils.spec b/elfutils.spec index 3bbd621..8e3a8af 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.158 -%global baserelease 3 +%global baserelease 4 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -49,6 +49,7 @@ Patch2: %{?source_url}elfutils-portability.patch Patch3: elfutils-0.158-mod-e_type.patch Patch4: elfutils-0.158-CVE-2014-0172.patch +Patch5: elfutils-0.158-argp-attach.patch %if !%{compat} Release: %{baserelease}%{?dist} @@ -215,6 +216,7 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %patch3 -p1 -b .e_type %patch4 -p1 -b .CVE-2014-0172 +%patch5 -p1 -b .argp-attach find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -335,6 +337,9 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Tue Jun 10 2014 Mark Wielaard - 0.158-4 +- Add elfutils-0.158-argp-attach.patch (#1107654) + * Tue Apr 10 2014 Mark Wielaard - 0.158-3 - Add elfutils-0.158-CVE-2014-0172.patch (#1085729) From 614e4be53066d02a44d538e9cb6bb693a318c860 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 19 Dec 2014 23:08:53 +0100 Subject: [PATCH 002/216] Update to 0.161. --- .gitignore | 1 + ....patch => elfutils-portability-0.161.patch | 166 +++++++++--------- elfutils.spec | 7 +- sources | 2 +- 4 files changed, 91 insertions(+), 85 deletions(-) rename elfutils-portability.patch => elfutils-portability-0.161.patch (94%) diff --git a/.gitignore b/.gitignore index 720bb73..94469a7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /elfutils-0.158.tar.bz2 /elfutils-0.159.tar.bz2 /elfutils-0.160.tar.bz2 +/elfutils-0.161.tar.bz2 diff --git a/elfutils-portability.patch b/elfutils-portability-0.161.patch similarity index 94% rename from elfutils-portability.patch rename to elfutils-portability-0.161.patch index 44d729f..7539f8b 100644 --- a/elfutils-portability.patch +++ b/elfutils-portability-0.161.patch @@ -1,6 +1,6 @@ --- elfutils/backends/ChangeLog +++ elfutils/backends/ChangeLog -@@ -413,6 +413,10 @@ +@@ -433,6 +433,10 @@ * ppc_attrs.c (ppc_check_object_attribute): Handle tag GNU_Power_ABI_Struct_Return. @@ -11,7 +11,7 @@ 2008-10-04 Ulrich Drepper * i386_reloc.def: Fix entries for TLS_GOTDESC, TLS_DESC_CALL, and -@@ -740,6 +744,11 @@ +@@ -760,6 +764,11 @@ * sparc_init.c: Likewise. * x86_64_init.c: Likewise. @@ -23,7 +23,7 @@ 2005-11-19 Roland McGrath * ppc64_reloc.def: REL30 -> ADDR30. -@@ -762,6 +771,9 @@ +@@ -782,6 +791,9 @@ * Makefile.am (uninstall): Don't try to remove $(pkgincludedir). (CLEANFILES): Add libebl_$(m).so. @@ -41,7 +41,7 @@ -Wl,--version-script,$(@:.so=.map) \ - -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw) + -Wl,-z,defs $(LD_AS_NEEDED) $(libelf) $(libdw) - $(textrel_check) + @$(textrel_check) libebl_i386.so: $(cpu_i386) --- elfutils/backends/Makefile.in @@ -87,18 +87,18 @@ COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) CLEANFILES = *.gcno *.gcda $(foreach m,$(modules), libebl_$(m).map \ libebl_$(m).so $(am_libebl_$(m)_pic_a_OBJECTS)) -@@ -885,7 +888,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a +@@ -888,7 +891,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a $(LINK) -shared -o $(@:.map=.so) \ -Wl,--whole-archive $< $(cpu_$*) -Wl,--no-whole-archive \ -Wl,--version-script,$(@:.so=.map) \ - -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw) + -Wl,-z,defs $(LD_AS_NEEDED) $(libelf) $(libdw) - $(textrel_check) + @$(textrel_check) libebl_i386.so: $(cpu_i386) --- elfutils/ChangeLog +++ elfutils/ChangeLog -@@ -170,6 +170,8 @@ +@@ -187,6 +187,8 @@ 2012-01-24 Mark Wielaard @@ -107,7 +107,7 @@ * COPYING: Fix address. Updated version from gnulib. 2012-01-23 Mark Wielaard -@@ -188,6 +190,9 @@ +@@ -205,6 +207,9 @@ 2011-10-08 Mike Frysinger @@ -117,7 +117,7 @@ * configure.ac: Fix use of AC_ARG_ENABLE to handle $enableval correctly. 2011-10-02 Ulrich Drepper -@@ -209,6 +214,10 @@ +@@ -226,6 +231,10 @@ * configure.ac (LOCALEDIR, DATADIRNAME): Removed. @@ -128,7 +128,7 @@ 2009-09-21 Ulrich Drepper * configure.ac: Update for more modern autoconf. -@@ -217,6 +226,10 @@ +@@ -234,6 +243,10 @@ * configure.ac (zip_LIBS): Check for liblzma too. @@ -139,7 +139,7 @@ 2009-04-19 Roland McGrath * configure.ac (eu_version): Round down here, not in version.h macros. -@@ -228,6 +241,8 @@ +@@ -245,6 +258,8 @@ 2009-01-23 Roland McGrath @@ -148,7 +148,7 @@ * configure.ac (zlib check): Check for gzdirect, need zlib >= 1.2.2.3. * configure.ac (__thread check): Use AC_LINK_IFELSE, in case of -@@ -308,6 +323,10 @@ +@@ -325,6 +340,10 @@ * configure.ac: Add dummy automake conditional to get dependencies for non-generic linker right. See src/Makefile.am. @@ -159,7 +159,7 @@ 2005-11-18 Roland McGrath * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): New variable. -@@ -355,6 +374,17 @@ +@@ -372,6 +391,17 @@ * Makefile.am (all_SUBDIRS): Add libdwfl. * configure.ac: Write libdwfl/Makefile. @@ -179,7 +179,7 @@ * configure.ac [AH_BOTTOM] (INTDECL, _INTDECL): New macros. --- elfutils/config/ChangeLog +++ elfutils/config/ChangeLog -@@ -62,6 +62,10 @@ +@@ -71,6 +71,10 @@ * known-dwarf.awk: Use gawk. @@ -226,7 +226,7 @@ %.os: %.c %.o --- elfutils/config/Makefile.in +++ elfutils/config/Makefile.in -@@ -146,6 +146,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -147,6 +147,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -234,7 +234,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -177,6 +178,7 @@ SHELL = @SHELL@ +@@ -178,6 +179,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -264,7 +264,7 @@ #include --- elfutils/configure +++ elfutils/configure -@@ -661,6 +661,8 @@ ZLIB_TRUE +@@ -663,6 +663,8 @@ ZLIB_TRUE LIBEBL_SUBDIR TESTS_RPATH_FALSE TESTS_RPATH_TRUE @@ -273,7 +273,7 @@ BUILD_STATIC_FALSE BUILD_STATIC_TRUE USE_VALGRIND_FALSE -@@ -676,6 +678,8 @@ NEVER_TRUE +@@ -678,6 +680,8 @@ NEVER_TRUE base_cpu NATIVE_LD_FALSE NATIVE_LD_TRUE @@ -282,7 +282,7 @@ NM READELF ac_ct_AR -@@ -796,6 +800,7 @@ enable_debugpred +@@ -798,6 +802,7 @@ enable_debugpred enable_gprof enable_gcov enable_valgrind @@ -290,7 +290,7 @@ enable_tests_rpath enable_libebl_subdir with_zlib -@@ -1452,6 +1457,7 @@ Optional Features: +@@ -1455,6 +1460,7 @@ Optional Features: --enable-gprof build binaries with gprof support --enable-gcov build binaries with gcov support --enable-valgrind run all tests under valgrind @@ -298,7 +298,7 @@ --enable-tests-rpath build $ORIGIN-using rpath into tests --enable-libebl-subdir=DIR install libebl_CPU modules in $(libdir)/DIR -@@ -4728,6 +4734,130 @@ if test "x$ac_cv_c99" != xyes; then : +@@ -4843,6 +4849,130 @@ if test "x$ac_cv_c99" != xyes; then : as_fn_error $? "gcc with C99 support required" "$LINENO" 5 fi @@ -429,7 +429,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __thread support" >&5 $as_echo_n "checking for __thread support... " >&6; } if ${ac_cv_tls+:} false; then : -@@ -4764,7 +4894,13 @@ fi +@@ -4879,7 +5009,13 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 $as_echo "$ac_cv_tls" >&6; } if test "x$ac_cv_tls" != xyes; then : @@ -444,7 +444,7 @@ fi # Check whether --enable-largefile was given. -@@ -5131,6 +5267,22 @@ else +@@ -5246,6 +5382,22 @@ else fi @@ -467,7 +467,7 @@ # Check whether --enable-tests-rpath was given. if test "${enable_tests_rpath+set}" = set; then : enableval=$enable_tests_rpath; tests_use_rpath=$enableval -@@ -5854,7 +6006,7 @@ case "$eu_version" in +@@ -5983,7 +6135,7 @@ case "$eu_version" in esac # Round up to the next release API (x.y) version. @@ -476,7 +476,7 @@ ac_ext=c ac_cpp='$CPP $CPPFLAGS' -@@ -6600,6 +6752,10 @@ if test -z "${BUILD_STATIC_TRUE}" && tes +@@ -6729,6 +6881,10 @@ if test -z "${BUILD_STATIC_TRUE}" && tes as_fn_error $? "conditional \"BUILD_STATIC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi @@ -568,7 +568,7 @@ AC_ARG_ENABLE([tests-rpath], AS_HELP_STRING([--enable-tests-rpath],[build $ORIGIN-using rpath into tests]), [tests_use_rpath=$enableval], [tests_use_rpath=no]) -@@ -297,7 +353,7 @@ case "$eu_version" in +@@ -302,7 +358,7 @@ case "$eu_version" in esac # Round up to the next release API (x.y) version. @@ -660,10 +660,10 @@ + $(am__append_1) -fpic COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) CLEANFILES = *.gcno *.gcda - textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi + textrel_msg = echo "WARNING: TEXTREL found in '$@'" --- elfutils/libasm/ChangeLog +++ elfutils/libasm/ChangeLog -@@ -79,6 +79,11 @@ +@@ -87,6 +87,11 @@ * asm_error.c: Add new error ASM_E_IOERROR. * libasmP.h: Add ASM_E_IOERROR definition. @@ -721,7 +721,7 @@ COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) CLEANFILES = *.gcno *.gcda $(am_libasm_pic_a_OBJECTS) \ libasm.so.$(VERSION) -@@ -370,7 +373,7 @@ libasm_a_SOURCES = asm_begin.c asm_abort +@@ -373,7 +376,7 @@ libasm_a_SOURCES = asm_begin.c asm_abort libasm_pic_a_SOURCES = am_libasm_pic_a_OBJECTS = $(libasm_a_SOURCES:.c=.os) @@ -807,7 +807,7 @@ $P.mnemonics) --- elfutils/libdw/ChangeLog +++ elfutils/libdw/ChangeLog -@@ -439,6 +439,10 @@ +@@ -717,6 +717,10 @@ * Makefile.am (known-dwarf.h): Run gawk on config/known-dwarf.awk. @@ -818,7 +818,7 @@ 2011-07-14 Mark Wielaard * libdw.h (dwarf_offdie): Fix documentation to mention .debug_info. -@@ -798,6 +802,10 @@ +@@ -1076,6 +1080,10 @@ * dwarf_hasattr_integrate.c: Integrate DW_AT_specification too. @@ -829,7 +829,7 @@ 2009-08-10 Roland McGrath * dwarf_getscopevar.c: Use dwarf_diename. -@@ -1566,6 +1574,11 @@ +@@ -1844,6 +1852,11 @@ 2005-05-31 Roland McGrath @@ -860,7 +860,7 @@ #endif --- elfutils/libdw/libdw.h +++ elfutils/libdw/libdw.h -@@ -915,7 +915,7 @@ extern Dwarf_OOM dwarf_new_oom_handler ( +@@ -1003,7 +1003,7 @@ extern Dwarf_OOM dwarf_new_oom_handler ( /* Inline optimizations. */ @@ -881,7 +881,7 @@ noinst_PROGRAMS = $(am__EXEEXT_1) subdir = libdw ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -@@ -296,6 +297,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -298,6 +299,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -889,7 +889,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -327,6 +329,7 @@ SHELL = @SHELL@ +@@ -329,6 +331,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -897,7 +897,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -388,10 +391,11 @@ top_srcdir = @top_srcdir@ +@@ -390,10 +393,11 @@ top_srcdir = @top_srcdir@ zip_LIBS = @zip_LIBS@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \ -I$(srcdir)/../libelf @@ -911,7 +911,7 @@ + $(am__append_1) $(am__append_2) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) CLEANFILES = *.gcno *.gcda - textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi + textrel_msg = echo "WARNING: TEXTREL found in '$@'" --- elfutils/libdwelf/Makefile.in +++ elfutils/libdwelf/Makefile.in @@ -82,6 +82,7 @@ host_triplet = @host@ @@ -954,10 +954,10 @@ + $(am__append_1) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) CLEANFILES = *.gcno *.gcda $(am_libdwelf_pic_a_OBJECTS) - textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi + textrel_msg = echo "WARNING: TEXTREL found in '$@'" --- elfutils/libdwfl/ChangeLog +++ elfutils/libdwfl/ChangeLog -@@ -467,6 +467,21 @@ +@@ -571,6 +571,21 @@ (dwfl_module_addrsym) (i_to_symfile): New function. (dwfl_module_addrsym) (search_table): Use it. @@ -979,7 +979,7 @@ 2013-11-07 Jan Kratochvil Mark Wielaard -@@ -2232,6 +2247,11 @@ +@@ -2336,6 +2351,11 @@ 2005-07-21 Roland McGrath @@ -1107,8 +1107,8 @@ + $(am__append_1) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) CLEANFILES = *.gcno *.gcda $(am_libdwfl_pic_a_OBJECTS) - textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi -@@ -410,8 +413,8 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_en + textrel_msg = echo "WARNING: TEXTREL found in '$@'" +@@ -413,8 +416,8 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_en dwfl_module_register_names.c dwfl_segment_report_module.c \ link_map.c core-file.c open.c image-header.c dwfl_frame.c \ frame_unwind.c dwfl_frame_pc.c linux-pid-attach.c \ @@ -1121,7 +1121,7 @@ libelf = ../libelf/libelf.so --- elfutils/libebl/ChangeLog +++ elfutils/libebl/ChangeLog -@@ -754,6 +754,11 @@ +@@ -765,6 +765,11 @@ * Makefile.am (libebl_*_so_SOURCES): Set to $(*_SRCS) so dependency tracking works right. @@ -1172,10 +1172,10 @@ + $(am__append_1) -fpic COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) CLEANFILES = *.gcno *.gcda $(am_libebl_pic_a_OBJECTS) - textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi + textrel_msg = echo "WARNING: TEXTREL found in '$@'" --- elfutils/libelf/ChangeLog +++ elfutils/libelf/ChangeLog -@@ -139,6 +139,11 @@ +@@ -244,6 +244,11 @@ * elf-knowledge.h (SECTION_STRIP_P): Remove < SHT_NUM check. @@ -1187,7 +1187,7 @@ 2011-02-26 Mark Wielaard * elf_end.c (elf_end): Call rwlock_unlock before rwlock_fini. -@@ -816,6 +821,11 @@ +@@ -921,6 +926,11 @@ * elf.h: Update from glibc. @@ -1285,7 +1285,7 @@ COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) CLEANFILES = *.gcno *.gcda $(am_libelf_pic_a_OBJECTS) \ libelf.so.$(VERSION) -@@ -446,7 +450,7 @@ libelf_a_SOURCES = elf_version.c elf_has +@@ -449,7 +453,7 @@ libelf_a_SOURCES = elf_version.c elf_has libelf_pic_a_SOURCES = am_libelf_pic_a_OBJECTS = $(libelf_a_SOURCES:.c=.os) @@ -1347,7 +1347,7 @@ break; --- elfutils/src/ChangeLog +++ elfutils/src/ChangeLog -@@ -1155,8 +1155,16 @@ +@@ -1371,8 +1371,16 @@ * readelf.c (attr_callback): Use print_block only when we don't use print_ops. @@ -1364,7 +1364,7 @@ * ar.c (do_oper_extract): Use pathconf instead of statfs. 2009-08-01 Ulrich Drepper -@@ -1320,6 +1328,8 @@ +@@ -1536,6 +1544,8 @@ * readelf.c (print_debug_frame_section): Use t instead of j formats for ptrdiff_t OFFSET. @@ -1373,7 +1373,7 @@ 2009-01-21 Ulrich Drepper * elflint.c (check_program_header): Fix typo in .eh_frame_hdr section -@@ -1503,6 +1513,11 @@ +@@ -1719,6 +1729,11 @@ that matches its PT_LOAD's p_flags &~ PF_W. On sparc, PF_X really is valid in RELRO. @@ -1385,7 +1385,7 @@ 2008-02-29 Roland McGrath * readelf.c (print_attributes): Add a cast. -@@ -1754,6 +1769,8 @@ +@@ -1970,6 +1985,8 @@ * readelf.c (hex_dump): Fix rounding error in whitespace calculation. @@ -1394,7 +1394,7 @@ 2007-10-15 Roland McGrath * make-debug-archive.in: New file. -@@ -2193,6 +2210,10 @@ +@@ -2409,6 +2426,10 @@ * elflint.c (valid_e_machine): Add EM_ALPHA. Reported by Christian Aichinger . @@ -1405,7 +1405,7 @@ 2006-08-08 Ulrich Drepper * elflint.c (check_dynamic): Don't require DT_HASH for DT_SYMTAB. -@@ -2269,6 +2290,10 @@ +@@ -2485,6 +2506,10 @@ * Makefile.am: Add hacks to create dependency files for non-generic linker. @@ -1416,7 +1416,7 @@ 2006-06-12 Ulrich Drepper * ldgeneric.c (ld_generic_generate_sections): Don't create .interp -@@ -2617,6 +2642,11 @@ +@@ -2833,6 +2858,11 @@ * readelf.c (print_debug_loc_section): Fix indentation for larger address size. @@ -1430,7 +1430,7 @@ * readelf.c (print_debug_line_section): Print section offset of each --- elfutils/src/findtextrel.c +++ elfutils/src/findtextrel.c -@@ -496,7 +496,11 @@ ptrcompare (const void *p1, const void * +@@ -502,7 +502,11 @@ ptrcompare (const void *p1, const void * static void @@ -1538,7 +1538,7 @@ COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) CLEANFILES = *.gcno *.gcda make-debug-archive none_ld.os \ $(ld_modules:.c=.os) *.gconv -@@ -449,8 +452,8 @@ AM_LFLAGS = -Pld -olex.yy.c +@@ -452,8 +455,8 @@ AM_LFLAGS = -Pld -olex.yy.c native_ld = @native_ld@ ld_dsos = libld_elf_i386_pic.a @NATIVE_LD_FALSE@noinst_LIBRARIES = libld_elf.a libar.a $(ld_dsos) \ @@ -1549,7 +1549,7 @@ @NATIVE_LD_TRUE@native_ld_cflags = -DBASE_ELF_NAME=elf_$(base_cpu) @NEVER_TRUE@libdummy_a_SOURCES = i386_ld.c ld_SOURCES = ld.c ldgeneric.c ldlex.l ldscript.y symbolhash.c sectionhash.c \ -@@ -476,13 +479,18 @@ libeu = ../lib/libeu.a +@@ -479,13 +482,18 @@ libeu = ../lib/libeu.a # XXX While the file is not finished, don't warn about this ldgeneric_no_Wunused = yes @@ -1571,7 +1571,7 @@ findtextrel_LDADD = $(libdw) $(libelf) --- elfutils/src/readelf.c +++ elfutils/src/readelf.c -@@ -4253,10 +4253,12 @@ listptr_base (struct listptr *p) +@@ -4368,10 +4368,12 @@ listptr_base (struct listptr *p) return base; } @@ -1586,7 +1586,7 @@ struct listptr *p1 = (void *) a; struct listptr *p2 = (void *) b; -@@ -4345,8 +4347,11 @@ static void +@@ -4467,8 +4469,11 @@ static void sort_listptr (struct listptr_table *table, const char *name) { if (table->n > 0) @@ -1600,7 +1600,7 @@ } static bool -@@ -9268,7 +9273,7 @@ dump_archive_index (Elf *elf, const char +@@ -9539,7 +9544,7 @@ dump_archive_index (Elf *elf, const char if (unlikely (elf_rand (elf, as_off) == 0) || unlikely ((subelf = elf_begin (-1, ELF_C_READ_MMAP, elf)) == NULL)) @@ -1682,7 +1682,7 @@ } /* Open the file. */ -@@ -2086,7 +2102,7 @@ while computing checksum for debug infor +@@ -2091,7 +2107,7 @@ while computing checksum for debug infor /* If requested, preserve the timestamp. */ if (tvp != NULL) { @@ -1691,7 +1691,7 @@ { error (0, errno, gettext ("\ cannot set access and modification date of '%s'"), -@@ -2143,7 +2159,7 @@ handle_ar (int fd, Elf *elf, const char +@@ -2148,7 +2164,7 @@ handle_ar (int fd, Elf *elf, const char if (tvp != NULL) { @@ -1712,7 +1712,7 @@ #ifndef __linux__ --- elfutils/tests/ChangeLog +++ elfutils/tests/ChangeLog -@@ -304,6 +304,13 @@ +@@ -421,6 +421,13 @@ 2013-12-02 Jan Kratochvil @@ -1726,7 +1726,7 @@ * Makefile.am (check_PROGRAMS): Add backtrace, backtrace-child, backtrace-data and backtrace-dwarf. (BUILT_SOURCES, clean-local, backtrace-child-biarch): New. -@@ -1168,6 +1175,8 @@ +@@ -1285,6 +1292,8 @@ 2008-01-21 Roland McGrath @@ -1735,7 +1735,7 @@ * testfile45.S.bz2: Add tests for cltq, cqto. * testfile45.expect.bz2: Adjust. -@@ -1876,6 +1885,11 @@ +@@ -1993,6 +2002,11 @@ * Makefile.am (TESTS): Add run-elflint-test.sh. (EXTRA_DIST): Add run-elflint-test.sh and testfile18.bz2. @@ -1760,7 +1760,7 @@ case 0: --- elfutils/tests/Makefile.am +++ elfutils/tests/Makefile.am -@@ -356,6 +356,7 @@ get_lines_LDADD = $(libdw) $(libelf) +@@ -365,6 +365,7 @@ get_lines_LDADD = $(libdw) $(libelf) get_files_LDADD = $(libdw) $(libelf) get_aranges_LDADD = $(libdw) $(libelf) allfcts_LDADD = $(libdw) $(libelf) @@ -1788,24 +1788,23 @@ check_PROGRAMS = arextract$(EXEEXT) arsymtest$(EXEEXT) \ newfile$(EXEEXT) saridx$(EXEEXT) scnnames$(EXEEXT) \ sectiondump$(EXEEXT) showptable$(EXEEXT) update1$(EXEEXT) \ -@@ -111,7 +112,7 @@ check_PROGRAMS = arextract$(EXEEXT) arsy - backtrace-data$(EXEEXT) backtrace-dwarf$(EXEEXT) \ - debuglink$(EXEEXT) debugaltlink$(EXEEXT) buildid$(EXEEXT) \ - $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4) +@@ -113,7 +114,7 @@ check_PROGRAMS = arextract$(EXEEXT) arsy + deleted$(EXEEXT) deleted-lib.so$(EXEEXT) \ + aggregate_size$(EXEEXT) vdsosyms$(EXEEXT) $(am__EXEEXT_1) \ + $(am__EXEEXT_2) $(am__EXEEXT_4) -@BIARCH_TRUE@am__append_4 = backtrace-child-biarch +@BIARCH_TRUE@am__append_5 = backtrace-child-biarch TESTS = run-arextract.sh run-arsymtest.sh newfile$(EXEEXT) \ test-nlist$(EXEEXT) update1$(EXEEXT) update2$(EXEEXT) \ update3$(EXEEXT) update4$(EXEEXT) run-show-die-info.sh \ -@@ -155,14 +156,14 @@ TESTS = run-arextract.sh run-arsymtest.s - run-backtrace-core-s390.sh run-backtrace-core-aarch64.sh \ - run-backtrace-demangle.sh run-stack-d-test.sh \ +@@ -159,14 +160,14 @@ TESTS = run-arextract.sh run-arsymtest.s run-stack-i-test.sh run-readelf-dwz-multi.sh \ -- run-allfcts-multi.sh $(am__EXEEXT_2) $(am__append_7) \ -- $(am__append_8) $(am__EXEEXT_4) + run-allfcts-multi.sh run-deleted.sh run-linkmap-cut.sh \ + run-aggregate-size.sh vdsosyms$(EXEEXT) run-readelf-A.sh \ +- $(am__EXEEXT_2) $(am__append_7) $(am__append_8) \ ++ $(am__EXEEXT_2) $(am__append_8) $(am__append_9) \ + $(am__EXEEXT_4) -@STANDALONE_FALSE@am__append_5 = msg_tst md5-sha1-test -+ run-allfcts-multi.sh $(am__EXEEXT_2) $(am__append_8) \ -+ $(am__append_9) $(am__EXEEXT_4) @STANDALONE_FALSE@am__append_6 = msg_tst md5-sha1-test -@LZMA_TRUE@am__append_7 = run-readelf-s.sh run-dwflsyms.sh -@ZLIB_TRUE@am__append_8 = run-readelf-zdebug.sh @@ -1818,7 +1817,7 @@ subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -768,6 +769,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -787,6 +788,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1826,7 +1825,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -799,6 +801,7 @@ SHELL = @SHELL@ +@@ -818,6 +820,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -1834,7 +1833,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -858,17 +861,17 @@ top_build_prefix = @top_build_prefix@ +@@ -877,12 +880,12 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zip_LIBS = @zip_LIBS@ @@ -1852,14 +1851,17 @@ + $(am__append_1) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) CLEANFILES = *.gcno *.gcda - textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi + textrel_msg = echo "WARNING: TEXTREL found in '$@'" +@@ -890,7 +893,7 @@ textrel_msg = echo "WARNING: TEXTREL fou + @FATAL_TEXTREL_TRUE@textrel_found = $(textrel_msg); exit 1 + textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then $(textrel_found); fi BUILD_RPATH = \$$ORIGIN/../libasm:\$$ORIGIN/../libdw:\$$ORIGIN/../backends:\$$ORIGIN/../libelf -AM_LDFLAGS = $(am__append_2) $(am__append_3) +AM_LDFLAGS = $(am__append_3) $(am__append_4) @TESTS_RPATH_FALSE@tests_rpath = no @TESTS_RPATH_TRUE@tests_rpath = yes asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ -@@ -1077,6 +1080,7 @@ get_lines_LDADD = $(libdw) $(libelf) +@@ -1106,6 +1109,7 @@ get_lines_LDADD = $(libdw) $(libelf) get_files_LDADD = $(libdw) $(libelf) get_aranges_LDADD = $(libdw) $(libelf) allfcts_LDADD = $(libdw) $(libelf) diff --git a/elfutils.spec b/elfutils.spec index 3f8c436..d9dfa7e 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects -Version: 0.160 +Version: 0.161 %global baserelease 1 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ @@ -44,7 +44,7 @@ Group: Development/Tools Source: %{?source_url}%{name}-%{version}.tar.bz2 -Patch1: %{?source_url}elfutils-portability.patch +Patch1: %{?source_url}elfutils-portability-%{version}.patch %if !%{compat} Release: %{baserelease}%{?dist} @@ -334,6 +334,9 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Fri Dec 19 2014 Mark Wielaard - 0.161-1 +- Update to 0.161. + * Wed Aug 27 2014 Mark Wielaard - 0.160-1 - Update to 0.160. - Remove integrated upstream patches: diff --git a/sources b/sources index f4b45bc..d5e1096 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -7527f22dff8b1ac8c122cfc4d3d3bb1e elfutils-0.160.tar.bz2 +e1b9847c9a6a1ad340de8d47a863ec52 elfutils-0.161.tar.bz2 From f1c9e8f4587f8870ddf88cb873f895ce32b898a3 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 13 Jan 2015 11:40:10 +0100 Subject: [PATCH 003/216] 0.161-2 Add elfutils-0.161-ar-long-name.patch (#1181525 CVE-2014-9447) --- elfutils-0.161-ar-long-name.patch | 51 +++++++++++++++++++++++++++++++ elfutils.spec | 9 +++++- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.161-ar-long-name.patch diff --git a/elfutils-0.161-ar-long-name.patch b/elfutils-0.161-ar-long-name.patch new file mode 100644 index 0000000..030efd9 --- /dev/null +++ b/elfutils-0.161-ar-long-name.patch @@ -0,0 +1,51 @@ +commit 147018e729e7c22eeabf15b82d26e4bf68a0d18e +Author: Alexander Cherepanov +Date: Sun Dec 28 19:57:19 2014 +0300 + + libelf: Fix dir traversal vuln in ar extraction. + + read_long_names terminates names at the first '/' found but then skips + one character without checking (it's supposed to be '\n'). Hence the + next name could start with any character including '/'. This leads to + a directory traversal vulnerability at the time the contents of the + archive is extracted. + + The danger is mitigated by the fact that only one '/' is possible in a + resulting filename and only in the leading position. Hence only files + in the root directory can be written via this vuln and only when ar is + executed as root. + + The fix for the vuln is to not skip any characters while looking + for '/'. + + Signed-off-by: Alexander Cherepanov + +diff --git a/libelf/ChangeLog b/libelf/ChangeLog +index 3b88d03..447c354 100644 +--- a/libelf/ChangeLog ++++ b/libelf/ChangeLog +@@ -1,3 +1,8 @@ ++2014-12-28 Alexander Cherepanov ++ ++ * elf_begin.c (read_long_names): Don't miss '/' right after ++ another '/'. Fixes a dir traversal vuln in ar extraction. ++ + 2014-12-18 Ulrich Drepper + + * Makefile.am: Suppress output of textrel_check command. +diff --git a/libelf/elf_begin.c b/libelf/elf_begin.c +index 30abe0b..cd3756c 100644 +--- a/libelf/elf_begin.c ++++ b/libelf/elf_begin.c +@@ -749,10 +749,7 @@ read_long_names (Elf *elf) + } + + /* NUL-terminate the string. */ +- *runp = '\0'; +- +- /* Skip the NUL byte and the \012. */ +- runp += 2; ++ *runp++ = '\0'; + + /* A sanity check. Somebody might have generated invalid + archive. */ diff --git a/elfutils.spec b/elfutils.spec index d9dfa7e..67211df 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.161 -%global baserelease 1 +%global baserelease 2 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -46,6 +46,8 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: %{?source_url}elfutils-portability-%{version}.patch +Patch2: elfutils-0.161-ar-long-name.patch + %if !%{compat} Release: %{baserelease}%{?dist} %else @@ -207,6 +209,8 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %endif %endif +%patch2 -p1 -b .ar_long_name + find . -name \*.sh ! -perm -0100 -print | xargs chmod +x %build @@ -334,6 +338,9 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Tue Jan 13 2015 Mark Wielaard - 0.161-2 +- Add elfutils-0.161-ar-long-name.patch (#1181525 CVE-2014-9447) + * Fri Dec 19 2014 Mark Wielaard - 0.161-1 - Update to 0.161. From 268313f406346dec8106b2afeba8cea7a727f9d0 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 5 Feb 2015 15:35:38 +0100 Subject: [PATCH 004/216] 0.161-3 Add elfutils-0.161-formref-type.patch. --- elfutils-0.161-formref-type.patch | 24 ++++++++++++++++++++++++ elfutils.spec | 8 +++++++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.161-formref-type.patch diff --git a/elfutils-0.161-formref-type.patch b/elfutils-0.161-formref-type.patch new file mode 100644 index 0000000..6f11e17 --- /dev/null +++ b/elfutils-0.161-formref-type.patch @@ -0,0 +1,24 @@ +commit 7c71382294af69f075c891a3418906c842491e4c +Author: Jason P. Leasure +Date: Wed Jan 14 09:26:55 2015 -0500 + + libdw: fix offset for sig8 lookup in dwarf_formref_die + + The type_offset of a type unit header is relative to the beginning + of the type unit header. + + Signed-off-by: Jason P. Leasure + +diff --git a/libdw/dwarf_formref_die.c b/libdw/dwarf_formref_die.c +index 63f6697..8b92e22 100644 +--- a/libdw/dwarf_formref_die.c ++++ b/libdw/dwarf_formref_die.c +@@ -95,7 +95,7 @@ dwarf_formref_die (attr, result) + + datap = cu->dbg->sectiondata[IDX_debug_types]->d_buf; + size = cu->dbg->sectiondata[IDX_debug_types]->d_size; +- offset = cu->type_offset; ++ offset = cu->start + cu->type_offset; + } + else + { diff --git a/elfutils.spec b/elfutils.spec index 67211df..b41daf0 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.161 -%global baserelease 2 +%global baserelease 3 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -47,6 +47,8 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: %{?source_url}elfutils-portability-%{version}.patch Patch2: elfutils-0.161-ar-long-name.patch +# libdw: fix offset for sig8 lookup in dwarf_formref_die +Patch3: elfutils-0.161-formref-type.patch %if !%{compat} Release: %{baserelease}%{?dist} @@ -210,6 +212,7 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %endif %patch2 -p1 -b .ar_long_name +%patch3 -p1 -b .formref_type find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -338,6 +341,9 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Thu Feb 05 2015 Mark Wielaard - 0.161-3 +- Add elfutils-0.161-formref-type.patch + * Tue Jan 13 2015 Mark Wielaard - 0.161-2 - Add elfutils-0.161-ar-long-name.patch (#1181525 CVE-2014-9447) From 94ab0ae1a2722ee4826e21e0f7d410364e6e1f8b Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 7 Feb 2015 22:16:10 +0100 Subject: [PATCH 005/216] 0.161-4 Add elfutils-0.161-addralign.patch (#1189928) --- elfutils-0.161-addralign.patch | 53 ++++++++++++++++++++++++++++++++++ elfutils.spec | 8 ++++- 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.161-addralign.patch diff --git a/elfutils-0.161-addralign.patch b/elfutils-0.161-addralign.patch new file mode 100644 index 0000000..bbe1332 --- /dev/null +++ b/elfutils-0.161-addralign.patch @@ -0,0 +1,53 @@ +commit 6f5934c1afa8f34bfb8f86b191ded9af854e757f +Author: Jan Kratochvil +Date: Sat Feb 7 15:08:20 2015 +0100 + + libelf: Consider sh_addralign 0 as 1 + + Currently the Koji build for arm32 fails with: + extracting debug info from /builddir/build/BUILDROOT/etcd-2.0.0-0.3.rc1.fc22.arm/usr/bin/etcd + Failed to write file: invalid section alignment + + This is because the binary etcd + http://people.redhat.com/jkratoch/etcdctl.xz + contains: + Section Headers: + [Nr] Name Type Addr Off Size ES Flg Lk Inf Al + [11] .rel.plt REL 00459ee0 449ee0 000088 08 A 13 0 0 + ^ + which corresponds to golang's code: + go/src/cmd/ld/elf.c + case EM_X86_64: + sh = elfshname(".rela.plt"); + sh->addralign = RegSize; + default: + sh = elfshname(".rel.plt"); + + + ELF spec says: + Values 0 and 1 mean the section has no alignment constraints. + and libelf/elf32_updatenull.c really parses it that way at line 204 + ElfW2(LIBELFBITS,Word) sh_align = shdr->sh_addralign ?: 1; + but unfortunately the later line being patched no longer does. + + libelf/ + 2015-02-07 Jan Kratochvil + + * elf32_updatenull.c (__elfw2(LIBELFBITS,updatenull_wrlock)): Consider + sh_addralign 0 as 1. + + Signed-off-by: Jan Kratochvil + +diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c +index be4cea0..5e809b7 100644 +--- a/libelf/elf32_updatenull.c ++++ b/libelf/elf32_updatenull.c +@@ -328,7 +328,7 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum) + enough for the largest alignment required by a data + block. */ + if (unlikely (! powerof2 (shdr->sh_addralign)) +- || unlikely (shdr->sh_addralign < sh_align)) ++ || unlikely ((shdr->sh_addralign ?: 1) < sh_align)) + { + __libelf_seterrno (ELF_E_INVALID_ALIGN); + return -1; diff --git a/elfutils.spec b/elfutils.spec index b41daf0..681ed28 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.161 -%global baserelease 3 +%global baserelease 4 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -49,6 +49,8 @@ Patch1: %{?source_url}elfutils-portability-%{version}.patch Patch2: elfutils-0.161-ar-long-name.patch # libdw: fix offset for sig8 lookup in dwarf_formref_die Patch3: elfutils-0.161-formref-type.patch +# rhbz#1189928 - Consider sh_addralign 0 as 1 +Patch4: elfutils-0.161-addralign.patch %if !%{compat} Release: %{baserelease}%{?dist} @@ -213,6 +215,7 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %patch2 -p1 -b .ar_long_name %patch3 -p1 -b .formref_type +%patch4 -p1 -b .addralign find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -341,6 +344,9 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Sat Feb 07 2015 Mark Wielaard - 0.161-4 +- Add elfutils-0.161-addralign.patch (#1189928) + * Thu Feb 05 2015 Mark Wielaard - 0.161-3 - Add elfutils-0.161-formref-type.patch From 31002bf1a680e642a10fe101eae3a9f1065dd1d2 Mon Sep 17 00:00:00 2001 From: Till Maas Date: Sat, 21 Feb 2015 21:29:31 +0100 Subject: [PATCH 006/216] Rebuilt for Fedora 23 Change https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-independent_code --- elfutils.spec | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 681ed28..8147272 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.161 -%global baserelease 4 +%global baserelease 5 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -344,6 +344,10 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Sat Feb 21 2015 Till Maas - 0.161-5 +- Rebuilt for Fedora 23 Change + https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-independent_code + * Sat Feb 07 2015 Mark Wielaard - 0.161-4 - Add elfutils-0.161-addralign.patch (#1189928) From 6c0c17ad448f771022f313553476b75c108507dd Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 9 Mar 2015 23:04:27 +0100 Subject: [PATCH 007/216] 0.161-6 Add elfutils-0.161-copyreloc.patch. --- elfutils-0.161-copyreloc.patch | 233 +++++++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.161-copyreloc.patch diff --git a/elfutils-0.161-copyreloc.patch b/elfutils-0.161-copyreloc.patch new file mode 100644 index 0000000..551d35f --- /dev/null +++ b/elfutils-0.161-copyreloc.patch @@ -0,0 +1,233 @@ +commit cc4e10fb398d40fb90e15056d808a596ef893cc3 +Author: Mark Wielaard +Date: Mon Mar 9 22:43:08 2015 +0100 + + backends: COPY relocations can also happen in ET_DYN. + + In particular COPY relocations might happen in PIE executables, + which are ET_DYN. + + Found on Fedora Rawhide with run-elflint-self.sh. + + Signed-off-by: Mark Wielaard + +diff --git a/backends/aarch64_reloc.def b/backends/aarch64_reloc.def +index 36d29e6..2e16e98 100644 +--- a/backends/aarch64_reloc.def ++++ b/backends/aarch64_reloc.def +@@ -1,5 +1,5 @@ + /* List the relocation types for AArch64. -*- C -*- +- Copyright (C) 2013, 2014 Red Hat, Inc. ++ Copyright (C) 2013, 2014, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -30,7 +30,7 @@ + + RELOC_TYPE (ABS64, REL|EXEC|DYN) + RELOC_TYPE (ABS32, REL|EXEC|DYN) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (GLOB_DAT, EXEC|DYN) + RELOC_TYPE (JUMP_SLOT, EXEC|DYN) + RELOC_TYPE (RELATIVE, EXEC|DYN) +diff --git a/backends/arm_reloc.def b/backends/arm_reloc.def +index 4b7894b..113648e 100644 +--- a/backends/arm_reloc.def ++++ b/backends/arm_reloc.def +@@ -1,5 +1,5 @@ + /* List the relocation types for arm. -*- C -*- +- Copyright (C) 2005-2010, 2014 Red Hat, Inc. ++ Copyright (C) 2005-2010, 2014, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -48,7 +48,7 @@ RELOC_TYPE (THM_XPC22, REL) + RELOC_TYPE (TLS_DTPMOD32, EXEC|DYN) + RELOC_TYPE (TLS_DTPOFF32, EXEC|DYN) + RELOC_TYPE (TLS_TPOFF32, EXEC|DYN) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (GLOB_DAT, EXEC|DYN) + RELOC_TYPE (JUMP_SLOT, EXEC|DYN) + RELOC_TYPE (RELATIVE, EXEC|DYN) +diff --git a/backends/i386_reloc.def b/backends/i386_reloc.def +index bd273b3..de3575d 100644 +--- a/backends/i386_reloc.def ++++ b/backends/i386_reloc.def +@@ -1,5 +1,5 @@ + /* List the relocation types for i386. -*- C -*- +- Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009 Red Hat, Inc. ++ Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -29,7 +29,7 @@ + /* NAME, REL|EXEC|DYN */ + + RELOC_TYPE (NONE, 0) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (32, REL|EXEC|DYN) + RELOC_TYPE (PC32, REL|EXEC|DYN) + RELOC_TYPE (GOT32, REL) +diff --git a/backends/ia64_reloc.def b/backends/ia64_reloc.def +index 9e058c8..2428925 100644 +--- a/backends/ia64_reloc.def ++++ b/backends/ia64_reloc.def +@@ -1,5 +1,5 @@ + /* List the relocation types for ia64. -*- C -*- +- Copyright (C) 2005, 2006 Red Hat, Inc. ++ Copyright (C) 2005, 2006, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -88,7 +88,7 @@ RELOC_TYPE (PCREL22, REL) + RELOC_TYPE (PCREL64I, REL) + RELOC_TYPE (IPLTMSB, REL|EXEC|DYN) + RELOC_TYPE (IPLTLSB, REL|EXEC|DYN) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (SUB, 0) + RELOC_TYPE (LTOFF22X, REL) + RELOC_TYPE (LDXMOV, REL) +diff --git a/backends/ppc64_reloc.def b/backends/ppc64_reloc.def +index 3a693cf..15a73ba 100644 +--- a/backends/ppc64_reloc.def ++++ b/backends/ppc64_reloc.def +@@ -1,5 +1,5 @@ + /* List the relocation types for ppc64. -*- C -*- +- Copyright (C) 2005 Red Hat, Inc. ++ Copyright (C) 2005, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -46,7 +46,7 @@ RELOC_TYPE (GOT16, REL) + RELOC_TYPE (GOT16_LO, REL) + RELOC_TYPE (GOT16_HI, REL) + RELOC_TYPE (GOT16_HA, REL) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (GLOB_DAT, EXEC|DYN) + RELOC_TYPE (JMP_SLOT, EXEC|DYN) + RELOC_TYPE (RELATIVE, EXEC|DYN) +diff --git a/backends/ppc_reloc.def b/backends/ppc_reloc.def +index dc963a0..3723a9c 100644 +--- a/backends/ppc_reloc.def ++++ b/backends/ppc_reloc.def +@@ -1,5 +1,5 @@ + /* List the relocation types for ppc. -*- C -*- +- Copyright (C) 2005 Red Hat, Inc. ++ Copyright (C) 2005, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -47,7 +47,7 @@ RELOC_TYPE (GOT16_LO, REL) + RELOC_TYPE (GOT16_HI, REL) + RELOC_TYPE (GOT16_HA, REL) + RELOC_TYPE (PLTREL24, REL) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (GLOB_DAT, EXEC|DYN) + RELOC_TYPE (JMP_SLOT, EXEC|DYN) + RELOC_TYPE (RELATIVE, EXEC|DYN) +diff --git a/backends/s390_reloc.def b/backends/s390_reloc.def +index b4686a3..cdef9eb 100644 +--- a/backends/s390_reloc.def ++++ b/backends/s390_reloc.def +@@ -1,5 +1,5 @@ + /* List the relocation types for s390. -*- C -*- +- Copyright (C) 2005, 2006 Red Hat, Inc. ++ Copyright (C) 2005, 2006, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -37,7 +37,7 @@ RELOC_TYPE (PC32, REL|EXEC|DYN) + RELOC_TYPE (GOT12, REL) + RELOC_TYPE (GOT32, REL) + RELOC_TYPE (PLT32, REL) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (GLOB_DAT, EXEC|DYN) + RELOC_TYPE (JMP_SLOT, EXEC|DYN) + RELOC_TYPE (RELATIVE, EXEC|DYN) +diff --git a/backends/sh_reloc.def b/backends/sh_reloc.def +index 66a5a9d..aded361 100644 +--- a/backends/sh_reloc.def ++++ b/backends/sh_reloc.def +@@ -1,5 +1,5 @@ + /* List the relocation types for SH. -*- C -*- +- Copyright (C) 2005 Red Hat, Inc. ++ Copyright (C) 2005, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -59,7 +59,7 @@ RELOC_TYPE (TLS_DTPOFF32, DYN) + RELOC_TYPE (TLS_TPOFF32, DYN) + RELOC_TYPE (GOT32, REL) + RELOC_TYPE (PLT32, REL) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (GLOB_DAT, EXEC|DYN) + RELOC_TYPE (JMP_SLOT, EXEC|DYN) + RELOC_TYPE (RELATIVE, EXEC|DYN) +diff --git a/backends/sparc_reloc.def b/backends/sparc_reloc.def +index c39b0fa..2aeb129 100644 +--- a/backends/sparc_reloc.def ++++ b/backends/sparc_reloc.def +@@ -1,5 +1,5 @@ + /* List the relocation types for sparc. -*- C -*- +- Copyright (C) 2009 Red Hat, Inc. ++ Copyright (C) 2009, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -47,7 +47,7 @@ RELOC_TYPE (GOT22, REL) + RELOC_TYPE (PC10, REL) + RELOC_TYPE (PC22, REL) + RELOC_TYPE (WPLT30, REL) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (GLOB_DAT, EXEC|DYN) + RELOC_TYPE (JMP_SLOT, EXEC|DYN) + RELOC_TYPE (RELATIVE, EXEC|DYN) +diff --git a/backends/tilegx_reloc.def b/backends/tilegx_reloc.def +index 9736286..1018110 100644 +--- a/backends/tilegx_reloc.def ++++ b/backends/tilegx_reloc.def +@@ -1,5 +1,6 @@ + /* List the relocation types for tilegx. -*- C -*- + Copyright (C) 2012 Tilera Corporation ++ Copyright (C) 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -44,7 +45,7 @@ RELOC_TYPE (HW3, REL) + RELOC_TYPE (HW0_LAST, REL) + RELOC_TYPE (HW1_LAST, REL) + RELOC_TYPE (HW2_LAST, REL) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (GLOB_DAT, EXEC|DYN) + RELOC_TYPE (JMP_SLOT, EXEC|DYN) + RELOC_TYPE (RELATIVE, EXEC|DYN) +diff --git a/backends/x86_64_reloc.def b/backends/x86_64_reloc.def +index 8ed98f6..ad84efa 100644 +--- a/backends/x86_64_reloc.def ++++ b/backends/x86_64_reloc.def +@@ -1,5 +1,5 @@ + /* List the relocation types for x86-64. -*- C -*- +- Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009 Red Hat, Inc. ++ Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -33,7 +33,7 @@ RELOC_TYPE (64, REL|EXEC|DYN) + RELOC_TYPE (PC32, REL|EXEC|DYN) + RELOC_TYPE (GOT32, REL) + RELOC_TYPE (PLT32, REL) +-RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (COPY, EXEC|DYN) + RELOC_TYPE (GLOB_DAT, EXEC|DYN) + RELOC_TYPE (JUMP_SLOT, EXEC|DYN) + RELOC_TYPE (RELATIVE, EXEC|DYN) diff --git a/elfutils.spec b/elfutils.spec index 8147272..dc65d51 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.161 -%global baserelease 5 +%global baserelease 6 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -51,6 +51,7 @@ Patch2: elfutils-0.161-ar-long-name.patch Patch3: elfutils-0.161-formref-type.patch # rhbz#1189928 - Consider sh_addralign 0 as 1 Patch4: elfutils-0.161-addralign.patch +Patch5: elfutils-0.161-copyreloc.patch %if !%{compat} Release: %{baserelease}%{?dist} @@ -216,6 +217,7 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %patch2 -p1 -b .ar_long_name %patch3 -p1 -b .formref_type %patch4 -p1 -b .addralign +%patch5 -p1 -b .copyreloc find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -344,6 +346,9 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Mon Mar 09 2015 Mark Wielaard - 0.161-6 +- Add elfutils-0.161-copyreloc.patch. + * Sat Feb 21 2015 Till Maas - 0.161-5 - Rebuilt for Fedora 23 Change https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-independent_code From 0c39d9c06ddb1d8315c2ebab06e4de96dbf63a6d Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 23 Mar 2015 15:18:46 +0100 Subject: [PATCH 008/216] 0.161-7 Add elfutils-0.161-aarch64relro.patch (#1201778) --- elfutils-0.161-aarch64relro.patch | 59 +++++++++++++++++++++++++++++++ elfutils.spec | 7 +++- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.161-aarch64relro.patch diff --git a/elfutils-0.161-aarch64relro.patch b/elfutils-0.161-aarch64relro.patch new file mode 100644 index 0000000..fca9e00 --- /dev/null +++ b/elfutils-0.161-aarch64relro.patch @@ -0,0 +1,59 @@ +commit aea89f2c1ad1cfa2ddd09fb5262f7a0616708baa +Author: Mark Wielaard +Date: Mon Mar 23 15:08:27 2015 +0100 + + backends: aarch64 can have _GLOBAL_OFFSET_TABLE_ point anywhere in .got. + + When building with relro aarch64 splits .got in a writable and read-only + part. _GLOBAL_OFFSET_TABLE_ points to the first writable symbol, not the + start of .got. + + https://bugzilla.redhat.com/show_bug.cgi?id=1201778 + + Signed-off-by: Mark Wielaard + +diff --git a/backends/aarch64_symbol.c b/backends/aarch64_symbol.c +index 3fdc9cf..76999e4 100644 +--- a/backends/aarch64_symbol.c ++++ b/backends/aarch64_symbol.c +@@ -1,5 +1,5 @@ + /* AArch64 specific symbolic name handling. +- Copyright (C) 2013 Red Hat, Inc. ++ Copyright (C) 2013, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -56,8 +56,11 @@ aarch64_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type) + } + } + +-/* If this is the _GLOBAL_OFFSET_TABLE_ symbol, then it should point to +- .got[0] even if there is a .got.plt section. */ ++/* If this is the _GLOBAL_OFFSET_TABLE_ symbol, then it should point in ++ the .got even if there is a .got.plt section. ++ https://sourceware.org/ml/libc-ports/2013-06/msg00057.html ++ https://bugzilla.redhat.com/show_bug.cgi?id=1201778 ++ */ + bool + aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym, + const char *name, const GElf_Shdr *destshdr) +@@ -66,7 +69,8 @@ aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym, + && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0) + { + const char *sname = elf_strptr (elf, ehdr->e_shstrndx, destshdr->sh_name); +- if (sname != NULL && strcmp (sname, ".got.plt") == 0) ++ if (sname != NULL ++ && (strcmp (sname, ".got") == 0 || strcmp (sname, ".got.plt") == 0)) + { + Elf_Scn *scn = NULL; + while ((scn = elf_nextscn (elf, scn)) != NULL) +@@ -77,7 +81,8 @@ aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym, + { + sname = elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name); + if (sname != NULL && strcmp (sname, ".got") == 0) +- return sym->st_value == shdr->sh_addr; ++ return (sym->st_value >= shdr->sh_addr ++ && sym->st_value < shdr->sh_addr + shdr->sh_size); + } + } + } diff --git a/elfutils.spec b/elfutils.spec index dc65d51..b5717a2 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.161 -%global baserelease 6 +%global baserelease 7 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -52,6 +52,7 @@ Patch3: elfutils-0.161-formref-type.patch # rhbz#1189928 - Consider sh_addralign 0 as 1 Patch4: elfutils-0.161-addralign.patch Patch5: elfutils-0.161-copyreloc.patch +Patch6: elfutils-0.161-aarch64relro.patch %if !%{compat} Release: %{baserelease}%{?dist} @@ -218,6 +219,7 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %patch3 -p1 -b .formref_type %patch4 -p1 -b .addralign %patch5 -p1 -b .copyreloc +%patch6 -p1 -b .aarch64relro find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -346,6 +348,9 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Mon Mar 23 2015 Mark Wielaard - 0.161-7 +- Add elfutils-0.161-aarch64relro.patch (#1201778) + * Mon Mar 09 2015 Mark Wielaard - 0.161-6 - Add elfutils-0.161-copyreloc.patch. From 832a74e9b901b44c468a8b93bffee2eb77795cc0 Mon Sep 17 00:00:00 2001 From: Kalev Lember Date: Sat, 2 May 2015 13:28:16 +0200 Subject: [PATCH 009/216] Rebuilt for GCC 5 C++11 ABI change --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index b5717a2..a480c16 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.161 -%global baserelease 7 +%global baserelease 8 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -348,6 +348,9 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Sat May 02 2015 Kalev Lember - 0.161-8 +- Rebuilt for GCC 5 C++11 ABI change + * Mon Mar 23 2015 Mark Wielaard - 0.161-7 - Add elfutils-0.161-aarch64relro.patch (#1201778) From aa0f506f6b5d5fe9a06e669fd360e106c53d7578 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 11 Jun 2015 14:15:51 +0200 Subject: [PATCH 010/216] 0.162-1 - Update to 0.162 (#1170810, #1139815, #1129756, #1020842) - Include elfutils/known-dwarf.h - Drop BuildRequires glibc-headers (#1230468) - Removed integrated upstream patches: - elfutils-0.161-aarch64relro.patch - elfutils-0.161-copyreloc.patch - elfutils-0.161-addralign.patch - elfutils-0.161-ar-long-name.patch - elfutils-0.161-formref-type.patch --- .gitignore | 1 + elfutils-0.161-aarch64relro.patch | 59 -- elfutils-0.161-addralign.patch | 53 -- elfutils-0.161-ar-long-name.patch | 51 -- elfutils-0.161-copyreloc.patch | 233 ----- elfutils-0.161-formref-type.patch | 24 - ....patch => elfutils-portability-0.162.patch | 809 +++++++++++------- elfutils.spec | 32 +- sources | 2 +- 9 files changed, 514 insertions(+), 750 deletions(-) delete mode 100644 elfutils-0.161-aarch64relro.patch delete mode 100644 elfutils-0.161-addralign.patch delete mode 100644 elfutils-0.161-ar-long-name.patch delete mode 100644 elfutils-0.161-copyreloc.patch delete mode 100644 elfutils-0.161-formref-type.patch rename elfutils-portability-0.161.patch => elfutils-portability-0.162.patch (72%) diff --git a/.gitignore b/.gitignore index 94469a7..c20acfc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /elfutils-0.159.tar.bz2 /elfutils-0.160.tar.bz2 /elfutils-0.161.tar.bz2 +/elfutils-0.162.tar.bz2 diff --git a/elfutils-0.161-aarch64relro.patch b/elfutils-0.161-aarch64relro.patch deleted file mode 100644 index fca9e00..0000000 --- a/elfutils-0.161-aarch64relro.patch +++ /dev/null @@ -1,59 +0,0 @@ -commit aea89f2c1ad1cfa2ddd09fb5262f7a0616708baa -Author: Mark Wielaard -Date: Mon Mar 23 15:08:27 2015 +0100 - - backends: aarch64 can have _GLOBAL_OFFSET_TABLE_ point anywhere in .got. - - When building with relro aarch64 splits .got in a writable and read-only - part. _GLOBAL_OFFSET_TABLE_ points to the first writable symbol, not the - start of .got. - - https://bugzilla.redhat.com/show_bug.cgi?id=1201778 - - Signed-off-by: Mark Wielaard - -diff --git a/backends/aarch64_symbol.c b/backends/aarch64_symbol.c -index 3fdc9cf..76999e4 100644 ---- a/backends/aarch64_symbol.c -+++ b/backends/aarch64_symbol.c -@@ -1,5 +1,5 @@ - /* AArch64 specific symbolic name handling. -- Copyright (C) 2013 Red Hat, Inc. -+ Copyright (C) 2013, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -56,8 +56,11 @@ aarch64_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type) - } - } - --/* If this is the _GLOBAL_OFFSET_TABLE_ symbol, then it should point to -- .got[0] even if there is a .got.plt section. */ -+/* If this is the _GLOBAL_OFFSET_TABLE_ symbol, then it should point in -+ the .got even if there is a .got.plt section. -+ https://sourceware.org/ml/libc-ports/2013-06/msg00057.html -+ https://bugzilla.redhat.com/show_bug.cgi?id=1201778 -+ */ - bool - aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym, - const char *name, const GElf_Shdr *destshdr) -@@ -66,7 +69,8 @@ aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym, - && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0) - { - const char *sname = elf_strptr (elf, ehdr->e_shstrndx, destshdr->sh_name); -- if (sname != NULL && strcmp (sname, ".got.plt") == 0) -+ if (sname != NULL -+ && (strcmp (sname, ".got") == 0 || strcmp (sname, ".got.plt") == 0)) - { - Elf_Scn *scn = NULL; - while ((scn = elf_nextscn (elf, scn)) != NULL) -@@ -77,7 +81,8 @@ aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym, - { - sname = elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name); - if (sname != NULL && strcmp (sname, ".got") == 0) -- return sym->st_value == shdr->sh_addr; -+ return (sym->st_value >= shdr->sh_addr -+ && sym->st_value < shdr->sh_addr + shdr->sh_size); - } - } - } diff --git a/elfutils-0.161-addralign.patch b/elfutils-0.161-addralign.patch deleted file mode 100644 index bbe1332..0000000 --- a/elfutils-0.161-addralign.patch +++ /dev/null @@ -1,53 +0,0 @@ -commit 6f5934c1afa8f34bfb8f86b191ded9af854e757f -Author: Jan Kratochvil -Date: Sat Feb 7 15:08:20 2015 +0100 - - libelf: Consider sh_addralign 0 as 1 - - Currently the Koji build for arm32 fails with: - extracting debug info from /builddir/build/BUILDROOT/etcd-2.0.0-0.3.rc1.fc22.arm/usr/bin/etcd - Failed to write file: invalid section alignment - - This is because the binary etcd - http://people.redhat.com/jkratoch/etcdctl.xz - contains: - Section Headers: - [Nr] Name Type Addr Off Size ES Flg Lk Inf Al - [11] .rel.plt REL 00459ee0 449ee0 000088 08 A 13 0 0 - ^ - which corresponds to golang's code: - go/src/cmd/ld/elf.c - case EM_X86_64: - sh = elfshname(".rela.plt"); - sh->addralign = RegSize; - default: - sh = elfshname(".rel.plt"); - - - ELF spec says: - Values 0 and 1 mean the section has no alignment constraints. - and libelf/elf32_updatenull.c really parses it that way at line 204 - ElfW2(LIBELFBITS,Word) sh_align = shdr->sh_addralign ?: 1; - but unfortunately the later line being patched no longer does. - - libelf/ - 2015-02-07 Jan Kratochvil - - * elf32_updatenull.c (__elfw2(LIBELFBITS,updatenull_wrlock)): Consider - sh_addralign 0 as 1. - - Signed-off-by: Jan Kratochvil - -diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c -index be4cea0..5e809b7 100644 ---- a/libelf/elf32_updatenull.c -+++ b/libelf/elf32_updatenull.c -@@ -328,7 +328,7 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum) - enough for the largest alignment required by a data - block. */ - if (unlikely (! powerof2 (shdr->sh_addralign)) -- || unlikely (shdr->sh_addralign < sh_align)) -+ || unlikely ((shdr->sh_addralign ?: 1) < sh_align)) - { - __libelf_seterrno (ELF_E_INVALID_ALIGN); - return -1; diff --git a/elfutils-0.161-ar-long-name.patch b/elfutils-0.161-ar-long-name.patch deleted file mode 100644 index 030efd9..0000000 --- a/elfutils-0.161-ar-long-name.patch +++ /dev/null @@ -1,51 +0,0 @@ -commit 147018e729e7c22eeabf15b82d26e4bf68a0d18e -Author: Alexander Cherepanov -Date: Sun Dec 28 19:57:19 2014 +0300 - - libelf: Fix dir traversal vuln in ar extraction. - - read_long_names terminates names at the first '/' found but then skips - one character without checking (it's supposed to be '\n'). Hence the - next name could start with any character including '/'. This leads to - a directory traversal vulnerability at the time the contents of the - archive is extracted. - - The danger is mitigated by the fact that only one '/' is possible in a - resulting filename and only in the leading position. Hence only files - in the root directory can be written via this vuln and only when ar is - executed as root. - - The fix for the vuln is to not skip any characters while looking - for '/'. - - Signed-off-by: Alexander Cherepanov - -diff --git a/libelf/ChangeLog b/libelf/ChangeLog -index 3b88d03..447c354 100644 ---- a/libelf/ChangeLog -+++ b/libelf/ChangeLog -@@ -1,3 +1,8 @@ -+2014-12-28 Alexander Cherepanov -+ -+ * elf_begin.c (read_long_names): Don't miss '/' right after -+ another '/'. Fixes a dir traversal vuln in ar extraction. -+ - 2014-12-18 Ulrich Drepper - - * Makefile.am: Suppress output of textrel_check command. -diff --git a/libelf/elf_begin.c b/libelf/elf_begin.c -index 30abe0b..cd3756c 100644 ---- a/libelf/elf_begin.c -+++ b/libelf/elf_begin.c -@@ -749,10 +749,7 @@ read_long_names (Elf *elf) - } - - /* NUL-terminate the string. */ -- *runp = '\0'; -- -- /* Skip the NUL byte and the \012. */ -- runp += 2; -+ *runp++ = '\0'; - - /* A sanity check. Somebody might have generated invalid - archive. */ diff --git a/elfutils-0.161-copyreloc.patch b/elfutils-0.161-copyreloc.patch deleted file mode 100644 index 551d35f..0000000 --- a/elfutils-0.161-copyreloc.patch +++ /dev/null @@ -1,233 +0,0 @@ -commit cc4e10fb398d40fb90e15056d808a596ef893cc3 -Author: Mark Wielaard -Date: Mon Mar 9 22:43:08 2015 +0100 - - backends: COPY relocations can also happen in ET_DYN. - - In particular COPY relocations might happen in PIE executables, - which are ET_DYN. - - Found on Fedora Rawhide with run-elflint-self.sh. - - Signed-off-by: Mark Wielaard - -diff --git a/backends/aarch64_reloc.def b/backends/aarch64_reloc.def -index 36d29e6..2e16e98 100644 ---- a/backends/aarch64_reloc.def -+++ b/backends/aarch64_reloc.def -@@ -1,5 +1,5 @@ - /* List the relocation types for AArch64. -*- C -*- -- Copyright (C) 2013, 2014 Red Hat, Inc. -+ Copyright (C) 2013, 2014, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -30,7 +30,7 @@ - - RELOC_TYPE (ABS64, REL|EXEC|DYN) - RELOC_TYPE (ABS32, REL|EXEC|DYN) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (GLOB_DAT, EXEC|DYN) - RELOC_TYPE (JUMP_SLOT, EXEC|DYN) - RELOC_TYPE (RELATIVE, EXEC|DYN) -diff --git a/backends/arm_reloc.def b/backends/arm_reloc.def -index 4b7894b..113648e 100644 ---- a/backends/arm_reloc.def -+++ b/backends/arm_reloc.def -@@ -1,5 +1,5 @@ - /* List the relocation types for arm. -*- C -*- -- Copyright (C) 2005-2010, 2014 Red Hat, Inc. -+ Copyright (C) 2005-2010, 2014, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -48,7 +48,7 @@ RELOC_TYPE (THM_XPC22, REL) - RELOC_TYPE (TLS_DTPMOD32, EXEC|DYN) - RELOC_TYPE (TLS_DTPOFF32, EXEC|DYN) - RELOC_TYPE (TLS_TPOFF32, EXEC|DYN) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (GLOB_DAT, EXEC|DYN) - RELOC_TYPE (JUMP_SLOT, EXEC|DYN) - RELOC_TYPE (RELATIVE, EXEC|DYN) -diff --git a/backends/i386_reloc.def b/backends/i386_reloc.def -index bd273b3..de3575d 100644 ---- a/backends/i386_reloc.def -+++ b/backends/i386_reloc.def -@@ -1,5 +1,5 @@ - /* List the relocation types for i386. -*- C -*- -- Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009 Red Hat, Inc. -+ Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -29,7 +29,7 @@ - /* NAME, REL|EXEC|DYN */ - - RELOC_TYPE (NONE, 0) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (32, REL|EXEC|DYN) - RELOC_TYPE (PC32, REL|EXEC|DYN) - RELOC_TYPE (GOT32, REL) -diff --git a/backends/ia64_reloc.def b/backends/ia64_reloc.def -index 9e058c8..2428925 100644 ---- a/backends/ia64_reloc.def -+++ b/backends/ia64_reloc.def -@@ -1,5 +1,5 @@ - /* List the relocation types for ia64. -*- C -*- -- Copyright (C) 2005, 2006 Red Hat, Inc. -+ Copyright (C) 2005, 2006, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -88,7 +88,7 @@ RELOC_TYPE (PCREL22, REL) - RELOC_TYPE (PCREL64I, REL) - RELOC_TYPE (IPLTMSB, REL|EXEC|DYN) - RELOC_TYPE (IPLTLSB, REL|EXEC|DYN) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (SUB, 0) - RELOC_TYPE (LTOFF22X, REL) - RELOC_TYPE (LDXMOV, REL) -diff --git a/backends/ppc64_reloc.def b/backends/ppc64_reloc.def -index 3a693cf..15a73ba 100644 ---- a/backends/ppc64_reloc.def -+++ b/backends/ppc64_reloc.def -@@ -1,5 +1,5 @@ - /* List the relocation types for ppc64. -*- C -*- -- Copyright (C) 2005 Red Hat, Inc. -+ Copyright (C) 2005, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -46,7 +46,7 @@ RELOC_TYPE (GOT16, REL) - RELOC_TYPE (GOT16_LO, REL) - RELOC_TYPE (GOT16_HI, REL) - RELOC_TYPE (GOT16_HA, REL) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (GLOB_DAT, EXEC|DYN) - RELOC_TYPE (JMP_SLOT, EXEC|DYN) - RELOC_TYPE (RELATIVE, EXEC|DYN) -diff --git a/backends/ppc_reloc.def b/backends/ppc_reloc.def -index dc963a0..3723a9c 100644 ---- a/backends/ppc_reloc.def -+++ b/backends/ppc_reloc.def -@@ -1,5 +1,5 @@ - /* List the relocation types for ppc. -*- C -*- -- Copyright (C) 2005 Red Hat, Inc. -+ Copyright (C) 2005, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -47,7 +47,7 @@ RELOC_TYPE (GOT16_LO, REL) - RELOC_TYPE (GOT16_HI, REL) - RELOC_TYPE (GOT16_HA, REL) - RELOC_TYPE (PLTREL24, REL) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (GLOB_DAT, EXEC|DYN) - RELOC_TYPE (JMP_SLOT, EXEC|DYN) - RELOC_TYPE (RELATIVE, EXEC|DYN) -diff --git a/backends/s390_reloc.def b/backends/s390_reloc.def -index b4686a3..cdef9eb 100644 ---- a/backends/s390_reloc.def -+++ b/backends/s390_reloc.def -@@ -1,5 +1,5 @@ - /* List the relocation types for s390. -*- C -*- -- Copyright (C) 2005, 2006 Red Hat, Inc. -+ Copyright (C) 2005, 2006, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -37,7 +37,7 @@ RELOC_TYPE (PC32, REL|EXEC|DYN) - RELOC_TYPE (GOT12, REL) - RELOC_TYPE (GOT32, REL) - RELOC_TYPE (PLT32, REL) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (GLOB_DAT, EXEC|DYN) - RELOC_TYPE (JMP_SLOT, EXEC|DYN) - RELOC_TYPE (RELATIVE, EXEC|DYN) -diff --git a/backends/sh_reloc.def b/backends/sh_reloc.def -index 66a5a9d..aded361 100644 ---- a/backends/sh_reloc.def -+++ b/backends/sh_reloc.def -@@ -1,5 +1,5 @@ - /* List the relocation types for SH. -*- C -*- -- Copyright (C) 2005 Red Hat, Inc. -+ Copyright (C) 2005, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -59,7 +59,7 @@ RELOC_TYPE (TLS_DTPOFF32, DYN) - RELOC_TYPE (TLS_TPOFF32, DYN) - RELOC_TYPE (GOT32, REL) - RELOC_TYPE (PLT32, REL) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (GLOB_DAT, EXEC|DYN) - RELOC_TYPE (JMP_SLOT, EXEC|DYN) - RELOC_TYPE (RELATIVE, EXEC|DYN) -diff --git a/backends/sparc_reloc.def b/backends/sparc_reloc.def -index c39b0fa..2aeb129 100644 ---- a/backends/sparc_reloc.def -+++ b/backends/sparc_reloc.def -@@ -1,5 +1,5 @@ - /* List the relocation types for sparc. -*- C -*- -- Copyright (C) 2009 Red Hat, Inc. -+ Copyright (C) 2009, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -47,7 +47,7 @@ RELOC_TYPE (GOT22, REL) - RELOC_TYPE (PC10, REL) - RELOC_TYPE (PC22, REL) - RELOC_TYPE (WPLT30, REL) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (GLOB_DAT, EXEC|DYN) - RELOC_TYPE (JMP_SLOT, EXEC|DYN) - RELOC_TYPE (RELATIVE, EXEC|DYN) -diff --git a/backends/tilegx_reloc.def b/backends/tilegx_reloc.def -index 9736286..1018110 100644 ---- a/backends/tilegx_reloc.def -+++ b/backends/tilegx_reloc.def -@@ -1,5 +1,6 @@ - /* List the relocation types for tilegx. -*- C -*- - Copyright (C) 2012 Tilera Corporation -+ Copyright (C) 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -44,7 +45,7 @@ RELOC_TYPE (HW3, REL) - RELOC_TYPE (HW0_LAST, REL) - RELOC_TYPE (HW1_LAST, REL) - RELOC_TYPE (HW2_LAST, REL) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (GLOB_DAT, EXEC|DYN) - RELOC_TYPE (JMP_SLOT, EXEC|DYN) - RELOC_TYPE (RELATIVE, EXEC|DYN) -diff --git a/backends/x86_64_reloc.def b/backends/x86_64_reloc.def -index 8ed98f6..ad84efa 100644 ---- a/backends/x86_64_reloc.def -+++ b/backends/x86_64_reloc.def -@@ -1,5 +1,5 @@ - /* List the relocation types for x86-64. -*- C -*- -- Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009 Red Hat, Inc. -+ Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009, 2015 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -33,7 +33,7 @@ RELOC_TYPE (64, REL|EXEC|DYN) - RELOC_TYPE (PC32, REL|EXEC|DYN) - RELOC_TYPE (GOT32, REL) - RELOC_TYPE (PLT32, REL) --RELOC_TYPE (COPY, EXEC) -+RELOC_TYPE (COPY, EXEC|DYN) - RELOC_TYPE (GLOB_DAT, EXEC|DYN) - RELOC_TYPE (JUMP_SLOT, EXEC|DYN) - RELOC_TYPE (RELATIVE, EXEC|DYN) diff --git a/elfutils-0.161-formref-type.patch b/elfutils-0.161-formref-type.patch deleted file mode 100644 index 6f11e17..0000000 --- a/elfutils-0.161-formref-type.patch +++ /dev/null @@ -1,24 +0,0 @@ -commit 7c71382294af69f075c891a3418906c842491e4c -Author: Jason P. Leasure -Date: Wed Jan 14 09:26:55 2015 -0500 - - libdw: fix offset for sig8 lookup in dwarf_formref_die - - The type_offset of a type unit header is relative to the beginning - of the type unit header. - - Signed-off-by: Jason P. Leasure - -diff --git a/libdw/dwarf_formref_die.c b/libdw/dwarf_formref_die.c -index 63f6697..8b92e22 100644 ---- a/libdw/dwarf_formref_die.c -+++ b/libdw/dwarf_formref_die.c -@@ -95,7 +95,7 @@ dwarf_formref_die (attr, result) - - datap = cu->dbg->sectiondata[IDX_debug_types]->d_buf; - size = cu->dbg->sectiondata[IDX_debug_types]->d_size; -- offset = cu->type_offset; -+ offset = cu->start + cu->type_offset; - } - else - { diff --git a/elfutils-portability-0.161.patch b/elfutils-portability-0.162.patch similarity index 72% rename from elfutils-portability-0.161.patch rename to elfutils-portability-0.162.patch index 7539f8b..d81334c 100644 --- a/elfutils-portability-0.161.patch +++ b/elfutils-portability-0.162.patch @@ -1,6 +1,6 @@ --- elfutils/backends/ChangeLog +++ elfutils/backends/ChangeLog -@@ -433,6 +433,10 @@ +@@ -498,6 +498,10 @@ * ppc_attrs.c (ppc_check_object_attribute): Handle tag GNU_Power_ABI_Struct_Return. @@ -11,7 +11,7 @@ 2008-10-04 Ulrich Drepper * i386_reloc.def: Fix entries for TLS_GOTDESC, TLS_DESC_CALL, and -@@ -760,6 +764,11 @@ +@@ -825,6 +829,11 @@ * sparc_init.c: Likewise. * x86_64_init.c: Likewise. @@ -23,7 +23,7 @@ 2005-11-19 Roland McGrath * ppc64_reloc.def: REL30 -> ADDR30. -@@ -782,6 +791,9 @@ +@@ -847,6 +856,9 @@ * Makefile.am (uninstall): Don't try to remove $(pkgincludedir). (CLEANFILES): Add libebl_$(m).so. @@ -46,15 +46,17 @@ libebl_i386.so: $(cpu_i386) --- elfutils/backends/Makefile.in +++ elfutils/backends/Makefile.in -@@ -83,6 +83,7 @@ host_triplet = @host@ +@@ -83,7 +83,8 @@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ $(noinst_HEADERS) ChangeLog +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING subdir = backends ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -285,6 +286,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -289,6 +290,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -62,7 +64,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -316,6 +318,7 @@ SHELL = @SHELL@ +@@ -320,6 +322,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -70,24 +72,29 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -378,11 +381,11 @@ zip_LIBS = @zip_LIBS@ - AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \ - -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \ - -I$(top_srcdir)/libelf -I$(top_srcdir)/libdw +@@ -387,14 +390,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr + + # Warn about stack usage of more than 256K = 262144 bytes. + @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ - $(if $($(*F)_no_Werror),,-Werror) \ - $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ +- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ - $($(*F)_CFLAGS) - +AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ + $($(*F)_no_Werror),,-Werror) $(if \ + $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ -+ $(am__append_1) ++ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ ++ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ ++ $($(*F)_CFLAGS) $(am__append_1) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +-DEFS.os = -DPIC -DSHARED $(am__append_1) ++DEFS.os = -DPIC -DSHARED $(am__append_2) CLEANFILES = *.gcno *.gcda $(foreach m,$(modules), libebl_$(m).map \ libebl_$(m).so $(am_libebl_$(m)_pic_a_OBJECTS)) -@@ -888,7 +891,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a + textrel_msg = echo "WARNING: TEXTREL found in '$@'" +@@ -900,7 +903,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a $(LINK) -shared -o $(@:.map=.so) \ -Wl,--whole-archive $< $(cpu_$*) -Wl,--no-whole-archive \ -Wl,--version-script,$(@:.so=.map) \ @@ -98,7 +105,7 @@ libebl_i386.so: $(cpu_i386) --- elfutils/ChangeLog +++ elfutils/ChangeLog -@@ -187,6 +187,8 @@ +@@ -253,6 +253,8 @@ 2012-01-24 Mark Wielaard @@ -107,7 +114,7 @@ * COPYING: Fix address. Updated version from gnulib. 2012-01-23 Mark Wielaard -@@ -205,6 +207,9 @@ +@@ -271,6 +273,9 @@ 2011-10-08 Mike Frysinger @@ -117,7 +124,7 @@ * configure.ac: Fix use of AC_ARG_ENABLE to handle $enableval correctly. 2011-10-02 Ulrich Drepper -@@ -226,6 +231,10 @@ +@@ -292,6 +297,10 @@ * configure.ac (LOCALEDIR, DATADIRNAME): Removed. @@ -128,7 +135,7 @@ 2009-09-21 Ulrich Drepper * configure.ac: Update for more modern autoconf. -@@ -234,6 +243,10 @@ +@@ -300,6 +309,10 @@ * configure.ac (zip_LIBS): Check for liblzma too. @@ -139,7 +146,7 @@ 2009-04-19 Roland McGrath * configure.ac (eu_version): Round down here, not in version.h macros. -@@ -245,6 +258,8 @@ +@@ -311,6 +324,8 @@ 2009-01-23 Roland McGrath @@ -148,7 +155,7 @@ * configure.ac (zlib check): Check for gzdirect, need zlib >= 1.2.2.3. * configure.ac (__thread check): Use AC_LINK_IFELSE, in case of -@@ -325,6 +340,10 @@ +@@ -391,6 +406,10 @@ * configure.ac: Add dummy automake conditional to get dependencies for non-generic linker right. See src/Makefile.am. @@ -159,7 +166,7 @@ 2005-11-18 Roland McGrath * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): New variable. -@@ -372,6 +391,17 @@ +@@ -438,6 +457,17 @@ * Makefile.am (all_SUBDIRS): Add libdwfl. * configure.ac: Write libdwfl/Makefile. @@ -179,7 +186,7 @@ * configure.ac [AH_BOTTOM] (INTDECL, _INTDECL): New macros. --- elfutils/config/ChangeLog +++ elfutils/config/ChangeLog -@@ -71,6 +71,10 @@ +@@ -106,6 +106,10 @@ * known-dwarf.awk: Use gawk. @@ -200,7 +207,7 @@ ## ## This file is part of elfutils. ## -@@ -29,13 +29,21 @@ +@@ -29,6 +29,9 @@ ## not, see . ## @@ -209,12 +216,18 @@ + DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"' AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. + +@@ -38,12 +41,17 @@ STACK_USAGE_WARNING=-Wstack-usage=262144 + else + STACK_USAGE_WARNING= + endif -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ +AM_CFLAGS = -std=gnu99 -Wall -Wshadow \ $(if $($(*F)_no_Werror),,-Werror) \ - $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ + $(if $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) \ + $(if $($(*F)_no_Wformat),-Wno-format,-Wformat=2) \ + $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ $($(*F)_CFLAGS) +if BUILD_WERROR @@ -223,10 +236,10 @@ + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) - %.os: %.c %.o + DEFS.os = -DPIC -DSHARED --- elfutils/config/Makefile.in +++ elfutils/config/Makefile.in -@@ -147,6 +147,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -150,6 +150,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -234,7 +247,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -178,6 +179,7 @@ SHELL = @SHELL@ +@@ -181,6 +182,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -244,17 +257,20 @@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ --- elfutils/config.h.in +++ elfutils/config.h.in -@@ -3,6 +3,9 @@ +@@ -6,6 +6,12 @@ /* Should ar and ranlib use -D behavior by default? */ #undef DEFAULT_AR_DETERMINISTIC +/* Have __builtin_popcount. */ +#undef HAVE_BUILTIN_POPCOUNT ++ ++/* Define to 1 if you have the `futimens' function. */ ++#undef HAVE_FUTIMENS + /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H -@@ -102,4 +105,7 @@ +@@ -105,4 +111,7 @@ /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES @@ -264,7 +280,7 @@ #include --- elfutils/configure +++ elfutils/configure -@@ -663,6 +663,8 @@ ZLIB_TRUE +@@ -672,6 +672,8 @@ ZLIB_TRUE LIBEBL_SUBDIR TESTS_RPATH_FALSE TESTS_RPATH_TRUE @@ -273,7 +289,7 @@ BUILD_STATIC_FALSE BUILD_STATIC_TRUE USE_VALGRIND_FALSE -@@ -678,6 +680,8 @@ NEVER_TRUE +@@ -687,6 +689,8 @@ NEVER_TRUE base_cpu NATIVE_LD_FALSE NATIVE_LD_TRUE @@ -282,24 +298,117 @@ NM READELF ac_ct_AR -@@ -798,6 +802,7 @@ enable_debugpred - enable_gprof +@@ -807,6 +811,7 @@ enable_gprof enable_gcov + enable_sanitize_undefined enable_valgrind +enable_werror enable_tests_rpath enable_libebl_subdir with_zlib -@@ -1455,6 +1460,7 @@ Optional Features: - --enable-gprof build binaries with gprof support - --enable-gcov build binaries with gcov support +@@ -1467,6 +1472,7 @@ Optional Features: + --enable-sanitize-undefined + Use gcc undefined behaviour sanitizer --enable-valgrind run all tests under valgrind + --disable-werror do not build with -Werror --enable-tests-rpath build $ORIGIN-using rpath into tests --enable-libebl-subdir=DIR install libebl_CPU modules in $(libdir)/DIR -@@ -4843,6 +4849,130 @@ if test "x$ac_cv_c99" != xyes; then : - as_fn_error $? "gcc with C99 support required" "$LINENO" 5 +@@ -1665,6 +1671,73 @@ fi + + } # ac_fn_c_try_link + ++# ac_fn_c_check_func LINENO FUNC VAR ++# ---------------------------------- ++# Tests whether FUNC exists, setting the cache variable VAR accordingly ++ac_fn_c_check_func () ++{ ++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 ++$as_echo_n "checking for $2... " >&6; } ++if eval \${$3+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++/* Define $2 to an innocuous variant, in case declares $2. ++ For example, HP-UX 11i declares gettimeofday. */ ++#define $2 innocuous_$2 ++ ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $2 (); below. ++ Prefer to if __STDC__ is defined, since ++ exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include ++#else ++# include ++#endif ++ ++#undef $2 ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char $2 (); ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined __stub_$2 || defined __stub___$2 ++choke me ++#endif ++ ++int ++main () ++{ ++return $2 (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ eval "$3=yes" ++else ++ eval "$3=no" ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++eval ac_res=\$$3 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++$as_echo "$ac_res" >&6; } ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ++ ++} # ac_fn_c_check_func ++ + # ac_fn_c_try_run LINENO + # ---------------------- + # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +@@ -4824,6 +4897,18 @@ else + fi + + ++for ac_func in futimens ++do : ++ ac_fn_c_check_func "$LINENO" "futimens" "ac_cv_func_futimens" ++if test "x$ac_cv_func_futimens" = xyes; then : ++ cat >>confdefs.h <<_ACEOF ++#define HAVE_FUTIMENS 1 ++_ACEOF ++ ++fi ++done ++ ++ + # We use -std=gnu99 but have explicit checks for some language constructs + # and GNU extensions since some compilers claim GNU99 support, but don't + # really support all language extensions. In particular we need +@@ -4872,6 +4957,130 @@ if test "x$ac_cv_c99" != xyes; then : + as_fn_error $? "gcc with GNU99 support required" "$LINENO" 5 fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Wextra option to $CC" >&5 @@ -429,7 +538,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __thread support" >&5 $as_echo_n "checking for __thread support... " >&6; } if ${ac_cv_tls+:} false; then : -@@ -4879,7 +5009,13 @@ fi +@@ -4909,7 +5118,13 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 $as_echo "$ac_cv_tls" >&6; } if test "x$ac_cv_tls" != xyes; then : @@ -444,7 +553,7 @@ fi # Check whether --enable-largefile was given. -@@ -5246,6 +5382,22 @@ else +@@ -5317,6 +5532,22 @@ else fi @@ -467,16 +576,16 @@ # Check whether --enable-tests-rpath was given. if test "${enable_tests_rpath+set}" = set; then : enableval=$enable_tests_rpath; tests_use_rpath=$enableval -@@ -5983,7 +6135,7 @@ case "$eu_version" in +@@ -6198,7 +6429,7 @@ case "$eu_version" in esac # Round up to the next release API (x.y) version. -eu_version=$(( (eu_version + 999) / 1000 )) +eu_version=`expr \( $eu_version + 999 \) / 1000` - ac_ext=c - ac_cpp='$CPP $CPPFLAGS' -@@ -6729,6 +6881,10 @@ if test -z "${BUILD_STATIC_TRUE}" && tes + MODVERSION="Build for ${LIBEBL_SUBDIR} ${eu_version} ${ac_cv_build}" + +@@ -7087,6 +7318,10 @@ if test -z "${BUILD_STATIC_TRUE}" && tes as_fn_error $? "conditional \"BUILD_STATIC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi @@ -489,9 +598,18 @@ Usually this means the macro was only invoked conditionally." "$LINENO" 5 --- elfutils/configure.ac +++ elfutils/configure.ac -@@ -89,6 +89,54 @@ CFLAGS="$old_CFLAGS"]) +@@ -73,6 +73,8 @@ m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) + AC_CHECK_TOOL([READELF], [readelf]) + AC_CHECK_TOOL([NM], [nm]) + ++AC_CHECK_FUNCS([futimens]) ++ + # We use -std=gnu99 but have explicit checks for some language constructs + # and GNU extensions since some compilers claim GNU99 support, but don't + # really support all language extensions. In particular we need +@@ -106,6 +108,54 @@ CFLAGS="$old_CFLAGS"]) AS_IF([test "x$ac_cv_c99" != xyes], - AC_MSG_ERROR([gcc with C99 support required])) + AC_MSG_ERROR([gcc with GNU99 support required])) +AC_CACHE_CHECK([for -Wextra option to $CC], ac_cv_cc_wextra, [dnl +old_CFLAGS="$CFLAGS" @@ -544,7 +662,7 @@ AC_CACHE_CHECK([for __thread support], ac_cv_tls, [dnl # Use the same flags that we use for our DSOs, so the test is representative. # Some old compiler/linker/libc combinations fail some ways and not others. -@@ -104,7 +152,10 @@ static __thread int a; int foo (int b) { +@@ -122,7 +172,10 @@ static __thread int a; int foo (int b) { CFLAGS="$save_CFLAGS" LDFLAGS="$save_LDFLAGS"]) AS_IF([test "x$ac_cv_tls" != xyes], @@ -556,7 +674,7 @@ dnl This test must come as early as possible after the compiler configuration dnl tests, because the choice of the file model can (in principle) affect -@@ -183,6 +234,11 @@ AM_CONDITIONAL(USE_VALGRIND, test "$use_ +@@ -224,6 +277,11 @@ AM_CONDITIONAL(USE_VALGRIND, test "$use_ AM_CONDITIONAL(BUILD_STATIC, [dnl test "$use_gprof" = yes -o "$use_gcov" = yes]) @@ -568,18 +686,18 @@ AC_ARG_ENABLE([tests-rpath], AS_HELP_STRING([--enable-tests-rpath],[build $ORIGIN-using rpath into tests]), [tests_use_rpath=$enableval], [tests_use_rpath=no]) -@@ -302,7 +358,7 @@ case "$eu_version" in +@@ -388,7 +446,7 @@ case "$eu_version" in esac # Round up to the next release API (x.y) version. -eu_version=$(( (eu_version + 999) / 1000 )) +eu_version=`expr \( $eu_version + 999 \) / 1000` - AC_CHECK_SIZEOF(long) - + dnl Unique ID for this build. + MODVERSION="Build for ${LIBEBL_SUBDIR} ${eu_version} ${ac_cv_build}" --- elfutils/lib/ChangeLog +++ elfutils/lib/ChangeLog -@@ -65,6 +65,9 @@ +@@ -73,6 +73,9 @@ 2009-01-23 Roland McGrath @@ -589,7 +707,7 @@ * eu-config.h: Add multiple inclusion protection. 2009-01-17 Ulrich Drepper -@@ -121,6 +124,11 @@ +@@ -129,6 +132,11 @@ * Makefile.am (libeu_a_SOURCES): Add it. * system.h: Declare crc32_file. @@ -603,7 +721,7 @@ * Makefile.am: Use -ffunction-sections for xmalloc.c. --- elfutils/lib/eu-config.h +++ elfutils/lib/eu-config.h -@@ -162,6 +162,17 @@ asm (".section predict_data, \"aw\"; .pr +@@ -163,6 +163,17 @@ asm (".section predict_data, \"aw\"; .pr /* This macro is used by the tests conditionalize for standalone building. */ #define ELFUTILS_HEADER(name) @@ -619,19 +737,21 @@ +#endif /* HAVE_BUILTIN_POPCOUNT */ + - #ifdef SHARED + #ifdef SYMBOL_VERSIONING # define OLD_VERSION(name, version) \ --- elfutils/lib/Makefile.in +++ elfutils/lib/Makefile.in -@@ -82,6 +82,7 @@ host_triplet = @host@ +@@ -82,7 +82,8 @@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ $(noinst_HEADERS) ChangeLog +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING subdir = lib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -197,6 +198,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -201,6 +202,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -639,7 +759,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -228,6 +230,7 @@ SHELL = @SHELL@ +@@ -232,6 +234,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -647,20 +767,25 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -289,9 +292,11 @@ top_srcdir = @top_srcdir@ - zip_LIBS = @zip_LIBS@ - AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \ - -I$(srcdir)/../libelf +@@ -298,13 +301,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr + + # Warn about stack usage of more than 256K = 262144 bytes. + @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \ +AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ $($(*F)_no_Werror),,-Werror) $(if \ -- $($(*F)_no_Wunused),,-Wunused -Wextra) $($(*F)_CFLAGS) -fpic +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ + $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ -+ $(am__append_1) -fpic ++ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ + $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ +- $($(*F)_CFLAGS) -fpic ++ $($(*F)_CFLAGS) $(am__append_1) -fpic COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +-DEFS.os = -DPIC -DSHARED $(am__append_1) ++DEFS.os = -DPIC -DSHARED $(am__append_2) CLEANFILES = *.gcno *.gcda textrel_msg = echo "WARNING: TEXTREL found in '$@'" + @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) --- elfutils/libasm/ChangeLog +++ elfutils/libasm/ChangeLog @@ -87,6 +87,11 @@ @@ -677,18 +802,20 @@ * Makefile.am (AM_CFLAGS): Add -Wunused -Wextra -Wformat=2. --- elfutils/libasm/Makefile.in +++ elfutils/libasm/Makefile.in -@@ -83,8 +83,9 @@ host_triplet = @host@ +@@ -83,9 +83,10 @@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING noinst_PROGRAMS = $(am__EXEEXT_1) --@USE_LOCKS_TRUE@am__append_1 = -lpthread -+@USE_LOCKS_TRUE@am__append_2 = -lpthread +-@USE_LOCKS_TRUE@am__append_2 = -lpthread ++@USE_LOCKS_TRUE@am__append_3 = -lpthread subdir = libasm ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -248,6 +249,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -252,6 +253,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -696,7 +823,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -279,6 +281,7 @@ SHELL = @SHELL@ +@@ -283,6 +285,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -704,29 +831,34 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -341,11 +344,11 @@ zip_LIBS = @zip_LIBS@ - AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \ - -I$(top_srcdir)/libelf -I$(top_srcdir)/libebl \ - -I$(top_srcdir)/libdw +@@ -350,14 +353,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr + + # Warn about stack usage of more than 256K = 262144 bytes. + @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ - $(if $($(*F)_no_Werror),,-Werror) \ - $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ +- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ - $($(*F)_CFLAGS) - +AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ + $($(*F)_no_Werror),,-Werror) $(if \ + $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ -+ $(am__append_1) ++ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ ++ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ ++ $($(*F)_CFLAGS) $(am__append_1) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +-DEFS.os = -DPIC -DSHARED $(am__append_1) ++DEFS.os = -DPIC -DSHARED $(am__append_2) CLEANFILES = *.gcno *.gcda $(am_libasm_pic_a_OBJECTS) \ libasm.so.$(VERSION) -@@ -373,7 +376,7 @@ libasm_a_SOURCES = asm_begin.c asm_abort + textrel_msg = echo "WARNING: TEXTREL found in '$@'" +@@ -384,7 +387,7 @@ libasm_a_SOURCES = asm_begin.c asm_abort libasm_pic_a_SOURCES = am_libasm_pic_a_OBJECTS = $(libasm_a_SOURCES:.c=.os) --libasm_so_LDLIBS = $(am__append_1) -+libasm_so_LDLIBS = $(am__append_2) +-libasm_so_LDLIBS = $(am__append_2) ++libasm_so_LDLIBS = $(am__append_3) libasm_so_SOURCES = noinst_HEADERS = libasmP.h symbolhash.h EXTRA_DIST = libasm.map @@ -766,15 +898,17 @@ else --- elfutils/libcpu/Makefile.in +++ elfutils/libcpu/Makefile.in -@@ -84,6 +84,7 @@ DIST_COMMON = $(top_srcdir)/config/eu.am +@@ -84,7 +84,8 @@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.am i386_lex.c i386_parse.c \ $(top_srcdir)/config/depcomp $(top_srcdir)/config/ylwrap \ $(am__noinst_HEADERS_DIST) ChangeLog +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING @MAINTAINER_MODE_TRUE@noinst_PROGRAMS = i386_gendis$(EXEEXT) subdir = libcpu ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -@@ -223,6 +224,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -227,6 +228,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -782,7 +916,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = lex.$( * libdw.h (dwarf_offdie): Fix documentation to mention .debug_info. -@@ -1076,6 +1080,10 @@ +@@ -1248,6 +1252,10 @@ * dwarf_hasattr_integrate.c: Integrate DW_AT_specification too. @@ -829,7 +967,7 @@ 2009-08-10 Roland McGrath * dwarf_getscopevar.c: Use dwarf_diename. -@@ -1844,6 +1852,11 @@ +@@ -2016,6 +2024,11 @@ 2005-05-31 Roland McGrath @@ -860,7 +998,7 @@ #endif --- elfutils/libdw/libdw.h +++ elfutils/libdw/libdw.h -@@ -1003,7 +1003,7 @@ extern Dwarf_OOM dwarf_new_oom_handler ( +@@ -1004,7 +1004,7 @@ extern Dwarf_OOM dwarf_new_oom_handler ( /* Inline optimizations. */ @@ -871,17 +1009,19 @@ dwarf_whatattr (Dwarf_Attribute *attr) --- elfutils/libdw/Makefile.in +++ elfutils/libdw/Makefile.in -@@ -84,7 +84,8 @@ DIST_COMMON = $(top_srcdir)/config/eu.am +@@ -84,8 +84,9 @@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ $(include_HEADERS) $(noinst_HEADERS) $(pkginclude_HEADERS) \ ChangeLog --@BUILD_STATIC_TRUE@am__append_1 = -fpic +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +-@BUILD_STATIC_TRUE@am__append_2 = -fpic +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@BUILD_STATIC_TRUE@am__append_2 = -fpic ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING ++@BUILD_STATIC_TRUE@am__append_3 = -fpic noinst_PROGRAMS = $(am__EXEEXT_1) subdir = libdw ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -@@ -298,6 +299,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -302,6 +303,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -889,7 +1029,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -329,6 +331,7 @@ SHELL = @SHELL@ +@@ -333,6 +335,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -897,32 +1037,38 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -390,10 +393,11 @@ top_srcdir = @top_srcdir@ - zip_LIBS = @zip_LIBS@ - AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \ - -I$(srcdir)/../libelf +@@ -399,13 +402,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr + + # Warn about stack usage of more than 256K = 262144 bytes. + @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \ +AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ $($(*F)_no_Werror),,-Werror) $(if \ -- $($(*F)_no_Wunused),,-Wunused -Wextra) $($(*F)_CFLAGS) \ -- $(am__append_1) +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ + $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ -+ $(am__append_1) $(am__append_2) ++ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ + $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ +- $($(*F)_CFLAGS) $(am__append_2) ++ $($(*F)_CFLAGS) $(am__append_1) $(am__append_3) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +-DEFS.os = -DPIC -DSHARED $(am__append_1) ++DEFS.os = -DPIC -DSHARED $(am__append_2) CLEANFILES = *.gcno *.gcda textrel_msg = echo "WARNING: TEXTREL found in '$@'" + @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) --- elfutils/libdwelf/Makefile.in +++ elfutils/libdwelf/Makefile.in -@@ -82,6 +82,7 @@ host_triplet = @host@ +@@ -82,7 +82,8 @@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING subdir = libdwelf ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -227,6 +228,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -231,6 +232,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -930,7 +1076,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -258,6 +260,7 @@ SHELL = @SHELL@ +@@ -262,6 +264,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -938,26 +1084,31 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -320,11 +323,11 @@ zip_LIBS = @zip_LIBS@ - AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \ - -I$(srcdir)/../libelf -I$(srcdir)/../libdw \ - -I$(srcdir)/../libdwfl -I$(srcdir)/../libebl +@@ -329,14 +332,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr + + # Warn about stack usage of more than 256K = 262144 bytes. + @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ - $(if $($(*F)_no_Werror),,-Werror) \ - $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ +- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ - $($(*F)_CFLAGS) - +AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ + $($(*F)_no_Werror),,-Werror) $(if \ + $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ -+ $(am__append_1) ++ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ ++ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ ++ $($(*F)_CFLAGS) $(am__append_1) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +-DEFS.os = -DPIC -DSHARED $(am__append_1) ++DEFS.os = -DPIC -DSHARED $(am__append_2) CLEANFILES = *.gcno *.gcda $(am_libdwelf_pic_a_OBJECTS) textrel_msg = echo "WARNING: TEXTREL found in '$@'" + @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) --- elfutils/libdwfl/ChangeLog +++ elfutils/libdwfl/ChangeLog -@@ -571,6 +571,21 @@ +@@ -704,6 +704,21 @@ (dwfl_module_addrsym) (i_to_symfile): New function. (dwfl_module_addrsym) (search_table): Use it. @@ -979,7 +1130,7 @@ 2013-11-07 Jan Kratochvil Mark Wielaard -@@ -2336,6 +2351,11 @@ +@@ -2469,6 +2484,11 @@ 2005-07-21 Roland McGrath @@ -1061,21 +1212,23 @@ static void --- elfutils/libdwfl/Makefile.in +++ elfutils/libdwfl/Makefile.in -@@ -82,9 +82,10 @@ host_triplet = @host@ +@@ -82,10 +82,11 @@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog --@ZLIB_TRUE@am__append_1 = gzip.c --@BZLIB_TRUE@am__append_2 = bzip2.c --@LZMA_TRUE@am__append_3 = lzma.c +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +-@ZLIB_TRUE@am__append_2 = gzip.c +-@BZLIB_TRUE@am__append_3 = bzip2.c +-@LZMA_TRUE@am__append_4 = lzma.c +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@ZLIB_TRUE@am__append_2 = gzip.c -+@BZLIB_TRUE@am__append_3 = bzip2.c -+@LZMA_TRUE@am__append_4 = lzma.c ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING ++@ZLIB_TRUE@am__append_3 = gzip.c ++@BZLIB_TRUE@am__append_4 = bzip2.c ++@LZMA_TRUE@am__append_5 = lzma.c subdir = libdwfl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -286,6 +287,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -290,6 +291,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1083,7 +1236,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -317,6 +319,7 @@ SHELL = @SHELL@ +@@ -321,6 +323,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -1091,37 +1244,42 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -379,11 +382,11 @@ zip_LIBS = @zip_LIBS@ - AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. -I$(srcdir) \ - -I$(srcdir)/../libelf -I$(srcdir)/../libebl \ - -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf +@@ -388,14 +391,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr + + # Warn about stack usage of more than 256K = 262144 bytes. + @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ - $(if $($(*F)_no_Werror),,-Werror) \ - $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ +- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ - $($(*F)_CFLAGS) - +AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ + $($(*F)_no_Werror),,-Werror) $(if \ + $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ -+ $(am__append_1) ++ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ ++ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ ++ $($(*F)_CFLAGS) $(am__append_1) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +-DEFS.os = -DPIC -DSHARED $(am__append_1) ++DEFS.os = -DPIC -DSHARED $(am__append_2) CLEANFILES = *.gcno *.gcda $(am_libdwfl_pic_a_OBJECTS) textrel_msg = echo "WARNING: TEXTREL found in '$@'" -@@ -413,8 +416,8 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_en + @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) +@@ -424,8 +427,8 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_en dwfl_module_register_names.c dwfl_segment_report_module.c \ link_map.c core-file.c open.c image-header.c dwfl_frame.c \ frame_unwind.c dwfl_frame_pc.c linux-pid-attach.c \ -- linux-core-attach.c dwfl_frame_regs.c $(am__append_1) \ -- $(am__append_2) $(am__append_3) -+ linux-core-attach.c dwfl_frame_regs.c $(am__append_2) \ -+ $(am__append_3) $(am__append_4) +- linux-core-attach.c dwfl_frame_regs.c $(am__append_2) \ +- $(am__append_3) $(am__append_4) ++ linux-core-attach.c dwfl_frame_regs.c $(am__append_3) \ ++ $(am__append_4) $(am__append_5) libdwfl = $(libdw) libdw = ../libdw/libdw.so libelf = ../libelf/libelf.so --- elfutils/libebl/ChangeLog +++ elfutils/libebl/ChangeLog -@@ -765,6 +765,11 @@ +@@ -780,6 +780,11 @@ * Makefile.am (libebl_*_so_SOURCES): Set to $(*_SRCS) so dependency tracking works right. @@ -1135,15 +1293,17 @@ * libebl_x86_64.map: Add x86_64_core_note. --- elfutils/libebl/Makefile.in +++ elfutils/libebl/Makefile.in -@@ -82,6 +82,7 @@ host_triplet = @host@ +@@ -82,7 +82,8 @@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING subdir = libebl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -249,6 +250,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -253,6 +254,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1151,7 +1311,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -280,6 +282,7 @@ SHELL = @SHELL@ +@@ -284,6 +286,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -1159,23 +1319,28 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -342,9 +345,11 @@ zip_LIBS = @zip_LIBS@ - AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \ - -I$(srcdir)/../libelf -I$(srcdir)/../libdw \ - -I$(srcdir)/../libasm +@@ -351,13 +354,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr + + # Warn about stack usage of more than 256K = 262144 bytes. + @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \ +AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ $($(*F)_no_Werror),,-Werror) $(if \ -- $($(*F)_no_Wunused),,-Wunused -Wextra) $($(*F)_CFLAGS) -fpic +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ + $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ -+ $(am__append_1) -fpic ++ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ + $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ +- $($(*F)_CFLAGS) -fpic ++ $($(*F)_CFLAGS) $(am__append_1) -fpic COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +-DEFS.os = -DPIC -DSHARED $(am__append_1) ++DEFS.os = -DPIC -DSHARED $(am__append_2) CLEANFILES = *.gcno *.gcda $(am_libebl_pic_a_OBJECTS) textrel_msg = echo "WARNING: TEXTREL found in '$@'" + @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) --- elfutils/libelf/ChangeLog +++ elfutils/libelf/ChangeLog -@@ -244,6 +244,11 @@ +@@ -398,6 +398,11 @@ * elf-knowledge.h (SECTION_STRIP_P): Remove < SHT_NUM check. @@ -1187,7 +1352,7 @@ 2011-02-26 Mark Wielaard * elf_end.c (elf_end): Call rwlock_unlock before rwlock_fini. -@@ -921,6 +926,11 @@ +@@ -1075,6 +1080,11 @@ * elf.h: Update from glibc. @@ -1241,20 +1406,22 @@ } --- elfutils/libelf/Makefile.in +++ elfutils/libelf/Makefile.in -@@ -84,9 +84,10 @@ DIST_COMMON = $(top_srcdir)/config/eu.am +@@ -84,10 +84,11 @@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ $(include_HEADERS) $(noinst_HEADERS) $(pkginclude_HEADERS) \ ChangeLog --@BUILD_STATIC_TRUE@am__append_1 = -fpic +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +-@BUILD_STATIC_TRUE@am__append_2 = -fpic +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@BUILD_STATIC_TRUE@am__append_2 = -fpic ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING ++@BUILD_STATIC_TRUE@am__append_3 = -fpic noinst_PROGRAMS = $(am__EXEEXT_1) --@USE_LOCKS_TRUE@am__append_2 = -lpthread -+@USE_LOCKS_TRUE@am__append_3 = -lpthread +-@USE_LOCKS_TRUE@am__append_3 = -lpthread ++@USE_LOCKS_TRUE@am__append_4 = -lpthread subdir = libelf ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -291,6 +292,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -295,6 +296,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1262,7 +1429,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -322,6 +324,7 @@ SHELL = @SHELL@ +@@ -326,6 +328,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -1270,33 +1437,37 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -382,10 +385,11 @@ top_builddir = @top_builddir@ - top_srcdir = @top_srcdir@ - zip_LIBS = @zip_LIBS@ - AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. +@@ -391,13 +394,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr + + # Warn about stack usage of more than 256K = 262144 bytes. + @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \ +AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ $($(*F)_no_Werror),,-Werror) $(if \ -- $($(*F)_no_Wunused),,-Wunused -Wextra) $($(*F)_CFLAGS) \ -- $(am__append_1) +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ + $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ -+ $(am__append_1) $(am__append_2) ++ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ + $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ +- $($(*F)_CFLAGS) $(am__append_2) ++ $($(*F)_CFLAGS) $(am__append_1) $(am__append_3) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +-DEFS.os = -DPIC -DSHARED $(am__append_1) ++DEFS.os = -DPIC -DSHARED $(am__append_2) CLEANFILES = *.gcno *.gcda $(am_libelf_pic_a_OBJECTS) \ libelf.so.$(VERSION) -@@ -449,7 +453,7 @@ libelf_a_SOURCES = elf_version.c elf_has + textrel_msg = echo "WARNING: TEXTREL found in '$@'" +@@ -460,7 +464,7 @@ libelf_a_SOURCES = elf_version.c elf_has libelf_pic_a_SOURCES = am_libelf_pic_a_OBJECTS = $(libelf_a_SOURCES:.c=.os) --libelf_so_LDLIBS = $(am__append_2) -+libelf_so_LDLIBS = $(am__append_3) +-libelf_so_LDLIBS = $(am__append_3) ++libelf_so_LDLIBS = $(am__append_4) libelf_so_SOURCES = noinst_HEADERS = elf.h abstract.h common.h exttypes.h gelf_xlate.h libelfP.h \ version_xlate.h gnuhash_xlate.h note_xlate.h dl-hash.h --- elfutils/m4/Makefile.in +++ elfutils/m4/Makefile.in -@@ -145,6 +145,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -148,6 +148,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1304,7 +1475,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -176,6 +177,7 @@ SHELL = @SHELL@ +@@ -179,6 +180,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -1314,7 +1485,7 @@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ --- elfutils/Makefile.in +++ elfutils/Makefile.in -@@ -263,6 +263,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -266,6 +266,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1322,7 +1493,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -294,6 +295,7 @@ SHELL = @SHELL@ +@@ -297,6 +298,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -1332,7 +1503,7 @@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ --- elfutils/src/addr2line.c +++ elfutils/src/addr2line.c -@@ -540,10 +540,10 @@ handle_address (const char *string, Dwfl +@@ -622,10 +622,10 @@ handle_address (const char *string, Dwfl bool parsed = false; int i, j; char *name = NULL; @@ -1345,9 +1516,26 @@ { default: break; +--- elfutils/src/ar.c ++++ elfutils/src/ar.c +@@ -685,7 +685,14 @@ do_oper_extract (int oper, const char *a + tv[1].tv_sec = arhdr->ar_date; + tv[1].tv_nsec = 0; + ++#ifdef HAVE_FUTIMENS + if (unlikely (futimens (xfd, tv) != 0)) ++#else ++ struct timeval times[2]; ++ TIMESPEC_TO_TIMEVAL (×[0], &tv[0]); ++ TIMESPEC_TO_TIMEVAL (×[1], &tv[1]); ++ if (unlikely (futimes (xfd, times) != 0)) ++#endif + { + error (0, errno, + gettext ("cannot change modification time of %s"), --- elfutils/src/ChangeLog +++ elfutils/src/ChangeLog -@@ -1371,8 +1371,16 @@ +@@ -1598,8 +1598,16 @@ * readelf.c (attr_callback): Use print_block only when we don't use print_ops. @@ -1364,7 +1552,7 @@ * ar.c (do_oper_extract): Use pathconf instead of statfs. 2009-08-01 Ulrich Drepper -@@ -1536,6 +1544,8 @@ +@@ -1763,6 +1771,8 @@ * readelf.c (print_debug_frame_section): Use t instead of j formats for ptrdiff_t OFFSET. @@ -1373,7 +1561,7 @@ 2009-01-21 Ulrich Drepper * elflint.c (check_program_header): Fix typo in .eh_frame_hdr section -@@ -1719,6 +1729,11 @@ +@@ -1946,6 +1956,11 @@ that matches its PT_LOAD's p_flags &~ PF_W. On sparc, PF_X really is valid in RELRO. @@ -1385,7 +1573,7 @@ 2008-02-29 Roland McGrath * readelf.c (print_attributes): Add a cast. -@@ -1970,6 +1985,8 @@ +@@ -2197,6 +2212,8 @@ * readelf.c (hex_dump): Fix rounding error in whitespace calculation. @@ -1394,7 +1582,7 @@ 2007-10-15 Roland McGrath * make-debug-archive.in: New file. -@@ -2409,6 +2426,10 @@ +@@ -2636,6 +2653,10 @@ * elflint.c (valid_e_machine): Add EM_ALPHA. Reported by Christian Aichinger . @@ -1405,7 +1593,7 @@ 2006-08-08 Ulrich Drepper * elflint.c (check_dynamic): Don't require DT_HASH for DT_SYMTAB. -@@ -2485,6 +2506,10 @@ +@@ -2712,6 +2733,10 @@ * Makefile.am: Add hacks to create dependency files for non-generic linker. @@ -1416,7 +1604,7 @@ 2006-06-12 Ulrich Drepper * ldgeneric.c (ld_generic_generate_sections): Don't create .interp -@@ -2833,6 +2858,11 @@ +@@ -3060,6 +3085,11 @@ * readelf.c (print_debug_loc_section): Fix indentation for larger address size. @@ -1462,50 +1650,52 @@ #endif /* ld.h */ --- elfutils/src/Makefile.am +++ elfutils/src/Makefile.am -@@ -89,6 +89,11 @@ endif - # XXX While the file is not finished, don't warn about this +@@ -90,6 +90,11 @@ endif ldgeneric_no_Wunused = yes + ldgeneric_no_Wstack_usage = yes +# Buggy old compilers or libc headers. +readelf_no_Werror = yes +strings_no_Werror = yes +addr2line_no_Wformat = yes + - readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) -ldl - nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) -ldl \ - $(demanglelib) + # Bad, bad stack usage... + readelf_no_Wstack_usage = yes + nm_no_Wstack_usage = yes --- elfutils/src/Makefile.in +++ elfutils/src/Makefile.in -@@ -85,6 +85,7 @@ DIST_COMMON = $(top_srcdir)/config/eu.am +@@ -85,7 +85,8 @@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.am ldlex.c ldscript.c \ $(top_srcdir)/config/depcomp $(top_srcdir)/config/ylwrap \ $(noinst_HEADERS) ChangeLog +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEEXT) size$(EXEEXT) \ strip$(EXEEXT) ld$(EXEEXT) elflint$(EXEEXT) \ findtextrel$(EXEEXT) addr2line$(EXEEXT) elfcmp$(EXEEXT) \ -@@ -93,9 +94,9 @@ bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEE +@@ -94,9 +95,9 @@ bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEE @NATIVE_LD_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1) # We never build this library but we need to get the dependency files # of all the linker backends that might be used in a non-generic linker. --@NEVER_TRUE@am__append_1 = libdummy.a -+@NEVER_TRUE@am__append_2 = libdummy.a +-@NEVER_TRUE@am__append_2 = libdummy.a ++@NEVER_TRUE@am__append_3 = libdummy.a # -ldl is always needed for libebl. --@NATIVE_LD_TRUE@am__append_2 = libld_elf.a -+@NATIVE_LD_TRUE@am__append_3 = libld_elf.a +-@NATIVE_LD_TRUE@am__append_3 = libld_elf.a ++@NATIVE_LD_TRUE@am__append_4 = libld_elf.a @NATIVE_LD_TRUE@am_libld_elf_i386_pic_a_OBJECTS = subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -@@ -159,7 +160,7 @@ am_ld_OBJECTS = ld.$(OBJEXT) ldgeneric.$ - ldscript.$(OBJEXT) symbolhash.$(OBJEXT) sectionhash.$(OBJEXT) \ +@@ -164,7 +165,7 @@ am_ld_OBJECTS = ld.$(OBJEXT) ldgeneric.$ versionhash.$(OBJEXT) ld_OBJECTS = $(am_ld_OBJECTS) --ld_DEPENDENCIES = $(libebl) $(libelf) $(libeu) $(am__append_2) -+ld_DEPENDENCIES = $(libebl) $(libelf) $(libeu) $(am__append_3) + ld_DEPENDENCIES = $(libebl) $(libelf) $(libeu) $(am__DEPENDENCIES_1) \ +- $(am__append_3) ++ $(am__append_4) ld_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(ld_LDFLAGS) $(LDFLAGS) -o \ $@ am_libld_elf_i386_so_OBJECTS = -@@ -340,6 +341,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -350,6 +351,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1513,7 +1703,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -371,6 +373,7 @@ SHELL = @SHELL@ +@@ -381,6 +383,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -1521,57 +1711,63 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -434,11 +437,11 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr - -I$(srcdir)/../libelf -I$(srcdir)/../libebl \ - -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf \ - -I$(srcdir)/../libdwfl -I$(srcdir)/../libasm +@@ -449,14 +452,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr + + # Warn about stack usage of more than 256K = 262144 bytes. + @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ - $(if $($(*F)_no_Werror),,-Werror) \ - $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ +- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ - $($(*F)_CFLAGS) - +AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ + $($(*F)_no_Werror),,-Werror) $(if \ + $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ -+ $(am__append_1) ++ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ ++ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ ++ $($(*F)_CFLAGS) $(am__append_1) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +-DEFS.os = -DPIC -DSHARED $(am__append_1) ++DEFS.os = -DPIC -DSHARED $(am__append_2) CLEANFILES = *.gcno *.gcda make-debug-archive none_ld.os \ $(ld_modules:.c=.os) *.gconv -@@ -452,8 +455,8 @@ AM_LFLAGS = -Pld -olex.yy.c + textrel_msg = echo "WARNING: TEXTREL found in '$@'" +@@ -469,8 +472,8 @@ AM_LFLAGS = -Pld -olex.yy.c native_ld = @native_ld@ ld_dsos = libld_elf_i386_pic.a @NATIVE_LD_FALSE@noinst_LIBRARIES = libld_elf.a libar.a $(ld_dsos) \ --@NATIVE_LD_FALSE@ $(am__append_1) --@NATIVE_LD_TRUE@noinst_LIBRARIES = libld_elf.a libar.a $(am__append_1) -+@NATIVE_LD_FALSE@ $(am__append_2) -+@NATIVE_LD_TRUE@noinst_LIBRARIES = libld_elf.a libar.a $(am__append_2) +-@NATIVE_LD_FALSE@ $(am__append_2) +-@NATIVE_LD_TRUE@noinst_LIBRARIES = libld_elf.a libar.a $(am__append_2) ++@NATIVE_LD_FALSE@ $(am__append_3) ++@NATIVE_LD_TRUE@noinst_LIBRARIES = libld_elf.a libar.a $(am__append_3) @NATIVE_LD_TRUE@native_ld_cflags = -DBASE_ELF_NAME=elf_$(base_cpu) @NEVER_TRUE@libdummy_a_SOURCES = i386_ld.c ld_SOURCES = ld.c ldgeneric.c ldlex.l ldscript.y symbolhash.c sectionhash.c \ -@@ -479,13 +482,18 @@ libeu = ../lib/libeu.a - - # XXX While the file is not finished, don't warn about this +@@ -498,6 +501,11 @@ libeu = ../lib/libeu.a ldgeneric_no_Wunused = yes -+ + ldgeneric_no_Wstack_usage = yes + +# Buggy old compilers or libc headers. +readelf_no_Werror = yes +strings_no_Werror = yes +addr2line_no_Wformat = yes - readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) -ldl - nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) -ldl \ - $(demanglelib) - - size_LDADD = $(libelf) $(libeu) - strip_LDADD = $(libebl) $(libelf) $(libeu) -ldl --ld_LDADD = $(libebl) $(libelf) $(libeu) -ldl $(am__append_2) -+ld_LDADD = $(libebl) $(libelf) $(libeu) -ldl $(am__append_3) ++ + # Bad, bad stack usage... + readelf_no_Wstack_usage = yes + nm_no_Wstack_usage = yes +@@ -517,7 +525,7 @@ nm_LDADD = $(libdw) $(libebl) $(libelf) + size_LDADD = $(libelf) $(libeu) $(argp_LDADD) + strip_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl + ld_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl \ +- $(am__append_3) ++ $(am__append_4) ld_LDFLAGS = -rdynamic - elflint_LDADD = $(libebl) $(libelf) $(libeu) -ldl - findtextrel_LDADD = $(libdw) $(libelf) + elflint_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl + findtextrel_LDADD = $(libdw) $(libelf) $(argp_LDADD) --- elfutils/src/readelf.c +++ elfutils/src/readelf.c -@@ -4368,10 +4368,12 @@ listptr_base (struct listptr *p) +@@ -4364,10 +4364,12 @@ listptr_base (struct listptr *p) return base; } @@ -1586,7 +1782,7 @@ struct listptr *p1 = (void *) a; struct listptr *p2 = (void *) b; -@@ -4467,8 +4469,11 @@ static void +@@ -4463,8 +4465,11 @@ static void sort_listptr (struct listptr_table *table, const char *name) { if (table->n > 0) @@ -1600,7 +1796,7 @@ } static bool -@@ -9539,7 +9544,7 @@ dump_archive_index (Elf *elf, const char +@@ -9561,7 +9566,7 @@ dump_archive_index (Elf *elf, const char if (unlikely (elf_rand (elf, as_off) == 0) || unlikely ((subelf = elf_begin (-1, ELF_C_READ_MMAP, elf)) == NULL)) @@ -1650,53 +1846,33 @@ if (unlikely (elfmap == MAP_FAILED)) --- elfutils/src/strip.c +++ elfutils/src/strip.c -@@ -45,6 +45,12 @@ - #include - #include - -+#ifdef HAVE_FUTIMES -+# define FUTIMES(fd, fname, tvp) futimes (fd, tvp) -+#else -+# define FUTIMES(fd, fname, tvp) utimes (fname, tvp) -+#endif -+ - typedef uint8_t GElf_Byte; - - /* Name and version of program. */ -@@ -318,8 +324,18 @@ process_file (const char *fname) - - /* If we have to preserve the timestamp, we need it in the - format utimes() understands. */ -+#ifdef HAVE_STRUCT_STAT_ST_ATIM - TIMESPEC_TO_TIMEVAL (&tv[0], &pre_st.st_atim); -+#else -+ tv[0].tv_sec = pre_st.st_atime; -+ tv[0].tv_usec = 0; -+#endif -+#ifdef HAVE_STRUCT_STAT_ST_MTIM - TIMESPEC_TO_TIMEVAL (&tv[1], &pre_st.st_mtim); -+#else -+ tv[1].tv_sec = pre_st.st_atime; -+ tv[1].tv_usec = 0; -+#endif - } - - /* Open the file. */ -@@ -2091,7 +2107,7 @@ while computing checksum for debug infor +@@ -2191,7 +2191,14 @@ while computing checksum for debug infor /* If requested, preserve the timestamp. */ if (tvp != NULL) { -- if (futimes (fd, tvp) != 0) -+ if (FUTIMES (fd, output_fname, tvp) != 0) ++#ifdef HAVE_FUTIMENS + if (futimens (fd, tvp) != 0) ++#else ++ struct timeval times[2]; ++ TIMESPEC_TO_TIMEVAL (×[0], &tvp[0]); ++ TIMESPEC_TO_TIMEVAL (×[1], &tvp[1]); ++ if (futimes (fd, times) != 0) ++#endif { error (0, errno, gettext ("\ cannot set access and modification date of '%s'"), -@@ -2148,7 +2164,7 @@ handle_ar (int fd, Elf *elf, const char +@@ -2263,7 +2270,14 @@ handle_ar (int fd, Elf *elf, const char if (tvp != NULL) { -- if (unlikely (futimes (fd, tvp) != 0)) -+ if (unlikely (FUTIMES (fd, fname, tvp) != 0)) ++#ifdef HAVE_FUTIMENS + if (unlikely (futimens (fd, tvp) != 0)) ++#else ++ struct timeval times[2]; ++ TIMESPEC_TO_TIMEVAL (×[0], &tvp[0]); ++ TIMESPEC_TO_TIMEVAL (×[1], &tvp[1]); ++ if (unlikely (futimes (fd, times) != 0)) ++#endif { error (0, errno, gettext ("\ cannot set access and modification date of '%s'"), fname); @@ -1712,7 +1888,7 @@ #ifndef __linux__ --- elfutils/tests/ChangeLog +++ elfutils/tests/ChangeLog -@@ -421,6 +421,13 @@ +@@ -609,6 +609,13 @@ 2013-12-02 Jan Kratochvil @@ -1726,7 +1902,7 @@ * Makefile.am (check_PROGRAMS): Add backtrace, backtrace-child, backtrace-data and backtrace-dwarf. (BUILT_SOURCES, clean-local, backtrace-child-biarch): New. -@@ -1285,6 +1292,8 @@ +@@ -1473,6 +1480,8 @@ 2008-01-21 Roland McGrath @@ -1735,7 +1911,7 @@ * testfile45.S.bz2: Add tests for cltq, cqto. * testfile45.expect.bz2: Adjust. -@@ -1993,6 +2002,11 @@ +@@ -2181,6 +2190,11 @@ * Makefile.am (TESTS): Add run-elflint-test.sh. (EXTRA_DIST): Add run-elflint-test.sh and testfile18.bz2. @@ -1760,64 +1936,67 @@ case 0: --- elfutils/tests/Makefile.am +++ elfutils/tests/Makefile.am -@@ -365,6 +365,7 @@ get_lines_LDADD = $(libdw) $(libelf) +@@ -382,6 +382,7 @@ get_lines_LDADD = $(libdw) $(libelf) get_files_LDADD = $(libdw) $(libelf) get_aranges_LDADD = $(libdw) $(libelf) allfcts_LDADD = $(libdw) $(libelf) +line2addr_no_Wformat = yes - line2addr_LDADD = $(libdw) - addrscopes_LDADD = $(libdw) - funcscopes_LDADD = $(libdw) + line2addr_LDADD = $(libdw) $(argp_LDADD) + addrscopes_LDADD = $(libdw) $(argp_LDADD) + funcscopes_LDADD = $(libdw) $(argp_LDADD) --- elfutils/tests/Makefile.in +++ elfutils/tests/Makefile.in -@@ -80,13 +80,14 @@ host_triplet = @host@ +@@ -80,14 +80,15 @@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/test-driver ChangeLog --@STANDALONE_FALSE@am__append_1 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \ +-@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +-@STANDALONE_FALSE@am__append_2 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \ +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@STANDALONE_FALSE@am__append_2 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \ ++@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING ++@STANDALONE_FALSE@am__append_3 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \ @STANDALONE_FALSE@ -I$(top_srcdir)/libdwfl -I$(top_srcdir)/libdwelf \ @STANDALONE_FALSE@ -I$(top_srcdir)/libebl -I$(top_srcdir)/libelf \ @STANDALONE_FALSE@ -I$(top_srcdir)/lib -I.. --@STANDALONE_FALSE@am__append_2 = -Wl,-rpath-link,../libasm:../libdw:../libelf --@TESTS_RPATH_TRUE@am__append_3 = -Wl,-rpath,$(BUILD_RPATH) -+@STANDALONE_FALSE@am__append_3 = -Wl,-rpath-link,../libasm:../libdw:../libelf -+@TESTS_RPATH_TRUE@am__append_4 = -Wl,-rpath,$(BUILD_RPATH) +-@STANDALONE_FALSE@am__append_3 = -Wl,-rpath-link,../libasm:../libdw:../libelf +-@TESTS_RPATH_TRUE@am__append_4 = -Wl,-rpath,$(BUILD_RPATH) ++@STANDALONE_FALSE@am__append_4 = -Wl,-rpath-link,../libasm:../libdw:../libelf ++@TESTS_RPATH_TRUE@am__append_5 = -Wl,-rpath,$(BUILD_RPATH) check_PROGRAMS = arextract$(EXEEXT) arsymtest$(EXEEXT) \ newfile$(EXEEXT) saridx$(EXEEXT) scnnames$(EXEEXT) \ sectiondump$(EXEEXT) showptable$(EXEEXT) update1$(EXEEXT) \ -@@ -113,7 +114,7 @@ check_PROGRAMS = arextract$(EXEEXT) arsy - deleted$(EXEEXT) deleted-lib.so$(EXEEXT) \ - aggregate_size$(EXEEXT) vdsosyms$(EXEEXT) $(am__EXEEXT_1) \ - $(am__EXEEXT_2) $(am__EXEEXT_4) --@BIARCH_TRUE@am__append_4 = backtrace-child-biarch -+@BIARCH_TRUE@am__append_5 = backtrace-child-biarch +@@ -116,7 +117,7 @@ check_PROGRAMS = arextract$(EXEEXT) arsy + aggregate_size$(EXEEXT) vdsosyms$(EXEEXT) getsrc_die$(EXEEXT) \ + strptr$(EXEEXT) newdata$(EXEEXT) elfstrtab$(EXEEXT) \ + $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4) +-@BIARCH_TRUE@am__append_5 = backtrace-child-biarch ++@BIARCH_TRUE@am__append_6 = backtrace-child-biarch TESTS = run-arextract.sh run-arsymtest.sh newfile$(EXEEXT) \ test-nlist$(EXEEXT) update1$(EXEEXT) update2$(EXEEXT) \ update3$(EXEEXT) update4$(EXEEXT) run-show-die-info.sh \ -@@ -159,14 +160,14 @@ TESTS = run-arextract.sh run-arsymtest.s - run-stack-i-test.sh run-readelf-dwz-multi.sh \ +@@ -166,14 +167,14 @@ TESTS = run-arextract.sh run-arsymtest.s run-allfcts-multi.sh run-deleted.sh run-linkmap-cut.sh \ run-aggregate-size.sh vdsosyms$(EXEEXT) run-readelf-A.sh \ -- $(am__EXEEXT_2) $(am__append_7) $(am__append_8) \ -+ $(am__EXEEXT_2) $(am__append_8) $(am__append_9) \ - $(am__EXEEXT_4) --@STANDALONE_FALSE@am__append_5 = msg_tst md5-sha1-test - @STANDALONE_FALSE@am__append_6 = msg_tst md5-sha1-test --@LZMA_TRUE@am__append_7 = run-readelf-s.sh run-dwflsyms.sh --@ZLIB_TRUE@am__append_8 = run-readelf-zdebug.sh --@HAVE_LIBASM_TRUE@am__append_9 = $(asm_TESTS) -+@STANDALONE_FALSE@am__append_7 = msg_tst md5-sha1-test -+@LZMA_TRUE@am__append_8 = run-readelf-s.sh run-dwflsyms.sh -+@ZLIB_TRUE@am__append_9 = run-readelf-zdebug.sh - @HAVE_LIBASM_TRUE@am__append_10 = $(asm_TESTS) -+@HAVE_LIBASM_TRUE@am__append_11 = $(asm_TESTS) + run-getsrc-die.sh run-strptr.sh newdata$(EXEEXT) \ +- elfstrtab$(EXEEXT) $(am__EXEEXT_2) $(am__append_8) \ +- $(am__append_9) $(am__EXEEXT_4) +-@STANDALONE_FALSE@am__append_6 = msg_tst md5-sha1-test ++ elfstrtab$(EXEEXT) $(am__EXEEXT_2) $(am__append_9) \ ++ $(am__append_10) $(am__EXEEXT_4) + @STANDALONE_FALSE@am__append_7 = msg_tst md5-sha1-test +-@LZMA_TRUE@am__append_8 = run-readelf-s.sh run-dwflsyms.sh +-@ZLIB_TRUE@am__append_9 = run-readelf-zdebug.sh +-@HAVE_LIBASM_TRUE@am__append_10 = $(asm_TESTS) ++@STANDALONE_FALSE@am__append_8 = msg_tst md5-sha1-test ++@LZMA_TRUE@am__append_9 = run-readelf-s.sh run-dwflsyms.sh ++@ZLIB_TRUE@am__append_10 = run-readelf-zdebug.sh + @HAVE_LIBASM_TRUE@am__append_11 = $(asm_TESTS) ++@HAVE_LIBASM_TRUE@am__append_12 = $(asm_TESTS) subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -787,6 +788,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -819,6 +820,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1825,7 +2004,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -818,6 +820,7 @@ SHELL = @SHELL@ +@@ -850,6 +852,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -1833,39 +2012,47 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -877,12 +880,12 @@ top_build_prefix = @top_build_prefix@ +@@ -910,26 +913,26 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zip_LIBS = @zip_LIBS@ --AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. $(am__append_1) +-AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. $(am__append_2) ++AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. $(am__append_3) + @ADD_STACK_USAGE_WARNING_FALSE@STACK_USAGE_WARNING = + + # Warn about stack usage of more than 256K = 262144 bytes. + @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 -AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ - $(if $($(*F)_no_Werror),,-Werror) \ - $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ +- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ - $($(*F)_CFLAGS) - -+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. $(am__append_2) +AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ + $($(*F)_no_Werror),,-Werror) $(if \ + $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ -+ $(am__append_1) ++ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ ++ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ ++ $($(*F)_CFLAGS) $(am__append_1) COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +-DEFS.os = -DPIC -DSHARED $(am__append_1) ++DEFS.os = -DPIC -DSHARED $(am__append_2) CLEANFILES = *.gcno *.gcda textrel_msg = echo "WARNING: TEXTREL found in '$@'" -@@ -890,7 +893,7 @@ textrel_msg = echo "WARNING: TEXTREL fou + @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) @FATAL_TEXTREL_TRUE@textrel_found = $(textrel_msg); exit 1 textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then $(textrel_found); fi BUILD_RPATH = \$$ORIGIN/../libasm:\$$ORIGIN/../libdw:\$$ORIGIN/../backends:\$$ORIGIN/../libelf --AM_LDFLAGS = $(am__append_2) $(am__append_3) -+AM_LDFLAGS = $(am__append_3) $(am__append_4) +-AM_LDFLAGS = $(am__append_3) $(am__append_4) ++AM_LDFLAGS = $(am__append_4) $(am__append_5) @TESTS_RPATH_FALSE@tests_rpath = no @TESTS_RPATH_TRUE@tests_rpath = yes asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ -@@ -1106,6 +1109,7 @@ get_lines_LDADD = $(libdw) $(libelf) +@@ -1156,6 +1159,7 @@ get_lines_LDADD = $(libdw) $(libelf) get_files_LDADD = $(libdw) $(libelf) get_aranges_LDADD = $(libdw) $(libelf) allfcts_LDADD = $(libdw) $(libelf) +line2addr_no_Wformat = yes - line2addr_LDADD = $(libdw) - addrscopes_LDADD = $(libdw) - funcscopes_LDADD = $(libdw) + line2addr_LDADD = $(libdw) $(argp_LDADD) + addrscopes_LDADD = $(libdw) $(argp_LDADD) + funcscopes_LDADD = $(libdw) $(argp_LDADD) diff --git a/elfutils.spec b/elfutils.spec index a480c16..17ee491 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects -Version: 0.161 -%global baserelease 8 +Version: 0.162 +%global baserelease 1 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -46,14 +46,6 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: %{?source_url}elfutils-portability-%{version}.patch -Patch2: elfutils-0.161-ar-long-name.patch -# libdw: fix offset for sig8 lookup in dwarf_formref_die -Patch3: elfutils-0.161-formref-type.patch -# rhbz#1189928 - Consider sh_addralign 0 as 1 -Patch4: elfutils-0.161-addralign.patch -Patch5: elfutils-0.161-copyreloc.patch -Patch6: elfutils-0.161-aarch64relro.patch - %if !%{compat} Release: %{baserelease}%{?dist} %else @@ -73,8 +65,6 @@ BuildRequires: flex >= 2.5.4a BuildRequires: bzip2 %if !%{compat} BuildRequires: gcc >= 3.4 -# Need that gives unsigned bswap_16 etc. -BuildRequires: glibc-headers >= 2.3.4-11 %else BuildRequires: gcc >= 3.2 %endif @@ -215,12 +205,6 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %endif %endif -%patch2 -p1 -b .ar_long_name -%patch3 -p1 -b .formref_type -%patch4 -p1 -b .addralign -%patch5 -p1 -b .copyreloc -%patch6 -p1 -b .aarch64relro - find . -name \*.sh ! -perm -0100 -print | xargs chmod +x %build @@ -314,6 +298,7 @@ rm -rf ${RPM_BUILD_ROOT} %{_includedir}/dwarf.h %dir %{_includedir}/elfutils %{_includedir}/elfutils/elf-knowledge.h +%{_includedir}/elfutils/known-dwarf.h %{_includedir}/elfutils/libasm.h %{_includedir}/elfutils/libebl.h %{_includedir}/elfutils/libdw.h @@ -348,6 +333,17 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Thu Jun 11 2015 Mark Wielaard - 0.162-1 +- Update to 0.162 (#1170810, #1139815, #1129756, #1020842) +- Include elfutils/known-dwarf.h +- Drop BuildRequires glibc-headers (#1230468) +- Removed integrated upstream patches: + - elfutils-0.161-aarch64relro.patch + - elfutils-0.161-copyreloc.patch + - elfutils-0.161-addralign.patch + - elfutils-0.161-ar-long-name.patch + - elfutils-0.161-formref-type.patch + * Sat May 02 2015 Kalev Lember - 0.161-8 - Rebuilt for GCC 5 C++11 ABI change diff --git a/sources b/sources index d5e1096..5837cff 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -e1b9847c9a6a1ad340de8d47a863ec52 elfutils-0.161.tar.bz2 +9334cbcc0df7669b7bf07cf7fc3ad52c elfutils-0.162.tar.bz2 From eb0b633dd4c74228579731de166655458e42dfd0 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 16 Jun 2015 14:25:20 +0200 Subject: [PATCH 011/216] 0.162-2 - Add elfutils-0.162-ftruncate-allocate.patch (#1232206) --- elfutils-0.162-ftruncate-allocate.patch | 103 ++++++++++++++++++++++++ elfutils.spec | 10 ++- 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.162-ftruncate-allocate.patch diff --git a/elfutils-0.162-ftruncate-allocate.patch b/elfutils-0.162-ftruncate-allocate.patch new file mode 100644 index 0000000..6f32fed --- /dev/null +++ b/elfutils-0.162-ftruncate-allocate.patch @@ -0,0 +1,103 @@ +From e4e846b67df12045ee6554bfb568a89b4ed80a71 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Tue, 16 Jun 2015 14:05:35 +0200 +Subject: [PATCH] libelf: Always call ftruncate before posix_fallocate to set + the right size. + +When elf_update.c (write_file) doesn't know the current maximum file length +it might have to reduce the file size. posix_fallocate can only extend the +file. So always call ftruncate before that to set the file size and making +sure the backing store is fully there. Add test cases for checking strip +in place (eu-strip without -o) actually reduces the file size. But only +for non-ET_REL files. We might not be able to strip ET_REL files (except +when they are kernel modules) because they might contain "dangling" symbol +table entries. + +https://bugzilla.redhat.com/show_bug.cgi?id=1232206 + +Signed-off-by: Mark Wielaard +--- + libelf/ChangeLog | 5 +++++ + libelf/elf_update.c | 7 +++++-- + tests/ChangeLog | 5 +++++ + tests/run-strip-test.sh | 13 +++++++++++++ + 4 files changed, 28 insertions(+), 2 deletions(-) + +diff --git a/libelf/ChangeLog b/libelf/ChangeLog +index 30017cd..2d24007 100644 +--- a/libelf/ChangeLog ++++ b/libelf/ChangeLog +@@ -1,3 +1,8 @@ ++2015-06-16 Mark Wielaard ++ ++ * elf_update.c (write_file): Always also use ftruncate before ++ posix_fallocate to make sure file has the right size. ++ + 2015-06-04 Mark Wielaard + + * elf_getdata.c (__libelf_type_aligns): Add entries for ELF_T_EHDR, +diff --git a/libelf/elf_update.c b/libelf/elf_update.c +index 9e34c46..9eb007b 100644 +--- a/libelf/elf_update.c ++++ b/libelf/elf_update.c +@@ -60,15 +60,18 @@ write_file (Elf *elf, off_t size, int change_bo, size_t shnum) + new file. We truncate the file later in this case. + + Note we use posix_fallocate to make sure the file content is really +- there. Using ftruncate might mean the file is extended, but space ++ there. Only using ftruncate might mean the file is extended, but space + isn't allocated yet. This might cause a SIGBUS once we write into + the mmapped space and the disk is full. Using fallocate might fail + on some file systems. posix_fallocate is required to extend the file + and allocate enough space even if the underlying filesystem would +- normally return EOPNOTSUPP. */ ++ normally return EOPNOTSUPP. Note that we do also need to ftruncate ++ in case the maximum_size isn't known and the file needs to be shorter ++ because posix_fallocate can only extend. */ + if (elf->parent == NULL + && (elf->maximum_size == ~((size_t) 0) + || (size_t) size > elf->maximum_size) ++ && unlikely (ftruncate (elf->fildes, size) != 0) + && unlikely (posix_fallocate (elf->fildes, 0, size) != 0)) + { + __libelf_seterrno (ELF_E_WRITE_ERROR); +diff --git a/tests/ChangeLog b/tests/ChangeLog +index 19878ac..34f89cc 100644 +--- a/tests/ChangeLog ++++ b/tests/ChangeLog +@@ -1,3 +1,8 @@ ++2015-06-16 Mark Wielaard ++ ++ * run-strip-test.sh: Add strip-in-place (eu-strip without -o) test ++ for non-ET_REL files. ++ + 2015-05-30 Mark Wielaard + + * backtrace-subr.sh (check_native_core): Notice core file couldn't be +diff --git a/tests/run-strip-test.sh b/tests/run-strip-test.sh +index c558e90..2ebb5a9 100755 +--- a/tests/run-strip-test.sh ++++ b/tests/run-strip-test.sh +@@ -49,6 +49,19 @@ testrun ${abs_top_builddir}/src/unstrip -o testfile.unstrip testfile.temp testfi + testrun ${abs_top_builddir}/src/elfcmp --hash-inexact $original testfile.unstrip + } + ++# Now strip in-place and make sure it is smaller. ++# Skip ET_REL files, they might have unexpected symbol table entries. ++is_ET_REL=0 ++testrun ${abs_top_builddir}/src/readelf -h $original 2>&1 \ ++ | fgrep 'REL (Relocatable file)' && is_ET_REL=1 ++if test $is_ET_REL -eq 0; then ++ SIZE_original=$(stat -c%s $original) ++ testrun ${abs_top_builddir}/src/strip $original ++ SIZE_stripped=$(stat -c%s $original) ++ test $SIZE_stripped -lt $SIZE_original || ++ { echo "*** failure in-place strip file not smaller $original"; status=1; } ++fi ++ + tempfiles testfile.sections + testrun ${abs_top_builddir}/src/readelf -S testfile.temp > testfile.sections || status=$? + fgrep ' .debug_' testfile.sections && status=1 +-- +1.8.3.1 + diff --git a/elfutils.spec b/elfutils.spec index 17ee491..37b2823 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.162 -%global baserelease 1 +%global baserelease 2 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -46,6 +46,9 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: %{?source_url}elfutils-portability-%{version}.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=1232206 +Patch2: elfutils-0.162-ftruncate-allocate.patch + %if !%{compat} Release: %{baserelease}%{?dist} %else @@ -205,6 +208,8 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %endif %endif +%patch2 -p1 -b .ftruncate + find . -name \*.sh ! -perm -0100 -print | xargs chmod +x %build @@ -333,6 +338,9 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Tue Jun 16 2015 Mark Wielaard - 0.162-2 +- Add elfutils-0.162-ftruncate-allocate.patch (#1232206) + * Thu Jun 11 2015 Mark Wielaard - 0.162-1 - Update to 0.162 (#1170810, #1139815, #1129756, #1020842) - Include elfutils/known-dwarf.h From 246a47b0fc1211b4e7acc03e9dccc0557e36cb20 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 19 Jun 2015 15:30:55 +0200 Subject: [PATCH 012/216] Update to 0.163. --- .gitignore | 1 + elfutils-0.162-ftruncate-allocate.patch | 103 ------ ....patch => elfutils-portability-0.163.patch | 312 ++++++++++-------- elfutils.spec | 13 +- sources | 2 +- 5 files changed, 189 insertions(+), 242 deletions(-) delete mode 100644 elfutils-0.162-ftruncate-allocate.patch rename elfutils-portability-0.162.patch => elfutils-portability-0.163.patch (89%) diff --git a/.gitignore b/.gitignore index c20acfc..948e70d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /elfutils-0.160.tar.bz2 /elfutils-0.161.tar.bz2 /elfutils-0.162.tar.bz2 +/elfutils-0.163.tar.bz2 diff --git a/elfutils-0.162-ftruncate-allocate.patch b/elfutils-0.162-ftruncate-allocate.patch deleted file mode 100644 index 6f32fed..0000000 --- a/elfutils-0.162-ftruncate-allocate.patch +++ /dev/null @@ -1,103 +0,0 @@ -From e4e846b67df12045ee6554bfb568a89b4ed80a71 Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Tue, 16 Jun 2015 14:05:35 +0200 -Subject: [PATCH] libelf: Always call ftruncate before posix_fallocate to set - the right size. - -When elf_update.c (write_file) doesn't know the current maximum file length -it might have to reduce the file size. posix_fallocate can only extend the -file. So always call ftruncate before that to set the file size and making -sure the backing store is fully there. Add test cases for checking strip -in place (eu-strip without -o) actually reduces the file size. But only -for non-ET_REL files. We might not be able to strip ET_REL files (except -when they are kernel modules) because they might contain "dangling" symbol -table entries. - -https://bugzilla.redhat.com/show_bug.cgi?id=1232206 - -Signed-off-by: Mark Wielaard ---- - libelf/ChangeLog | 5 +++++ - libelf/elf_update.c | 7 +++++-- - tests/ChangeLog | 5 +++++ - tests/run-strip-test.sh | 13 +++++++++++++ - 4 files changed, 28 insertions(+), 2 deletions(-) - -diff --git a/libelf/ChangeLog b/libelf/ChangeLog -index 30017cd..2d24007 100644 ---- a/libelf/ChangeLog -+++ b/libelf/ChangeLog -@@ -1,3 +1,8 @@ -+2015-06-16 Mark Wielaard -+ -+ * elf_update.c (write_file): Always also use ftruncate before -+ posix_fallocate to make sure file has the right size. -+ - 2015-06-04 Mark Wielaard - - * elf_getdata.c (__libelf_type_aligns): Add entries for ELF_T_EHDR, -diff --git a/libelf/elf_update.c b/libelf/elf_update.c -index 9e34c46..9eb007b 100644 ---- a/libelf/elf_update.c -+++ b/libelf/elf_update.c -@@ -60,15 +60,18 @@ write_file (Elf *elf, off_t size, int change_bo, size_t shnum) - new file. We truncate the file later in this case. - - Note we use posix_fallocate to make sure the file content is really -- there. Using ftruncate might mean the file is extended, but space -+ there. Only using ftruncate might mean the file is extended, but space - isn't allocated yet. This might cause a SIGBUS once we write into - the mmapped space and the disk is full. Using fallocate might fail - on some file systems. posix_fallocate is required to extend the file - and allocate enough space even if the underlying filesystem would -- normally return EOPNOTSUPP. */ -+ normally return EOPNOTSUPP. Note that we do also need to ftruncate -+ in case the maximum_size isn't known and the file needs to be shorter -+ because posix_fallocate can only extend. */ - if (elf->parent == NULL - && (elf->maximum_size == ~((size_t) 0) - || (size_t) size > elf->maximum_size) -+ && unlikely (ftruncate (elf->fildes, size) != 0) - && unlikely (posix_fallocate (elf->fildes, 0, size) != 0)) - { - __libelf_seterrno (ELF_E_WRITE_ERROR); -diff --git a/tests/ChangeLog b/tests/ChangeLog -index 19878ac..34f89cc 100644 ---- a/tests/ChangeLog -+++ b/tests/ChangeLog -@@ -1,3 +1,8 @@ -+2015-06-16 Mark Wielaard -+ -+ * run-strip-test.sh: Add strip-in-place (eu-strip without -o) test -+ for non-ET_REL files. -+ - 2015-05-30 Mark Wielaard - - * backtrace-subr.sh (check_native_core): Notice core file couldn't be -diff --git a/tests/run-strip-test.sh b/tests/run-strip-test.sh -index c558e90..2ebb5a9 100755 ---- a/tests/run-strip-test.sh -+++ b/tests/run-strip-test.sh -@@ -49,6 +49,19 @@ testrun ${abs_top_builddir}/src/unstrip -o testfile.unstrip testfile.temp testfi - testrun ${abs_top_builddir}/src/elfcmp --hash-inexact $original testfile.unstrip - } - -+# Now strip in-place and make sure it is smaller. -+# Skip ET_REL files, they might have unexpected symbol table entries. -+is_ET_REL=0 -+testrun ${abs_top_builddir}/src/readelf -h $original 2>&1 \ -+ | fgrep 'REL (Relocatable file)' && is_ET_REL=1 -+if test $is_ET_REL -eq 0; then -+ SIZE_original=$(stat -c%s $original) -+ testrun ${abs_top_builddir}/src/strip $original -+ SIZE_stripped=$(stat -c%s $original) -+ test $SIZE_stripped -lt $SIZE_original || -+ { echo "*** failure in-place strip file not smaller $original"; status=1; } -+fi -+ - tempfiles testfile.sections - testrun ${abs_top_builddir}/src/readelf -S testfile.temp > testfile.sections || status=$? - fgrep ' .debug_' testfile.sections && status=1 --- -1.8.3.1 - diff --git a/elfutils-portability-0.162.patch b/elfutils-portability-0.163.patch similarity index 89% rename from elfutils-portability-0.162.patch rename to elfutils-portability-0.163.patch index d81334c..f347ed1 100644 --- a/elfutils-portability-0.162.patch +++ b/elfutils-portability-0.163.patch @@ -1,3 +1,4 @@ +diffelfutils/backends/ChangeLog git-portable/backends/ChangeLog --- elfutils/backends/ChangeLog +++ elfutils/backends/ChangeLog @@ -498,6 +498,10 @@ @@ -33,6 +34,7 @@ * ppc_reloc.def: Update bits per Alan Modra . * ppc64_reloc.def: Likewise. +diffelfutils/backends/Makefile.am git-portable/backends/Makefile.am --- elfutils/backends/Makefile.am +++ elfutils/backends/Makefile.am @@ -119,7 +119,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a @@ -44,19 +46,20 @@ @$(textrel_check) libebl_i386.so: $(cpu_i386) +diffelfutils/backends/Makefile.in git-portable/backends/Makefile.in --- elfutils/backends/Makefile.in +++ elfutils/backends/Makefile.in -@@ -83,7 +83,8 @@ host_triplet = @host@ - DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ - $(noinst_HEADERS) ChangeLog +@@ -90,7 +90,8 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) +@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING subdir = backends ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -289,6 +290,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -300,6 +301,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -64,7 +67,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -320,6 +322,7 @@ SHELL = @SHELL@ +@@ -331,6 +333,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -72,7 +75,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -387,14 +390,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr +@@ -398,14 +401,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr # Warn about stack usage of more than 256K = 262144 bytes. @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 @@ -94,7 +97,7 @@ CLEANFILES = *.gcno *.gcda $(foreach m,$(modules), libebl_$(m).map \ libebl_$(m).so $(am_libebl_$(m)_pic_a_OBJECTS)) textrel_msg = echo "WARNING: TEXTREL found in '$@'" -@@ -900,7 +903,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a +@@ -912,7 +915,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a $(LINK) -shared -o $(@:.map=.so) \ -Wl,--whole-archive $< $(cpu_$*) -Wl,--no-whole-archive \ -Wl,--version-script,$(@:.so=.map) \ @@ -103,9 +106,10 @@ @$(textrel_check) libebl_i386.so: $(cpu_i386) +diffelfutils/ChangeLog git-portable/ChangeLog --- elfutils/ChangeLog +++ elfutils/ChangeLog -@@ -253,6 +253,8 @@ +@@ -258,6 +258,8 @@ 2012-01-24 Mark Wielaard @@ -114,7 +118,7 @@ * COPYING: Fix address. Updated version from gnulib. 2012-01-23 Mark Wielaard -@@ -271,6 +273,9 @@ +@@ -276,6 +278,9 @@ 2011-10-08 Mike Frysinger @@ -124,7 +128,7 @@ * configure.ac: Fix use of AC_ARG_ENABLE to handle $enableval correctly. 2011-10-02 Ulrich Drepper -@@ -292,6 +297,10 @@ +@@ -297,6 +302,10 @@ * configure.ac (LOCALEDIR, DATADIRNAME): Removed. @@ -135,7 +139,7 @@ 2009-09-21 Ulrich Drepper * configure.ac: Update for more modern autoconf. -@@ -300,6 +309,10 @@ +@@ -305,6 +314,10 @@ * configure.ac (zip_LIBS): Check for liblzma too. @@ -146,7 +150,7 @@ 2009-04-19 Roland McGrath * configure.ac (eu_version): Round down here, not in version.h macros. -@@ -311,6 +324,8 @@ +@@ -316,6 +329,8 @@ 2009-01-23 Roland McGrath @@ -155,7 +159,7 @@ * configure.ac (zlib check): Check for gzdirect, need zlib >= 1.2.2.3. * configure.ac (__thread check): Use AC_LINK_IFELSE, in case of -@@ -391,6 +406,10 @@ +@@ -396,6 +411,10 @@ * configure.ac: Add dummy automake conditional to get dependencies for non-generic linker right. See src/Makefile.am. @@ -166,7 +170,7 @@ 2005-11-18 Roland McGrath * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): New variable. -@@ -438,6 +457,17 @@ +@@ -443,6 +462,17 @@ * Makefile.am (all_SUBDIRS): Add libdwfl. * configure.ac: Write libdwfl/Makefile. @@ -184,9 +188,10 @@ 2005-05-19 Roland McGrath * configure.ac [AH_BOTTOM] (INTDECL, _INTDECL): New macros. +diffelfutils/config/ChangeLog git-portable/config/ChangeLog --- elfutils/config/ChangeLog +++ elfutils/config/ChangeLog -@@ -106,6 +106,10 @@ +@@ -110,6 +110,10 @@ * known-dwarf.awk: Use gawk. @@ -197,6 +202,7 @@ 2010-07-02 Ulrich Drepper * elfutils.spec.in: Add more BuildRequires. +diffelfutils/config/eu.am git-portable/config/eu.am --- elfutils/config/eu.am +++ elfutils/config/eu.am @@ -1,6 +1,6 @@ @@ -237,9 +243,10 @@ COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) DEFS.os = -DPIC -DSHARED +diffelfutils/config/Makefile.in git-portable/config/Makefile.in --- elfutils/config/Makefile.in +++ elfutils/config/Makefile.in -@@ -150,6 +150,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -160,6 +160,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -247,7 +254,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -181,6 +182,7 @@ SHELL = @SHELL@ +@@ -191,6 +192,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -255,6 +262,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +diffelfutils/config.h.in git-portable/config.h.in --- elfutils/config.h.in +++ elfutils/config.h.in @@ -6,6 +6,12 @@ @@ -278,6 +286,7 @@ +#undef __thread + #include +diffelfutils/configure git-portable/configure --- elfutils/configure +++ elfutils/configure @@ -672,6 +672,8 @@ ZLIB_TRUE @@ -388,7 +397,7 @@ # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -@@ -4824,6 +4897,18 @@ else +@@ -4825,6 +4898,18 @@ else fi @@ -407,7 +416,7 @@ # We use -std=gnu99 but have explicit checks for some language constructs # and GNU extensions since some compilers claim GNU99 support, but don't # really support all language extensions. In particular we need -@@ -4872,6 +4957,130 @@ if test "x$ac_cv_c99" != xyes; then : +@@ -4873,6 +4958,130 @@ if test "x$ac_cv_c99" != xyes; then : as_fn_error $? "gcc with GNU99 support required" "$LINENO" 5 fi @@ -538,7 +547,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __thread support" >&5 $as_echo_n "checking for __thread support... " >&6; } if ${ac_cv_tls+:} false; then : -@@ -4909,7 +5118,13 @@ fi +@@ -4910,7 +5119,13 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 $as_echo "$ac_cv_tls" >&6; } if test "x$ac_cv_tls" != xyes; then : @@ -553,7 +562,7 @@ fi # Check whether --enable-largefile was given. -@@ -5317,6 +5532,22 @@ else +@@ -5318,6 +5533,22 @@ else fi @@ -576,7 +585,7 @@ # Check whether --enable-tests-rpath was given. if test "${enable_tests_rpath+set}" = set; then : enableval=$enable_tests_rpath; tests_use_rpath=$enableval -@@ -6198,7 +6429,7 @@ case "$eu_version" in +@@ -6199,7 +6430,7 @@ case "$eu_version" in esac # Round up to the next release API (x.y) version. @@ -585,7 +594,7 @@ MODVERSION="Build for ${LIBEBL_SUBDIR} ${eu_version} ${ac_cv_build}" -@@ -7087,6 +7318,10 @@ if test -z "${BUILD_STATIC_TRUE}" && tes +@@ -7088,6 +7319,10 @@ if test -z "${BUILD_STATIC_TRUE}" && tes as_fn_error $? "conditional \"BUILD_STATIC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi @@ -596,6 +605,7 @@ if test -z "${TESTS_RPATH_TRUE}" && test -z "${TESTS_RPATH_FALSE}"; then as_fn_error $? "conditional \"TESTS_RPATH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 +diffelfutils/configure.ac git-portable/configure.ac --- elfutils/configure.ac +++ elfutils/configure.ac @@ -73,6 +73,8 @@ m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) @@ -695,6 +705,7 @@ dnl Unique ID for this build. MODVERSION="Build for ${LIBEBL_SUBDIR} ${eu_version} ${ac_cv_build}" +diffelfutils/lib/ChangeLog git-portable/lib/ChangeLog --- elfutils/lib/ChangeLog +++ elfutils/lib/ChangeLog @@ -73,6 +73,9 @@ @@ -719,6 +730,7 @@ 2005-04-30 Ulrich Drepper * Makefile.am: Use -ffunction-sections for xmalloc.c. +diffelfutils/lib/eu-config.h git-portable/lib/eu-config.h --- elfutils/lib/eu-config.h +++ elfutils/lib/eu-config.h @@ -163,6 +163,17 @@ asm (".section predict_data, \"aw\"; .pr @@ -739,19 +751,20 @@ #ifdef SYMBOL_VERSIONING # define OLD_VERSION(name, version) \ +diffelfutils/lib/Makefile.in git-portable/lib/Makefile.in --- elfutils/lib/Makefile.in +++ elfutils/lib/Makefile.in -@@ -82,7 +82,8 @@ host_triplet = @host@ - DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ - $(noinst_HEADERS) ChangeLog +@@ -89,7 +89,8 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) +@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING subdir = lib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -201,6 +202,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -212,6 +213,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -759,7 +772,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -232,6 +234,7 @@ SHELL = @SHELL@ +@@ -243,6 +245,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -767,7 +780,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -298,13 +301,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr +@@ -309,13 +312,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr # Warn about stack usage of more than 256K = 262144 bytes. @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 @@ -786,6 +799,7 @@ CLEANFILES = *.gcno *.gcda textrel_msg = echo "WARNING: TEXTREL found in '$@'" @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) +diffelfutils/libasm/ChangeLog git-portable/libasm/ChangeLog --- elfutils/libasm/ChangeLog +++ elfutils/libasm/ChangeLog @@ -87,6 +87,11 @@ @@ -800,12 +814,13 @@ 2005-02-15 Ulrich Drepper * Makefile.am (AM_CFLAGS): Add -Wunused -Wextra -Wformat=2. +diffelfutils/libasm/Makefile.in git-portable/libasm/Makefile.in --- elfutils/libasm/Makefile.in +++ elfutils/libasm/Makefile.in -@@ -83,9 +83,10 @@ host_triplet = @host@ - DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ - $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog +@@ -90,9 +90,10 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) +@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING @@ -815,7 +830,7 @@ subdir = libasm ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -252,6 +253,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -263,6 +264,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -823,7 +838,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -283,6 +285,7 @@ SHELL = @SHELL@ +@@ -294,6 +296,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -831,7 +846,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -350,14 +353,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr +@@ -361,14 +364,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr # Warn about stack usage of more than 256K = 262144 bytes. @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 @@ -853,7 +868,7 @@ CLEANFILES = *.gcno *.gcda $(am_libasm_pic_a_OBJECTS) \ libasm.so.$(VERSION) textrel_msg = echo "WARNING: TEXTREL found in '$@'" -@@ -384,7 +387,7 @@ libasm_a_SOURCES = asm_begin.c asm_abort +@@ -395,7 +398,7 @@ libasm_a_SOURCES = asm_begin.c asm_abort libasm_pic_a_SOURCES = am_libasm_pic_a_OBJECTS = $(libasm_a_SOURCES:.c=.os) @@ -862,6 +877,7 @@ libasm_so_SOURCES = noinst_HEADERS = libasmP.h symbolhash.h EXTRA_DIST = libasm.map +diffelfutils/libcpu/ChangeLog git-portable/libcpu/ChangeLog --- elfutils/libcpu/ChangeLog +++ elfutils/libcpu/ChangeLog @@ -51,6 +51,9 @@ @@ -886,6 +902,7 @@ 2005-02-15 Ulrich Drepper * Makefile (AM_CFLAGS): Add -Wunused -Wextra -Wformat=2. +diffelfutils/libcpu/i386_disasm.c git-portable/libcpu/i386_disasm.c --- elfutils/libcpu/i386_disasm.c +++ elfutils/libcpu/i386_disasm.c @@ -822,6 +822,7 @@ i386_disasm (const uint8_t **startp, con @@ -896,19 +913,20 @@ } } else +diffelfutils/libcpu/Makefile.in git-portable/libcpu/Makefile.in --- elfutils/libcpu/Makefile.in +++ elfutils/libcpu/Makefile.in -@@ -84,7 +84,8 @@ DIST_COMMON = $(top_srcdir)/config/eu.am - $(srcdir)/Makefile.am i386_lex.c i386_parse.c \ - $(top_srcdir)/config/depcomp $(top_srcdir)/config/ylwrap \ - $(am__noinst_HEADERS_DIST) ChangeLog +@@ -90,7 +90,8 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) +@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING @MAINTAINER_MODE_TRUE@noinst_PROGRAMS = i386_gendis$(EXEEXT) subdir = libcpu ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -@@ -227,6 +228,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -238,6 +239,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -916,7 +934,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = lex.$( * libdw.h (dwarf_offdie): Fix documentation to mention .debug_info. -@@ -1248,6 +1252,10 @@ +@@ -1263,6 +1267,10 @@ * dwarf_hasattr_integrate.c: Integrate DW_AT_specification too. @@ -967,7 +986,7 @@ 2009-08-10 Roland McGrath * dwarf_getscopevar.c: Use dwarf_diename. -@@ -2016,6 +2024,11 @@ +@@ -2031,6 +2039,11 @@ 2005-05-31 Roland McGrath @@ -979,6 +998,7 @@ * dwarf_formref_die.c (dwarf_formref_die): Add CU header offset to formref offset. +diffelfutils/libdw/dwarf_begin_elf.c git-portable/libdw/dwarf_begin_elf.c --- elfutils/libdw/dwarf_begin_elf.c +++ elfutils/libdw/dwarf_begin_elf.c @@ -47,6 +47,14 @@ @@ -996,6 +1016,7 @@ # include # undef crc32 #endif +diffelfutils/libdw/libdw.h git-portable/libdw/libdw.h --- elfutils/libdw/libdw.h +++ elfutils/libdw/libdw.h @@ -1004,7 +1004,7 @@ extern Dwarf_OOM dwarf_new_oom_handler ( @@ -1007,12 +1028,13 @@ /* Return attribute code of given attribute. */ __libdw_extern_inline unsigned int dwarf_whatattr (Dwarf_Attribute *attr) +diffelfutils/libdw/Makefile.in git-portable/libdw/Makefile.in --- elfutils/libdw/Makefile.in +++ elfutils/libdw/Makefile.in -@@ -84,8 +84,9 @@ DIST_COMMON = $(top_srcdir)/config/eu.am - $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ - $(include_HEADERS) $(noinst_HEADERS) $(pkginclude_HEADERS) \ - ChangeLog +@@ -90,8 +90,9 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -@BUILD_STATIC_TRUE@am__append_2 = -fpic +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) @@ -1021,7 +1043,7 @@ noinst_PROGRAMS = $(am__EXEEXT_1) subdir = libdw ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -@@ -302,6 +303,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -312,6 +313,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1029,7 +1051,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -333,6 +335,7 @@ SHELL = @SHELL@ +@@ -343,6 +345,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -1037,7 +1059,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -399,13 +402,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr +@@ -409,13 +412,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr # Warn about stack usage of more than 256K = 262144 bytes. @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 @@ -1056,19 +1078,20 @@ CLEANFILES = *.gcno *.gcda textrel_msg = echo "WARNING: TEXTREL found in '$@'" @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) +diffelfutils/libdwelf/Makefile.in git-portable/libdwelf/Makefile.in --- elfutils/libdwelf/Makefile.in +++ elfutils/libdwelf/Makefile.in -@@ -82,7 +82,8 @@ host_triplet = @host@ - DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ - $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog +@@ -89,7 +89,8 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) +@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING subdir = libdwelf ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -231,6 +232,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -242,6 +243,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1076,7 +1099,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -262,6 +264,7 @@ SHELL = @SHELL@ +@@ -273,6 +275,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -1084,7 +1107,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -329,14 +332,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr +@@ -340,14 +343,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr # Warn about stack usage of more than 256K = 262144 bytes. @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 @@ -1106,9 +1129,10 @@ CLEANFILES = *.gcno *.gcda $(am_libdwelf_pic_a_OBJECTS) textrel_msg = echo "WARNING: TEXTREL found in '$@'" @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) +diffelfutils/libdwfl/ChangeLog git-portable/libdwfl/ChangeLog --- elfutils/libdwfl/ChangeLog +++ elfutils/libdwfl/ChangeLog -@@ -704,6 +704,21 @@ +@@ -713,6 +713,21 @@ (dwfl_module_addrsym) (i_to_symfile): New function. (dwfl_module_addrsym) (search_table): Use it. @@ -1130,7 +1154,7 @@ 2013-11-07 Jan Kratochvil Mark Wielaard -@@ -2469,6 +2484,11 @@ +@@ -2478,6 +2493,11 @@ 2005-07-21 Roland McGrath @@ -1142,6 +1166,7 @@ * Makefile.am (noinst_HEADERS): Add loc2c.c. * test2.c (main): Check sscanf result to quiet warning. +diffelfutils/libdwfl/linux-core-attach.c git-portable/libdwfl/linux-core-attach.c --- elfutils/libdwfl/linux-core-attach.c +++ elfutils/libdwfl/linux-core-attach.c @@ -29,6 +29,35 @@ @@ -1180,6 +1205,7 @@ #include "../libdw/memory-access.h" +diffelfutils/libdwfl/linux-pid-attach.c git-portable/libdwfl/linux-pid-attach.c --- elfutils/libdwfl/linux-pid-attach.c +++ elfutils/libdwfl/linux-pid-attach.c @@ -255,6 +255,11 @@ void @@ -1210,12 +1236,13 @@ } static void +diffelfutils/libdwfl/Makefile.in git-portable/libdwfl/Makefile.in --- elfutils/libdwfl/Makefile.in +++ elfutils/libdwfl/Makefile.in -@@ -82,10 +82,11 @@ host_triplet = @host@ - DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ - $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog +@@ -89,10 +89,11 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -@ZLIB_TRUE@am__append_2 = gzip.c -@BZLIB_TRUE@am__append_3 = bzip2.c @@ -1228,7 +1255,7 @@ subdir = libdwfl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -290,6 +291,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -301,6 +302,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1236,7 +1263,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -321,6 +323,7 @@ SHELL = @SHELL@ +@@ -332,6 +334,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -1244,7 +1271,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -388,14 +391,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr +@@ -399,14 +402,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr # Warn about stack usage of more than 256K = 262144 bytes. @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 @@ -1266,7 +1293,7 @@ CLEANFILES = *.gcno *.gcda $(am_libdwfl_pic_a_OBJECTS) textrel_msg = echo "WARNING: TEXTREL found in '$@'" @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) -@@ -424,8 +427,8 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_en +@@ -435,8 +438,8 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_en dwfl_module_register_names.c dwfl_segment_report_module.c \ link_map.c core-file.c open.c image-header.c dwfl_frame.c \ frame_unwind.c dwfl_frame_pc.c linux-pid-attach.c \ @@ -1277,9 +1304,10 @@ libdwfl = $(libdw) libdw = ../libdw/libdw.so libelf = ../libelf/libelf.so +diffelfutils/libebl/ChangeLog git-portable/libebl/ChangeLog --- elfutils/libebl/ChangeLog +++ elfutils/libebl/ChangeLog -@@ -780,6 +780,11 @@ +@@ -785,6 +785,11 @@ * Makefile.am (libebl_*_so_SOURCES): Set to $(*_SRCS) so dependency tracking works right. @@ -1291,19 +1319,20 @@ 2005-05-21 Ulrich Drepper * libebl_x86_64.map: Add x86_64_core_note. +diffelfutils/libebl/Makefile.in git-portable/libebl/Makefile.in --- elfutils/libebl/Makefile.in +++ elfutils/libebl/Makefile.in -@@ -82,7 +82,8 @@ host_triplet = @host@ - DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ - $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog +@@ -89,7 +89,8 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) +@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING subdir = libebl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -253,6 +254,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -264,6 +265,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1311,7 +1340,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -284,6 +286,7 @@ SHELL = @SHELL@ +@@ -295,6 +297,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -1319,7 +1348,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -351,13 +354,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr +@@ -362,13 +365,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr # Warn about stack usage of more than 256K = 262144 bytes. @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 @@ -1338,9 +1367,10 @@ CLEANFILES = *.gcno *.gcda $(am_libebl_pic_a_OBJECTS) textrel_msg = echo "WARNING: TEXTREL found in '$@'" @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) +diffelfutils/libelf/ChangeLog git-portable/libelf/ChangeLog --- elfutils/libelf/ChangeLog +++ elfutils/libelf/ChangeLog -@@ -398,6 +398,11 @@ +@@ -412,6 +412,11 @@ * elf-knowledge.h (SECTION_STRIP_P): Remove < SHT_NUM check. @@ -1352,7 +1382,7 @@ 2011-02-26 Mark Wielaard * elf_end.c (elf_end): Call rwlock_unlock before rwlock_fini. -@@ -1075,6 +1080,11 @@ +@@ -1089,6 +1094,11 @@ * elf.h: Update from glibc. @@ -1364,6 +1394,7 @@ 2005-05-08 Roland McGrath * elf_begin.c (read_file) [_MUDFLAP]: Don't use mmap for now. +diffelfutils/libelf/common.h git-portable/libelf/common.h --- elfutils/libelf/common.h +++ elfutils/libelf/common.h @@ -139,7 +139,7 @@ libelf_release_all (Elf *elf) @@ -1384,6 +1415,7 @@ : (sizeof (Var) == 4 \ ? bswap_32 (Var) \ : bswap_64 (Var)))) +diffelfutils/libelf/gnuhash_xlate.h git-portable/libelf/gnuhash_xlate.h --- elfutils/libelf/gnuhash_xlate.h +++ elfutils/libelf/gnuhash_xlate.h @@ -1,5 +1,5 @@ @@ -1404,12 +1436,13 @@ len -= 4; } } +diffelfutils/libelf/Makefile.in git-portable/libelf/Makefile.in --- elfutils/libelf/Makefile.in +++ elfutils/libelf/Makefile.in -@@ -84,10 +84,11 @@ DIST_COMMON = $(top_srcdir)/config/eu.am - $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ - $(include_HEADERS) $(noinst_HEADERS) $(pkginclude_HEADERS) \ - ChangeLog +@@ -90,10 +90,11 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -@BUILD_STATIC_TRUE@am__append_2 = -fpic +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) @@ -1421,7 +1454,7 @@ subdir = libelf ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -295,6 +296,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -305,6 +306,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1429,7 +1462,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -326,6 +328,7 @@ SHELL = @SHELL@ +@@ -336,6 +338,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = 1 @@ -1437,7 +1470,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -391,13 +394,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr +@@ -401,13 +404,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr # Warn about stack usage of more than 256K = 262144 bytes. @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 @@ -1456,7 +1489,7 @@ CLEANFILES = *.gcno *.gcda $(am_libelf_pic_a_OBJECTS) \ libelf.so.$(VERSION) textrel_msg = echo "WARNING: TEXTREL found in '$@'" -@@ -460,7 +464,7 @@ libelf_a_SOURCES = elf_version.c elf_has +@@ -470,7 +474,7 @@ libelf_a_SOURCES = elf_version.c elf_has libelf_pic_a_SOURCES = am_libelf_pic_a_OBJECTS = $(libelf_a_SOURCES:.c=.os) @@ -1465,9 +1498,10 @@ libelf_so_SOURCES = noinst_HEADERS = elf.h abstract.h common.h exttypes.h gelf_xlate.h libelfP.h \ version_xlate.h gnuhash_xlate.h note_xlate.h dl-hash.h +diffelfutils/m4/Makefile.in git-portable/m4/Makefile.in --- elfutils/m4/Makefile.in +++ elfutils/m4/Makefile.in -@@ -148,6 +148,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -159,6 +159,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1475,7 +1509,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -179,6 +180,7 @@ SHELL = @SHELL@ +@@ -190,6 +191,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -1483,9 +1517,10 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +diffelfutils/Makefile.in git-portable/Makefile.in --- elfutils/Makefile.in +++ elfutils/Makefile.in -@@ -266,6 +266,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -277,6 +277,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1493,7 +1528,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -297,6 +298,7 @@ SHELL = @SHELL@ +@@ -308,6 +309,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -1501,6 +1536,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +diffelfutils/src/addr2line.c git-portable/src/addr2line.c --- elfutils/src/addr2line.c +++ elfutils/src/addr2line.c @@ -622,10 +622,10 @@ handle_address (const char *string, Dwfl @@ -1516,6 +1552,7 @@ { default: break; +diffelfutils/src/ar.c git-portable/src/ar.c --- elfutils/src/ar.c +++ elfutils/src/ar.c @@ -685,7 +685,14 @@ do_oper_extract (int oper, const char *a @@ -1533,9 +1570,10 @@ { error (0, errno, gettext ("cannot change modification time of %s"), +diffelfutils/src/ChangeLog git-portable/src/ChangeLog --- elfutils/src/ChangeLog +++ elfutils/src/ChangeLog -@@ -1598,8 +1598,16 @@ +@@ -1626,8 +1626,16 @@ * readelf.c (attr_callback): Use print_block only when we don't use print_ops. @@ -1552,7 +1590,7 @@ * ar.c (do_oper_extract): Use pathconf instead of statfs. 2009-08-01 Ulrich Drepper -@@ -1763,6 +1771,8 @@ +@@ -1791,6 +1799,8 @@ * readelf.c (print_debug_frame_section): Use t instead of j formats for ptrdiff_t OFFSET. @@ -1561,7 +1599,7 @@ 2009-01-21 Ulrich Drepper * elflint.c (check_program_header): Fix typo in .eh_frame_hdr section -@@ -1946,6 +1956,11 @@ +@@ -1974,6 +1984,11 @@ that matches its PT_LOAD's p_flags &~ PF_W. On sparc, PF_X really is valid in RELRO. @@ -1573,7 +1611,7 @@ 2008-02-29 Roland McGrath * readelf.c (print_attributes): Add a cast. -@@ -2197,6 +2212,8 @@ +@@ -2225,6 +2240,8 @@ * readelf.c (hex_dump): Fix rounding error in whitespace calculation. @@ -1582,7 +1620,7 @@ 2007-10-15 Roland McGrath * make-debug-archive.in: New file. -@@ -2636,6 +2653,10 @@ +@@ -2664,6 +2681,10 @@ * elflint.c (valid_e_machine): Add EM_ALPHA. Reported by Christian Aichinger . @@ -1593,7 +1631,7 @@ 2006-08-08 Ulrich Drepper * elflint.c (check_dynamic): Don't require DT_HASH for DT_SYMTAB. -@@ -2712,6 +2733,10 @@ +@@ -2740,6 +2761,10 @@ * Makefile.am: Add hacks to create dependency files for non-generic linker. @@ -1604,7 +1642,7 @@ 2006-06-12 Ulrich Drepper * ldgeneric.c (ld_generic_generate_sections): Don't create .interp -@@ -3060,6 +3085,11 @@ +@@ -3088,6 +3113,11 @@ * readelf.c (print_debug_loc_section): Fix indentation for larger address size. @@ -1616,9 +1654,10 @@ 2005-05-30 Roland McGrath * readelf.c (print_debug_line_section): Print section offset of each +diffelfutils/src/findtextrel.c git-portable/src/findtextrel.c --- elfutils/src/findtextrel.c +++ elfutils/src/findtextrel.c -@@ -502,7 +502,11 @@ ptrcompare (const void *p1, const void * +@@ -503,7 +503,11 @@ ptrcompare (const void *p1, const void * static void @@ -1631,6 +1670,7 @@ GElf_Addr addr, Elf *elf, Elf_Scn *symscn, Dwarf *dw, const char *fname, bool more_than_one, void **knownsrcs) { +diffelfutils/src/ld.h git-portable/src/ld.h --- elfutils/src/ld.h +++ elfutils/src/ld.h @@ -1114,6 +1114,7 @@ extern bool dynamically_linked_p (void); @@ -1648,6 +1688,7 @@ +#endif /* Optimizing and not GCC 4.2. */ #endif /* ld.h */ +diffelfutils/src/Makefile.am git-portable/src/Makefile.am --- elfutils/src/Makefile.am +++ elfutils/src/Makefile.am @@ -90,6 +90,11 @@ endif @@ -1662,19 +1703,20 @@ # Bad, bad stack usage... readelf_no_Wstack_usage = yes nm_no_Wstack_usage = yes +diffelfutils/src/Makefile.in git-portable/src/Makefile.in --- elfutils/src/Makefile.in +++ elfutils/src/Makefile.in -@@ -85,7 +85,8 @@ DIST_COMMON = $(top_srcdir)/config/eu.am - $(srcdir)/Makefile.am ldlex.c ldscript.c \ - $(top_srcdir)/config/depcomp $(top_srcdir)/config/ylwrap \ - $(noinst_HEADERS) ChangeLog +@@ -91,7 +91,8 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) +@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEEXT) size$(EXEEXT) \ strip$(EXEEXT) ld$(EXEEXT) elflint$(EXEEXT) \ findtextrel$(EXEEXT) addr2line$(EXEEXT) elfcmp$(EXEEXT) \ -@@ -94,9 +95,9 @@ bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEE +@@ -100,9 +101,9 @@ bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEE @NATIVE_LD_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1) # We never build this library but we need to get the dependency files # of all the linker backends that might be used in a non-generic linker. @@ -1686,7 +1728,7 @@ @NATIVE_LD_TRUE@am_libld_elf_i386_pic_a_OBJECTS = subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -@@ -164,7 +165,7 @@ am_ld_OBJECTS = ld.$(OBJEXT) ldgeneric.$ +@@ -172,7 +173,7 @@ am_ld_OBJECTS = ld.$(OBJEXT) ldgeneric.$ versionhash.$(OBJEXT) ld_OBJECTS = $(am_ld_OBJECTS) ld_DEPENDENCIES = $(libebl) $(libelf) $(libeu) $(am__DEPENDENCIES_1) \ @@ -1695,7 +1737,7 @@ ld_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(ld_LDFLAGS) $(LDFLAGS) -o \ $@ am_libld_elf_i386_so_OBJECTS = -@@ -350,6 +351,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -361,6 +362,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -1703,7 +1745,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -381,6 +383,7 @@ SHELL = @SHELL@ +@@ -392,6 +394,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -1711,7 +1753,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -449,14 +452,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr +@@ -460,14 +463,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr # Warn about stack usage of more than 256K = 262144 bytes. @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 @@ -1733,7 +1775,7 @@ CLEANFILES = *.gcno *.gcda make-debug-archive none_ld.os \ $(ld_modules:.c=.os) *.gconv textrel_msg = echo "WARNING: TEXTREL found in '$@'" -@@ -469,8 +472,8 @@ AM_LFLAGS = -Pld -olex.yy.c +@@ -480,8 +483,8 @@ AM_LFLAGS = -Pld -olex.yy.c native_ld = @native_ld@ ld_dsos = libld_elf_i386_pic.a @NATIVE_LD_FALSE@noinst_LIBRARIES = libld_elf.a libar.a $(ld_dsos) \ @@ -1744,7 +1786,7 @@ @NATIVE_LD_TRUE@native_ld_cflags = -DBASE_ELF_NAME=elf_$(base_cpu) @NEVER_TRUE@libdummy_a_SOURCES = i386_ld.c ld_SOURCES = ld.c ldgeneric.c ldlex.l ldscript.y symbolhash.c sectionhash.c \ -@@ -498,6 +501,11 @@ libeu = ../lib/libeu.a +@@ -509,6 +512,11 @@ libeu = ../lib/libeu.a ldgeneric_no_Wunused = yes ldgeneric_no_Wstack_usage = yes @@ -1756,7 +1798,7 @@ # Bad, bad stack usage... readelf_no_Wstack_usage = yes nm_no_Wstack_usage = yes -@@ -517,7 +525,7 @@ nm_LDADD = $(libdw) $(libebl) $(libelf) +@@ -528,7 +536,7 @@ nm_LDADD = $(libdw) $(libebl) $(libelf) size_LDADD = $(libelf) $(libeu) $(argp_LDADD) strip_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl ld_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl \ @@ -1765,9 +1807,10 @@ ld_LDFLAGS = -rdynamic elflint_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl findtextrel_LDADD = $(libdw) $(libelf) $(argp_LDADD) +diffelfutils/src/readelf.c git-portable/src/readelf.c --- elfutils/src/readelf.c +++ elfutils/src/readelf.c -@@ -4364,10 +4364,12 @@ listptr_base (struct listptr *p) +@@ -4366,10 +4366,12 @@ listptr_base (struct listptr *p) return base; } @@ -1782,7 +1825,7 @@ struct listptr *p1 = (void *) a; struct listptr *p2 = (void *) b; -@@ -4463,8 +4465,11 @@ static void +@@ -4465,8 +4467,11 @@ static void sort_listptr (struct listptr_table *table, const char *name) { if (table->n > 0) @@ -1796,7 +1839,7 @@ } static bool -@@ -9561,7 +9566,7 @@ dump_archive_index (Elf *elf, const char +@@ -9563,7 +9568,7 @@ dump_archive_index (Elf *elf, const char if (unlikely (elf_rand (elf, as_off) == 0) || unlikely ((subelf = elf_begin (-1, ELF_C_READ_MMAP, elf)) == NULL)) @@ -1805,6 +1848,7 @@ while (1) #endif error (EXIT_FAILURE, 0, +diffelfutils/src/strings.c git-portable/src/strings.c --- elfutils/src/strings.c +++ elfutils/src/strings.c @@ -43,6 +43,10 @@ @@ -1844,6 +1888,7 @@ } if (unlikely (elfmap == MAP_FAILED)) +diffelfutils/src/strip.c git-portable/src/strip.c --- elfutils/src/strip.c +++ elfutils/src/strip.c @@ -2191,7 +2191,14 @@ while computing checksum for debug infor @@ -1876,6 +1921,7 @@ { error (0, errno, gettext ("\ cannot set access and modification date of '%s'"), fname); +diffelfutils/tests/backtrace.c git-portable/tests/backtrace.c --- elfutils/tests/backtrace.c +++ elfutils/tests/backtrace.c @@ -36,6 +36,7 @@ @@ -1886,9 +1932,10 @@ #include ELFUTILS_HEADER(dwfl) #ifndef __linux__ +diffelfutils/tests/ChangeLog git-portable/tests/ChangeLog --- elfutils/tests/ChangeLog +++ elfutils/tests/ChangeLog -@@ -609,6 +609,13 @@ +@@ -614,6 +614,13 @@ 2013-12-02 Jan Kratochvil @@ -1902,7 +1949,7 @@ * Makefile.am (check_PROGRAMS): Add backtrace, backtrace-child, backtrace-data and backtrace-dwarf. (BUILT_SOURCES, clean-local, backtrace-child-biarch): New. -@@ -1473,6 +1480,8 @@ +@@ -1478,6 +1485,8 @@ 2008-01-21 Roland McGrath @@ -1911,7 +1958,7 @@ * testfile45.S.bz2: Add tests for cltq, cqto. * testfile45.expect.bz2: Adjust. -@@ -2181,6 +2190,11 @@ +@@ -2186,6 +2195,11 @@ * Makefile.am (TESTS): Add run-elflint-test.sh. (EXTRA_DIST): Add run-elflint-test.sh and testfile18.bz2. @@ -1923,6 +1970,7 @@ 2005-05-24 Ulrich Drepper * get-files.c (main): Use correct format specifier. +diffelfutils/tests/line2addr.c git-portable/tests/line2addr.c --- elfutils/tests/line2addr.c +++ elfutils/tests/line2addr.c @@ -124,7 +124,7 @@ main (int argc, char *argv[]) @@ -1934,6 +1982,7 @@ { default: case 0: +diffelfutils/tests/Makefile.am git-portable/tests/Makefile.am --- elfutils/tests/Makefile.am +++ elfutils/tests/Makefile.am @@ -382,6 +382,7 @@ get_lines_LDADD = $(libdw) $(libelf) @@ -1944,12 +1993,13 @@ line2addr_LDADD = $(libdw) $(argp_LDADD) addrscopes_LDADD = $(libdw) $(argp_LDADD) funcscopes_LDADD = $(libdw) $(argp_LDADD) +diffelfutils/tests/Makefile.in git-portable/tests/Makefile.in --- elfutils/tests/Makefile.in +++ elfutils/tests/Makefile.in -@@ -80,14 +80,15 @@ host_triplet = @host@ - DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \ - $(top_srcdir)/config/test-driver ChangeLog +@@ -87,14 +87,15 @@ PRE_UNINSTALL = : + POST_UNINSTALL = : + build_triplet = @build@ + host_triplet = @host@ -@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -@STANDALONE_FALSE@am__append_2 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \ +@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) @@ -1966,7 +2016,7 @@ check_PROGRAMS = arextract$(EXEEXT) arsymtest$(EXEEXT) \ newfile$(EXEEXT) saridx$(EXEEXT) scnnames$(EXEEXT) \ sectiondump$(EXEEXT) showptable$(EXEEXT) update1$(EXEEXT) \ -@@ -116,7 +117,7 @@ check_PROGRAMS = arextract$(EXEEXT) arsy +@@ -123,7 +124,7 @@ check_PROGRAMS = arextract$(EXEEXT) arsy aggregate_size$(EXEEXT) vdsosyms$(EXEEXT) getsrc_die$(EXEEXT) \ strptr$(EXEEXT) newdata$(EXEEXT) elfstrtab$(EXEEXT) \ $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4) @@ -1975,7 +2025,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile$(EXEEXT) \ test-nlist$(EXEEXT) update1$(EXEEXT) update2$(EXEEXT) \ update3$(EXEEXT) update4$(EXEEXT) run-show-die-info.sh \ -@@ -166,14 +167,14 @@ TESTS = run-arextract.sh run-arsymtest.s +@@ -173,14 +174,14 @@ TESTS = run-arextract.sh run-arsymtest.s run-allfcts-multi.sh run-deleted.sh run-linkmap-cut.sh \ run-aggregate-size.sh vdsosyms$(EXEEXT) run-readelf-A.sh \ run-getsrc-die.sh run-strptr.sh newdata$(EXEEXT) \ @@ -1996,7 +2046,7 @@ subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -819,6 +820,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -830,6 +831,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ @@ -2004,7 +2054,7 @@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -850,6 +852,7 @@ SHELL = @SHELL@ +@@ -861,6 +863,7 @@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ @@ -2012,7 +2062,7 @@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -910,26 +913,26 @@ top_build_prefix = @top_build_prefix@ +@@ -921,26 +924,26 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ zip_LIBS = @zip_LIBS@ @@ -2048,7 +2098,7 @@ @TESTS_RPATH_FALSE@tests_rpath = no @TESTS_RPATH_TRUE@tests_rpath = yes asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ -@@ -1156,6 +1159,7 @@ get_lines_LDADD = $(libdw) $(libelf) +@@ -1167,6 +1170,7 @@ get_lines_LDADD = $(libdw) $(libelf) get_files_LDADD = $(libdw) $(libelf) get_aranges_LDADD = $(libdw) $(libelf) allfcts_LDADD = $(libdw) $(libelf) diff --git a/elfutils.spec b/elfutils.spec index 37b2823..06684a6 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects -Version: 0.162 -%global baserelease 2 +Version: 0.163 +%global baserelease 1 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -46,9 +46,6 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: %{?source_url}elfutils-portability-%{version}.patch -# https://bugzilla.redhat.com/show_bug.cgi?id=1232206 -Patch2: elfutils-0.162-ftruncate-allocate.patch - %if !%{compat} Release: %{baserelease}%{?dist} %else @@ -208,8 +205,6 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %endif %endif -%patch2 -p1 -b .ftruncate - find . -name \*.sh ! -perm -0100 -print | xargs chmod +x %build @@ -338,6 +333,10 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Fri Jun 19 2015 Mark Wielaard - 0.163-1 +- Update to 0.163 + - Drop elfutils-0.162-ftruncate-allocate.patch + * Tue Jun 16 2015 Mark Wielaard - 0.162-2 - Add elfutils-0.162-ftruncate-allocate.patch (#1232206) diff --git a/sources b/sources index 5837cff..5b9fbad 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -9334cbcc0df7669b7bf07cf7fc3ad52c elfutils-0.162.tar.bz2 +77ce87f259987d2e54e4d87b86cbee41 elfutils-0.163.tar.bz2 From 2ec85ab820b289690eca6f698504c0a1d6879cd0 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 3 Aug 2015 13:54:30 +0200 Subject: [PATCH 013/216] 0.163-2 - Add elfutils-0.163-unstrip-shf_info_link.patch --- elfutils.spec | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 06684a6..e27e1a7 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.163 -%global baserelease 1 +%global baserelease 2 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -46,6 +46,8 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: %{?source_url}elfutils-portability-%{version}.patch +Patch2: elfutils-0.163-unstrip-shf_info_link.patch + %if !%{compat} Release: %{baserelease}%{?dist} %else @@ -205,6 +207,8 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %endif %endif +%patch2 -p1 -b .shf_info_link + find . -name \*.sh ! -perm -0100 -print | xargs chmod +x %build @@ -333,6 +337,9 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libelf.a %changelog +* Mon Aug 03 2015 Mark Wielaard - 0.163-2 +- Add elfutils-0.163-unstrip-shf_info_link.patch + * Fri Jun 19 2015 Mark Wielaard - 0.163-1 - Update to 0.163 - Drop elfutils-0.162-ftruncate-allocate.patch From 73d5406ef38417bb9abf44de52b89a35ea4f9205 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 3 Aug 2015 14:02:25 +0200 Subject: [PATCH 014/216] Add elfutils-0.163-unstrip-shf_info_link.patch --- elfutils-0.163-unstrip-shf_info_link.patch | 91 ++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 elfutils-0.163-unstrip-shf_info_link.patch diff --git a/elfutils-0.163-unstrip-shf_info_link.patch b/elfutils-0.163-unstrip-shf_info_link.patch new file mode 100644 index 0000000..e3a27ff --- /dev/null +++ b/elfutils-0.163-unstrip-shf_info_link.patch @@ -0,0 +1,91 @@ +commit f9fc50c3eced243c0648fb0fbfe2c9877c25e1e4 +Author: Mark Wielaard +Date: Wed Jul 29 17:51:27 2015 +0200 + + unstrip: Handle debuginfo files with missing SHF_INFO_LINK section flags. + + With GCC 5 there might be a .rela.plt section with SHF_INFO_LINK set. + Buggy binutils objdump might strip it from the section in the debug file. + Ignore such differences for relocation sections and put the flag back + if necessary. + + Also improve the error message a little by only discarding the already + matched sections if there is an prelink undo section. Otherwise we will + report all sections as not matching if the file wasn't prelinked instead + of just the non-matching sections. + + New testfiles generated by gcc5 and binutils objdump added. + + Signed-off-by: Mark Wielaard + +diff --git a/src/unstrip.c b/src/unstrip.c +index 4a8e5fa..8833094 100644 +--- a/src/unstrip.c ++++ b/src/unstrip.c +@@ -867,12 +867,28 @@ compare_symbols_output (const void *a, const void *b) + + #undef CMP + ++/* Return true if the flags of the sections match, ignoring the SHF_INFO_LINK ++ flag if the section contains relocation information. */ ++static bool ++sections_flags_match (Elf64_Xword sh_flags1, Elf64_Xword sh_flags2, ++ Elf64_Word sh_type) ++{ ++ if (sh_type == SHT_REL || sh_type == SHT_RELA) ++ { ++ sh_flags1 &= ~SHF_INFO_LINK; ++ sh_flags2 &= ~SHF_INFO_LINK; ++ } ++ ++ return sh_flags1 == sh_flags2; ++} ++ + /* Return true iff the flags, size, and name match. */ + static bool + sections_match (const struct section *sections, size_t i, + const GElf_Shdr *shdr, const char *name) + { +- return (sections[i].shdr.sh_flags == shdr->sh_flags ++ return (sections_flags_match (sections[i].shdr.sh_flags, shdr->sh_flags, ++ sections[i].shdr.sh_type) + && (sections[i].shdr.sh_size == shdr->sh_size + || (sections[i].shdr.sh_size < shdr->sh_size + && section_can_shrink (§ions[i].shdr))) +@@ -930,10 +946,6 @@ find_alloc_sections_prelink (Elf *debug, Elf_Data *debug_shstrtab, + struct section *sections, + size_t nalloc, size_t nsections) + { +- /* Clear assignments that might have been bogus. */ +- for (size_t i = 0; i < nalloc; ++i) +- sections[i].outscn = NULL; +- + Elf_Scn *undo = NULL; + for (size_t i = nalloc; i < nsections; ++i) + { +@@ -952,6 +964,10 @@ find_alloc_sections_prelink (Elf *debug, Elf_Data *debug_shstrtab, + size_t undo_nalloc = 0; + if (undo != NULL) + { ++ /* Clear assignments that might have been bogus. */ ++ for (size_t i = 0; i < nalloc; ++i) ++ sections[i].outscn = NULL; ++ + Elf_Data *undodata = elf_rawdata (undo, NULL); + ELF_CHECK (undodata != NULL, + _("cannot read '.gnu.prelink_undo' section: %s")); +@@ -1500,6 +1516,14 @@ more sections in stripped file than debug file -- arguments reversed?")); + shdr_mem.sh_size = sec->shdr.sh_size; + shdr_mem.sh_info = sec->shdr.sh_info; + shdr_mem.sh_link = sec->shdr.sh_link; ++ ++ /* Buggy binutils objdump might have stripped the SHF_INFO_LINK ++ put it back if necessary. */ ++ if ((sec->shdr.sh_type == SHT_REL || sec->shdr.sh_type == SHT_RELA) ++ && sec->shdr.sh_flags != shdr_mem.sh_flags ++ && (sec->shdr.sh_flags & SHF_INFO_LINK) != 0) ++ shdr_mem.sh_flags |= SHF_INFO_LINK; ++ + if (sec->shdr.sh_link != SHN_UNDEF) + shdr_mem.sh_link = ndx_section[sec->shdr.sh_link - 1]; + if (shdr_mem.sh_flags & SHF_INFO_LINK) From 61e0d33b8accc50e031390d3b04aa4a7305f62e2 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 4 Aug 2015 14:27:51 +0200 Subject: [PATCH 015/216] 0.163-3 - Add elfutils-0.163-default-yama-conf.patch Provides: default-yama-scope Resolves: #1250079 --- elfutils-0.163-default-yama-conf.patch | 166 +++++++++++++++++++++++++ elfutils.spec | 49 +++++++- 2 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.163-default-yama-conf.patch diff --git a/elfutils-0.163-default-yama-conf.patch b/elfutils-0.163-default-yama-conf.patch new file mode 100644 index 0000000..4f2ab29 --- /dev/null +++ b/elfutils-0.163-default-yama-conf.patch @@ -0,0 +1,166 @@ +commit 65a818baa4bcae96c1e9516420fcd87a2db3c863 +Author: Mark Wielaard +Date: Tue Aug 4 12:20:20 2015 +0200 + + spec: Provide default-yama-scope. + + When yama is enabled in the kernel it might be used to filter any user + space access which requires PTRACE_MODE_ATTACH like ptrace attach, access + to /proc/PID/{mem,personality,stack,syscall}, and the syscalls + process_vm_readv and process_vm_writev which are used for interprocess + services, communication and introspection (like synchronisation, signaling, + debugging, tracing and profiling) of processes. + + These are precisely the things that libdw dwfl and ebl backends rely on. + So make sure they don't mysteriously fail in such cases by providing the + default yama scope sysctl value. + + This is implemented as a separate subpackage that just provides this + functionality so other packages that don't directly rely on elfutils-libs + can also just Require: default-yama-scope to function properly. + https://bugzilla.redhat.com/show_bug.cgi?id=1209492#c69 + + Signed-off-by: Mark Wielaard + +diff --git a/config/10-default-yama-scope.conf b/config/10-default-yama-scope.conf +new file mode 100644 +index 0000000..ba78ebd +--- /dev/null ++++ b/config/10-default-yama-scope.conf +@@ -0,0 +1,35 @@ ++# When yama is enabled in the kernel it might be used to filter any user ++# space access which requires PTRACE_MODE_ATTACH like ptrace attach, access ++# to /proc/PID/{mem,personality,stack,syscall}, and the syscalls ++# process_vm_readv and process_vm_writev which are used for interprocess ++# services, communication and introspection (like synchronisation, signaling, ++# debugging, tracing and profiling) of processes. ++# ++# Usage of ptrace attach is restricted by normal user permissions. Normal ++# unprivileged processes cannot interact through ptrace with processes ++# that they cannot send signals to or processes that are running set-uid ++# or set-gid. ++# ++# yama ptrace scope can be used to reduce these permissions even more. ++# This should normally not be done because it will break various programs ++# relying on the default ptrace security restrictions. But can be used ++# if you don't have any other way to separate processes in their own ++# domains. A different way to restrict ptrace is to set the selinux ++# deny_ptrace boolean. Both mechanisms will break some programs relying ++# on the ptrace system call and might force users to elevate their ++# priviliges to root to do their work. ++# ++# For more information see Documentation/security/Yama.txt in the kernel ++# sources. Which also describes the defaults when CONFIG_SECURITY_YAMA ++# is enabled in a kernel build (currently 1 for ptrace_scope). ++# ++# This runtime kernel parameter can be set to the following options: ++# (Note that setting this to anything except zero will break programs!) ++# ++# 0 - Default attach security permissions. ++# 1 - Restricted attach. Only child processes plus normal permissions. ++# 2 - Admin-only attach. Only executables with CAP_SYS_PTRACE. ++# 3 - No attach. No process may call ptrace at all. Irrevocable. ++# ++kernel.yama.ptrace_scope = 0 ++ +diff --git a/config/ChangeLog b/config/ChangeLog +index 00f3ddc..31eeca7 100644 +--- a/config/ChangeLog ++++ b/config/ChangeLog +@@ -1,3 +1,10 @@ ++2015-08-04 Mark Wielaard ++ ++ * 10-default-yama-scope.conf: New file. ++ * Makefile.am (EXTRA_DIST): Add 10-default-yama-scope.conf. ++ * elfutils.spec.in (Requires): default-yama-scope. ++ (default-yama-scope): New package. ++ + 2015-06-19 Mark Wielaard + + * elfutils.spec.in: Update for 0.163. +diff --git a/config/Makefile.am b/config/Makefile.am +index 6e61b77..23f7b65 100644 +--- a/config/Makefile.am ++++ b/config/Makefile.am +@@ -1,7 +1,7 @@ + ## Process this file with automake to produce Makefile.in -*-Makefile-*- + ## Configure input file for elfutils. + ## +-## Copyright (C) 2004, 2005, 2008, 2009, 2011 Red Hat, Inc. ++## Copyright (C) 2004, 2005, 2008, 2009, 2011, 2015 Red Hat, Inc. + ## This file is part of elfutils. + ## + ## This file is free software; you can redistribute it and/or modify +@@ -28,7 +28,7 @@ + ## the GNU Lesser General Public License along with this program. If + ## not, see . + ## +-EXTRA_DIST = elfutils.spec.in known-dwarf.awk ++EXTRA_DIST = elfutils.spec.in known-dwarf.awk 10-default-yama-scope.conf + + if MAINTAINER_MODE + $(srcdir)/elfutils.spec.in: $(top_srcdir)/NEWS +diff --git a/config/elfutils.spec.in b/config/elfutils.spec.in +index 5407f1a..e5f6e29 100644 +--- a/config/elfutils.spec.in ++++ b/config/elfutils.spec.in +@@ -10,6 +10,7 @@ Obsoletes: libelf libelf-devel + Requires: elfutils-libelf = %{version}-%{release} + Requires: glibc >= 2.7 + Requires: libstdc++ ++Requires: default-yama-scope + + # ExcludeArch: xxx + +@@ -97,6 +98,22 @@ Conflicts: libelf-devel + The elfutils-libelf-static package contains the static archive + for libelf. + ++%package default-yama-scope ++Summary: Default yama attach scope sysctl setting ++Group: Development/Tools ++License: GPLv2+ or LGPLv3+ ++Provides: default-yama-scope ++BuildArch: noarch ++ ++%description default-yama-scope ++Yama sysctl setting to enable default attach scope settings ++enabling programs to use ptrace attach, access to ++/proc/PID/{mem,personality,stack,syscall}, and the syscalls ++process_vm_readv and process_vm_writev which are used for ++interprocess services, communication and introspection ++(like synchronisation, signaling, debugging, tracing and ++profiling) of processes. ++ + %prep + %setup -q + +@@ -121,6 +138,8 @@ chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/elfutils/lib*.so* + rm -f .%{_libdir}/libasm.a + } + ++install -Dm0644 config/10-default-yama-scope.conf ${RPM_BUILD_ROOT}%{_sysctldir}/10-default-yama-scope.conf ++ + %check + make check + +@@ -135,6 +154,9 @@ rm -rf ${RPM_BUILD_ROOT} + + %postun libelf -p /sbin/ldconfig + ++%post default-yama-scope ++%sysctl_apply 10-default-yama-scope.conf ++ + %files + %defattr(-,root,root) + %doc COPYING COPYING-GPLV2 COPYING-LGPLV3 README TODO CONTRIBUTING +@@ -197,6 +219,9 @@ rm -rf ${RPM_BUILD_ROOT} + %files libelf-devel-static + %{_libdir}/libelf.a + ++%files default-yama-scope ++%config(noreplace) %{_sysctldir}/10-default-yama-scope.conf ++ + %changelog + * Fri Jun 19 2015 Mark Wielaard 0.163-1 + - Bug fixes only, no new features. diff --git a/elfutils.spec b/elfutils.spec index e27e1a7..77b7a04 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.163 -%global baserelease 2 +%global baserelease 3 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -18,6 +18,7 @@ Group: Development/Tools %global separate_devel_static 1 %global use_zlib 0 %global use_xz 0 +%global provide_yama_scope 0 %if 0%{?rhel} %global portability (%rhel < 6) @@ -32,6 +33,7 @@ Group: Development/Tools %global separate_devel_static (%fedora >= 7) %global use_zlib (%fedora >= 5) %global use_xz (%fedora >= 10) +%global provide_yama_scope (%fedora >= 22) %endif %if %{compat} || %{!?rhel:6}%{?rhel} < 6 @@ -48,6 +50,8 @@ Patch1: %{?source_url}elfutils-portability-%{version}.patch Patch2: elfutils-0.163-unstrip-shf_info_link.patch +Patch3: elfutils-0.163-default-yama-conf.patch + %if !%{compat} Release: %{baserelease}%{?dist} %else @@ -99,6 +103,9 @@ License: GPLv2+ or LGPLv3+ Provides: elfutils-libs%{depsuffix} = %{version}-%{release} %endif Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} +%if %{provide_yama_scope} +Requires: default-yama-scope +%endif %description libs The elfutils-libs package contains libraries which implement DWARF, ELF, @@ -187,6 +194,26 @@ Requires: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} The elfutils-libelf-static package contains the static archive for libelf. +%if %{provide_yama_scope} +%package default-yama-scope +Summary: Default yama attach scope sysctl setting +Group: Development/Tools +License: GPLv2+ or LGPLv3+ +Provides: default-yama-scope +BuildArch: noarch +# For the sysctl_apply macro +BuildRequires: systemd >= 215 + +%description default-yama-scope +Yama sysctl setting to enable default attach scope settings +enabling programs to use ptrace attach, access to +/proc/PID/{mem,personality,stack,syscall}, and the syscalls +process_vm_readv and process_vm_writev which are used for +interprocess services, communication and introspection +(like synchronisation, signaling, debugging, tracing and +profiling) of processes. +%endif + %prep %setup -q @@ -208,6 +235,7 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %endif %patch2 -p1 -b .shf_info_link +%patch3 -p1 -b .yama_scope find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -250,6 +278,10 @@ chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/elfutils/lib*.so* %find_lang %{name} +%if %{provide_yama_scope} +install -Dm0644 config/10-default-yama-scope.conf ${RPM_BUILD_ROOT}%{_sysctldir}/10-default-yama-scope.conf +%endif + %check make -s %{?_smp_mflags} check || (cat tests/test-suite.log; %{nocheck}) @@ -264,6 +296,11 @@ rm -rf ${RPM_BUILD_ROOT} %postun libelf -p /sbin/ldconfig +%if %{provide_yama_scope} +%post default-yama-scope +%sysctl_apply 10-default-yama-scope.conf +%endif + %files %defattr(-,root,root) %{!?_licensedir:%global license %%doc} @@ -336,7 +373,17 @@ rm -rf ${RPM_BUILD_ROOT} %defattr(-,root,root) %{_libdir}/libelf.a +%if %{provide_yama_scope} +%files default-yama-scope +%defattr(-,root,root) +%config(noreplace) %{_sysctldir}/10-default-yama-scope.conf +%endif + %changelog +* Tue Aug 04 2015 Mark Wielaard - 0.163-3 +- Add elfutils-0.163-default-yama-conf.patch (#1250079) + Provides: default-yama-scope + * Mon Aug 03 2015 Mark Wielaard - 0.163-2 - Add elfutils-0.163-unstrip-shf_info_link.patch From a7b60d7ccf8b31846a09b2d0b3e6c2f45cbee4e0 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 7 Sep 2015 13:00:00 +0200 Subject: [PATCH 016/216] 0.163-4 Add elfutils-0.163-readelf-n-undefined-shift.patch Resolves: #1259259 --- ...tils-0.163-readelf-n-undefined-shift.patch | 49 +++++++++++++++++++ elfutils.spec | 8 ++- 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.163-readelf-n-undefined-shift.patch diff --git a/elfutils-0.163-readelf-n-undefined-shift.patch b/elfutils-0.163-readelf-n-undefined-shift.patch new file mode 100644 index 0000000..a26e209 --- /dev/null +++ b/elfutils-0.163-readelf-n-undefined-shift.patch @@ -0,0 +1,49 @@ +commit b00a4fa78779ff0f304fa6cb34d49622679c86d4 +Author: Mark Wielaard +Date: Thu Sep 3 10:50:58 2015 +0200 + + readelf: handle_core_item large right shift triggers undefined behaviour. + + The problem is this: + + int n = ffs (w); + w >>= n; + + The intent is to shift away up to (and including) the first least + significant bit in w. But w is an unsigned int, so 32 bits. And the + least significant bit could be bit 32 (ffs counts from 1). Unfortunately + a right shift equal to (or larger than) the length in bits of the left + hand operand is undefined behaviour. We expect w to be zero afterwards. + Which would terminate the while loop in the function. But since it is + undefined behaviour anything can happen. In this case, what will actually + happen is that w is unchanged, causing an infinite loop... + + gcc -fsanitize=undefined will catch and warn about this when w = 0x80000000 + + https://bugzilla.redhat.com/show_bug.cgi?id=1259259 + + Signed-off-by: Mark Wielaard + +diff --git a/src/readelf.c b/src/readelf.c +index d3c2b6b..aab8b5c 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -8474,8 +8474,16 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc, + unsigned int w = negate ? ~*i : *i; + while (w != 0) + { +- int n = ffs (w); +- w >>= n; ++ /* Note that a right shift equal to (or greater than) ++ the number of bits of w is undefined behaviour. In ++ particular when the least significant bit is bit 32 ++ (w = 0x8000000) then w >>= n is undefined. So ++ explicitly handle that case separately. */ ++ unsigned int n = ffs (w); ++ if (n < sizeof (w) * 8) ++ w >>= n; ++ else ++ w = 0; + bit += n; + + if (lastbit != 0 && lastbit + 1 == bit) diff --git a/elfutils.spec b/elfutils.spec index 77b7a04..ec4fbfc 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.163 -%global baserelease 3 +%global baserelease 4 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -49,8 +49,8 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: %{?source_url}elfutils-portability-%{version}.patch Patch2: elfutils-0.163-unstrip-shf_info_link.patch - Patch3: elfutils-0.163-default-yama-conf.patch +Patch4: elfutils-0.163-readelf-n-undefined-shift.patch %if !%{compat} Release: %{baserelease}%{?dist} @@ -236,6 +236,7 @@ sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c %patch2 -p1 -b .shf_info_link %patch3 -p1 -b .yama_scope +%patch4 -p1 -b .right_shift find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -380,6 +381,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Mon Sep 07 2015 Mark Wielaard - 0.163-4 +- Add elfutils-0.163-readelf-n-undefined-shift.patch (#1259259) + * Tue Aug 04 2015 Mark Wielaard - 0.163-3 - Add elfutils-0.163-default-yama-conf.patch (#1250079) Provides: default-yama-scope From 6d2dbb504060b436b649b029041ffe9f5156ae4a Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 16 Oct 2015 17:04:24 +0200 Subject: [PATCH 017/216] 0.164-1 Update to elfutils-0.164 and drop old compat stuff. --- .gitignore | 1 + Makefile | 44 - elfutils-0.163-default-yama-conf.patch | 166 -- ...tils-0.163-readelf-n-undefined-shift.patch | 49 - elfutils-0.163-unstrip-shf_info_link.patch | 91 - elfutils-portability-0.163.patch | 2108 ----------------- elfutils.spec | 106 +- sources | 2 +- 8 files changed, 14 insertions(+), 2553 deletions(-) delete mode 100644 Makefile delete mode 100644 elfutils-0.163-default-yama-conf.patch delete mode 100644 elfutils-0.163-readelf-n-undefined-shift.patch delete mode 100644 elfutils-0.163-unstrip-shf_info_link.patch delete mode 100644 elfutils-portability-0.163.patch diff --git a/.gitignore b/.gitignore index 948e70d..5de8664 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ /elfutils-0.161.tar.bz2 /elfutils-0.162.tar.bz2 /elfutils-0.163.tar.bz2 +/elfutils-0.164.tar.bz2 diff --git a/Makefile b/Makefile deleted file mode 100644 index b5ce206..0000000 --- a/Makefile +++ /dev/null @@ -1,44 +0,0 @@ -patches := $(patsubst %,elfutils-%.patch,portability) - -.PHONY: patches -patches: $(patches) - -branch-portability = portable - -FORCE:; - -elfutils.git ?= ${HOME}/src/elfutils/.git -git-heads := $(wildcard $(elfutils.git)/refs/heads/*) -ifneq (,$(git-heads)) -git-dir = git --git-dir=$(elfutils.git) -git-archive = $(git-dir) archive -get-master = master=`$(git-dir) merge-base master $$branch` && \ - master=`$(git-dir) describe --tags --always $$master` -else -git-heads = FORCE -git-archive = git archive --remote=git://git.fedorahosted.org/git/elfutils.git -get-master = master=master -endif - -git-%/configure: Makefile $(git-heads) - @rm -rf $(@D) - $(git-archive) --prefix=$(@D)/ $(firstword $(branch-$*) $*) | tar xf - - cd $(@D) && autoreconf -i && rm -rf autom4te.cache - -elfutils-%.patch: git-%/configure - branch=$(firstword $(branch-$*) $*); \ - $(get-master) && \ - (set -x; $(MAKE) git-$$master/configure) && \ - (set -x; diff --exclude='.gitignore' -Nrpu git-$$master $( $@.new - mv $@.new $@ - -elfutils-portable.spec: elfutils.spec - (echo '%define _with_compat 1'; sed 's/ check$$/& || :/' $<) > $@.new - mv -f $@.new $@ - -rpmbuild-dirs = $(foreach what,source spec srcrpm,--define '_$(what)dir .') - -.PHONY: portable-srpm -portable-srpm: elfutils-portable.spec $(patches) sources - rpmbuild-md5 $(rpmbuild-dirs) -bs $< diff --git a/elfutils-0.163-default-yama-conf.patch b/elfutils-0.163-default-yama-conf.patch deleted file mode 100644 index 4f2ab29..0000000 --- a/elfutils-0.163-default-yama-conf.patch +++ /dev/null @@ -1,166 +0,0 @@ -commit 65a818baa4bcae96c1e9516420fcd87a2db3c863 -Author: Mark Wielaard -Date: Tue Aug 4 12:20:20 2015 +0200 - - spec: Provide default-yama-scope. - - When yama is enabled in the kernel it might be used to filter any user - space access which requires PTRACE_MODE_ATTACH like ptrace attach, access - to /proc/PID/{mem,personality,stack,syscall}, and the syscalls - process_vm_readv and process_vm_writev which are used for interprocess - services, communication and introspection (like synchronisation, signaling, - debugging, tracing and profiling) of processes. - - These are precisely the things that libdw dwfl and ebl backends rely on. - So make sure they don't mysteriously fail in such cases by providing the - default yama scope sysctl value. - - This is implemented as a separate subpackage that just provides this - functionality so other packages that don't directly rely on elfutils-libs - can also just Require: default-yama-scope to function properly. - https://bugzilla.redhat.com/show_bug.cgi?id=1209492#c69 - - Signed-off-by: Mark Wielaard - -diff --git a/config/10-default-yama-scope.conf b/config/10-default-yama-scope.conf -new file mode 100644 -index 0000000..ba78ebd ---- /dev/null -+++ b/config/10-default-yama-scope.conf -@@ -0,0 +1,35 @@ -+# When yama is enabled in the kernel it might be used to filter any user -+# space access which requires PTRACE_MODE_ATTACH like ptrace attach, access -+# to /proc/PID/{mem,personality,stack,syscall}, and the syscalls -+# process_vm_readv and process_vm_writev which are used for interprocess -+# services, communication and introspection (like synchronisation, signaling, -+# debugging, tracing and profiling) of processes. -+# -+# Usage of ptrace attach is restricted by normal user permissions. Normal -+# unprivileged processes cannot interact through ptrace with processes -+# that they cannot send signals to or processes that are running set-uid -+# or set-gid. -+# -+# yama ptrace scope can be used to reduce these permissions even more. -+# This should normally not be done because it will break various programs -+# relying on the default ptrace security restrictions. But can be used -+# if you don't have any other way to separate processes in their own -+# domains. A different way to restrict ptrace is to set the selinux -+# deny_ptrace boolean. Both mechanisms will break some programs relying -+# on the ptrace system call and might force users to elevate their -+# priviliges to root to do their work. -+# -+# For more information see Documentation/security/Yama.txt in the kernel -+# sources. Which also describes the defaults when CONFIG_SECURITY_YAMA -+# is enabled in a kernel build (currently 1 for ptrace_scope). -+# -+# This runtime kernel parameter can be set to the following options: -+# (Note that setting this to anything except zero will break programs!) -+# -+# 0 - Default attach security permissions. -+# 1 - Restricted attach. Only child processes plus normal permissions. -+# 2 - Admin-only attach. Only executables with CAP_SYS_PTRACE. -+# 3 - No attach. No process may call ptrace at all. Irrevocable. -+# -+kernel.yama.ptrace_scope = 0 -+ -diff --git a/config/ChangeLog b/config/ChangeLog -index 00f3ddc..31eeca7 100644 ---- a/config/ChangeLog -+++ b/config/ChangeLog -@@ -1,3 +1,10 @@ -+2015-08-04 Mark Wielaard -+ -+ * 10-default-yama-scope.conf: New file. -+ * Makefile.am (EXTRA_DIST): Add 10-default-yama-scope.conf. -+ * elfutils.spec.in (Requires): default-yama-scope. -+ (default-yama-scope): New package. -+ - 2015-06-19 Mark Wielaard - - * elfutils.spec.in: Update for 0.163. -diff --git a/config/Makefile.am b/config/Makefile.am -index 6e61b77..23f7b65 100644 ---- a/config/Makefile.am -+++ b/config/Makefile.am -@@ -1,7 +1,7 @@ - ## Process this file with automake to produce Makefile.in -*-Makefile-*- - ## Configure input file for elfutils. - ## --## Copyright (C) 2004, 2005, 2008, 2009, 2011 Red Hat, Inc. -+## Copyright (C) 2004, 2005, 2008, 2009, 2011, 2015 Red Hat, Inc. - ## This file is part of elfutils. - ## - ## This file is free software; you can redistribute it and/or modify -@@ -28,7 +28,7 @@ - ## the GNU Lesser General Public License along with this program. If - ## not, see . - ## --EXTRA_DIST = elfutils.spec.in known-dwarf.awk -+EXTRA_DIST = elfutils.spec.in known-dwarf.awk 10-default-yama-scope.conf - - if MAINTAINER_MODE - $(srcdir)/elfutils.spec.in: $(top_srcdir)/NEWS -diff --git a/config/elfutils.spec.in b/config/elfutils.spec.in -index 5407f1a..e5f6e29 100644 ---- a/config/elfutils.spec.in -+++ b/config/elfutils.spec.in -@@ -10,6 +10,7 @@ Obsoletes: libelf libelf-devel - Requires: elfutils-libelf = %{version}-%{release} - Requires: glibc >= 2.7 - Requires: libstdc++ -+Requires: default-yama-scope - - # ExcludeArch: xxx - -@@ -97,6 +98,22 @@ Conflicts: libelf-devel - The elfutils-libelf-static package contains the static archive - for libelf. - -+%package default-yama-scope -+Summary: Default yama attach scope sysctl setting -+Group: Development/Tools -+License: GPLv2+ or LGPLv3+ -+Provides: default-yama-scope -+BuildArch: noarch -+ -+%description default-yama-scope -+Yama sysctl setting to enable default attach scope settings -+enabling programs to use ptrace attach, access to -+/proc/PID/{mem,personality,stack,syscall}, and the syscalls -+process_vm_readv and process_vm_writev which are used for -+interprocess services, communication and introspection -+(like synchronisation, signaling, debugging, tracing and -+profiling) of processes. -+ - %prep - %setup -q - -@@ -121,6 +138,8 @@ chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/elfutils/lib*.so* - rm -f .%{_libdir}/libasm.a - } - -+install -Dm0644 config/10-default-yama-scope.conf ${RPM_BUILD_ROOT}%{_sysctldir}/10-default-yama-scope.conf -+ - %check - make check - -@@ -135,6 +154,9 @@ rm -rf ${RPM_BUILD_ROOT} - - %postun libelf -p /sbin/ldconfig - -+%post default-yama-scope -+%sysctl_apply 10-default-yama-scope.conf -+ - %files - %defattr(-,root,root) - %doc COPYING COPYING-GPLV2 COPYING-LGPLV3 README TODO CONTRIBUTING -@@ -197,6 +219,9 @@ rm -rf ${RPM_BUILD_ROOT} - %files libelf-devel-static - %{_libdir}/libelf.a - -+%files default-yama-scope -+%config(noreplace) %{_sysctldir}/10-default-yama-scope.conf -+ - %changelog - * Fri Jun 19 2015 Mark Wielaard 0.163-1 - - Bug fixes only, no new features. diff --git a/elfutils-0.163-readelf-n-undefined-shift.patch b/elfutils-0.163-readelf-n-undefined-shift.patch deleted file mode 100644 index a26e209..0000000 --- a/elfutils-0.163-readelf-n-undefined-shift.patch +++ /dev/null @@ -1,49 +0,0 @@ -commit b00a4fa78779ff0f304fa6cb34d49622679c86d4 -Author: Mark Wielaard -Date: Thu Sep 3 10:50:58 2015 +0200 - - readelf: handle_core_item large right shift triggers undefined behaviour. - - The problem is this: - - int n = ffs (w); - w >>= n; - - The intent is to shift away up to (and including) the first least - significant bit in w. But w is an unsigned int, so 32 bits. And the - least significant bit could be bit 32 (ffs counts from 1). Unfortunately - a right shift equal to (or larger than) the length in bits of the left - hand operand is undefined behaviour. We expect w to be zero afterwards. - Which would terminate the while loop in the function. But since it is - undefined behaviour anything can happen. In this case, what will actually - happen is that w is unchanged, causing an infinite loop... - - gcc -fsanitize=undefined will catch and warn about this when w = 0x80000000 - - https://bugzilla.redhat.com/show_bug.cgi?id=1259259 - - Signed-off-by: Mark Wielaard - -diff --git a/src/readelf.c b/src/readelf.c -index d3c2b6b..aab8b5c 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -8474,8 +8474,16 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc, - unsigned int w = negate ? ~*i : *i; - while (w != 0) - { -- int n = ffs (w); -- w >>= n; -+ /* Note that a right shift equal to (or greater than) -+ the number of bits of w is undefined behaviour. In -+ particular when the least significant bit is bit 32 -+ (w = 0x8000000) then w >>= n is undefined. So -+ explicitly handle that case separately. */ -+ unsigned int n = ffs (w); -+ if (n < sizeof (w) * 8) -+ w >>= n; -+ else -+ w = 0; - bit += n; - - if (lastbit != 0 && lastbit + 1 == bit) diff --git a/elfutils-0.163-unstrip-shf_info_link.patch b/elfutils-0.163-unstrip-shf_info_link.patch deleted file mode 100644 index e3a27ff..0000000 --- a/elfutils-0.163-unstrip-shf_info_link.patch +++ /dev/null @@ -1,91 +0,0 @@ -commit f9fc50c3eced243c0648fb0fbfe2c9877c25e1e4 -Author: Mark Wielaard -Date: Wed Jul 29 17:51:27 2015 +0200 - - unstrip: Handle debuginfo files with missing SHF_INFO_LINK section flags. - - With GCC 5 there might be a .rela.plt section with SHF_INFO_LINK set. - Buggy binutils objdump might strip it from the section in the debug file. - Ignore such differences for relocation sections and put the flag back - if necessary. - - Also improve the error message a little by only discarding the already - matched sections if there is an prelink undo section. Otherwise we will - report all sections as not matching if the file wasn't prelinked instead - of just the non-matching sections. - - New testfiles generated by gcc5 and binutils objdump added. - - Signed-off-by: Mark Wielaard - -diff --git a/src/unstrip.c b/src/unstrip.c -index 4a8e5fa..8833094 100644 ---- a/src/unstrip.c -+++ b/src/unstrip.c -@@ -867,12 +867,28 @@ compare_symbols_output (const void *a, const void *b) - - #undef CMP - -+/* Return true if the flags of the sections match, ignoring the SHF_INFO_LINK -+ flag if the section contains relocation information. */ -+static bool -+sections_flags_match (Elf64_Xword sh_flags1, Elf64_Xword sh_flags2, -+ Elf64_Word sh_type) -+{ -+ if (sh_type == SHT_REL || sh_type == SHT_RELA) -+ { -+ sh_flags1 &= ~SHF_INFO_LINK; -+ sh_flags2 &= ~SHF_INFO_LINK; -+ } -+ -+ return sh_flags1 == sh_flags2; -+} -+ - /* Return true iff the flags, size, and name match. */ - static bool - sections_match (const struct section *sections, size_t i, - const GElf_Shdr *shdr, const char *name) - { -- return (sections[i].shdr.sh_flags == shdr->sh_flags -+ return (sections_flags_match (sections[i].shdr.sh_flags, shdr->sh_flags, -+ sections[i].shdr.sh_type) - && (sections[i].shdr.sh_size == shdr->sh_size - || (sections[i].shdr.sh_size < shdr->sh_size - && section_can_shrink (§ions[i].shdr))) -@@ -930,10 +946,6 @@ find_alloc_sections_prelink (Elf *debug, Elf_Data *debug_shstrtab, - struct section *sections, - size_t nalloc, size_t nsections) - { -- /* Clear assignments that might have been bogus. */ -- for (size_t i = 0; i < nalloc; ++i) -- sections[i].outscn = NULL; -- - Elf_Scn *undo = NULL; - for (size_t i = nalloc; i < nsections; ++i) - { -@@ -952,6 +964,10 @@ find_alloc_sections_prelink (Elf *debug, Elf_Data *debug_shstrtab, - size_t undo_nalloc = 0; - if (undo != NULL) - { -+ /* Clear assignments that might have been bogus. */ -+ for (size_t i = 0; i < nalloc; ++i) -+ sections[i].outscn = NULL; -+ - Elf_Data *undodata = elf_rawdata (undo, NULL); - ELF_CHECK (undodata != NULL, - _("cannot read '.gnu.prelink_undo' section: %s")); -@@ -1500,6 +1516,14 @@ more sections in stripped file than debug file -- arguments reversed?")); - shdr_mem.sh_size = sec->shdr.sh_size; - shdr_mem.sh_info = sec->shdr.sh_info; - shdr_mem.sh_link = sec->shdr.sh_link; -+ -+ /* Buggy binutils objdump might have stripped the SHF_INFO_LINK -+ put it back if necessary. */ -+ if ((sec->shdr.sh_type == SHT_REL || sec->shdr.sh_type == SHT_RELA) -+ && sec->shdr.sh_flags != shdr_mem.sh_flags -+ && (sec->shdr.sh_flags & SHF_INFO_LINK) != 0) -+ shdr_mem.sh_flags |= SHF_INFO_LINK; -+ - if (sec->shdr.sh_link != SHN_UNDEF) - shdr_mem.sh_link = ndx_section[sec->shdr.sh_link - 1]; - if (shdr_mem.sh_flags & SHF_INFO_LINK) diff --git a/elfutils-portability-0.163.patch b/elfutils-portability-0.163.patch deleted file mode 100644 index f347ed1..0000000 --- a/elfutils-portability-0.163.patch +++ /dev/null @@ -1,2108 +0,0 @@ -diffelfutils/backends/ChangeLog git-portable/backends/ChangeLog ---- elfutils/backends/ChangeLog -+++ elfutils/backends/ChangeLog -@@ -498,6 +498,10 @@ - * ppc_attrs.c (ppc_check_object_attribute): Handle tag - GNU_Power_ABI_Struct_Return. - -+2009-01-23 Roland McGrath -+ -+ * Makefile.am (libebl_%.so): Use $(LD_AS_NEEDED). -+ - 2008-10-04 Ulrich Drepper - - * i386_reloc.def: Fix entries for TLS_GOTDESC, TLS_DESC_CALL, and -@@ -825,6 +829,11 @@ - * sparc_init.c: Likewise. - * x86_64_init.c: Likewise. - -+2005-11-22 Roland McGrath -+ -+ * Makefile.am (LD_AS_NEEDED): New variable, substituted by configure. -+ (libebl_%.so rule): Use it in place of -Wl,--as-needed. -+ - 2005-11-19 Roland McGrath - - * ppc64_reloc.def: REL30 -> ADDR30. -@@ -847,6 +856,9 @@ - * Makefile.am (uninstall): Don't try to remove $(pkgincludedir). - (CLEANFILES): Add libebl_$(m).so. - -+ * Makefile.am (WEXTRA): New variable, substituted by configure. -+ (AM_CFLAGS): Use it in place of -Wextra. -+ - * ppc_reloc.def: Update bits per Alan Modra . - * ppc64_reloc.def: Likewise. - -diffelfutils/backends/Makefile.am git-portable/backends/Makefile.am ---- elfutils/backends/Makefile.am -+++ elfutils/backends/Makefile.am -@@ -119,7 +119,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a - $(LINK) -shared -o $(@:.map=.so) \ - -Wl,--whole-archive $< $(cpu_$*) -Wl,--no-whole-archive \ - -Wl,--version-script,$(@:.so=.map) \ -- -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw) -+ -Wl,-z,defs $(LD_AS_NEEDED) $(libelf) $(libdw) - @$(textrel_check) - - libebl_i386.so: $(cpu_i386) -diffelfutils/backends/Makefile.in git-portable/backends/Makefile.in ---- elfutils/backends/Makefile.in -+++ elfutils/backends/Makefile.in -@@ -90,7 +90,8 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING - subdir = backends - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 - am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -300,6 +301,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -331,6 +333,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = @VERSION@ -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -398,14 +401,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr - - # Warn about stack usage of more than 256K = 262144 bytes. - @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ -- $(if $($(*F)_no_Werror),,-Werror) \ -- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ -- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -- $($(*F)_CFLAGS) -- -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ -+ $($(*F)_no_Werror),,-Werror) $(if \ -+ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ -+ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -+ $($(*F)_CFLAGS) $(am__append_1) - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) --DEFS.os = -DPIC -DSHARED $(am__append_1) -+DEFS.os = -DPIC -DSHARED $(am__append_2) - CLEANFILES = *.gcno *.gcda $(foreach m,$(modules), libebl_$(m).map \ - libebl_$(m).so $(am_libebl_$(m)_pic_a_OBJECTS)) - textrel_msg = echo "WARNING: TEXTREL found in '$@'" -@@ -912,7 +915,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a - $(LINK) -shared -o $(@:.map=.so) \ - -Wl,--whole-archive $< $(cpu_$*) -Wl,--no-whole-archive \ - -Wl,--version-script,$(@:.so=.map) \ -- -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw) -+ -Wl,-z,defs $(LD_AS_NEEDED) $(libelf) $(libdw) - @$(textrel_check) - - libebl_i386.so: $(cpu_i386) -diffelfutils/ChangeLog git-portable/ChangeLog ---- elfutils/ChangeLog -+++ elfutils/ChangeLog -@@ -258,6 +258,8 @@ - - 2012-01-24 Mark Wielaard - -+ * configure.ac: Wrap AC_COMPILE_IFELSE sources in AC_LANG_SOURCE. -+ - * COPYING: Fix address. Updated version from gnulib. - - 2012-01-23 Mark Wielaard -@@ -276,6 +278,9 @@ - - 2011-10-08 Mike Frysinger - -+ * configure.ac (--disable-werror): Handle it, controlling BUILD_WERROR -+ automake option. -+ - * configure.ac: Fix use of AC_ARG_ENABLE to handle $enableval correctly. - - 2011-10-02 Ulrich Drepper -@@ -297,6 +302,10 @@ - - * configure.ac (LOCALEDIR, DATADIRNAME): Removed. - -+2009-11-22 Roland McGrath -+ -+ * configure.ac: Use sed and expr instead of modern bash extensions. -+ - 2009-09-21 Ulrich Drepper - - * configure.ac: Update for more modern autoconf. -@@ -305,6 +314,10 @@ - - * configure.ac (zip_LIBS): Check for liblzma too. - -+2009-08-17 Roland McGrath -+ -+ * configure.ac: Check for -fgnu89-inline; add it to WEXTRA if it works. -+ - 2009-04-19 Roland McGrath - - * configure.ac (eu_version): Round down here, not in version.h macros. -@@ -316,6 +329,8 @@ - - 2009-01-23 Roland McGrath - -+ * configure.ac: Check for __builtin_popcount. -+ - * configure.ac (zlib check): Check for gzdirect, need zlib >= 1.2.2.3. - - * configure.ac (__thread check): Use AC_LINK_IFELSE, in case of -@@ -396,6 +411,10 @@ - * configure.ac: Add dummy automake conditional to get dependencies - for non-generic linker right. See src/Makefile.am. - -+2005-11-22 Roland McGrath -+ -+ * configure.ac: Check for --as-needed linker option. -+ - 2005-11-18 Roland McGrath - - * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): New variable. -@@ -443,6 +462,17 @@ - * Makefile.am (all_SUBDIRS): Add libdwfl. - * configure.ac: Write libdwfl/Makefile. - -+2005-05-31 Roland McGrath -+ -+ * configure.ac (WEXTRA): Check for -Wextra and set this substitution. -+ -+ * configure.ac: Check for struct stat st_?tim members. -+ * src/strip.c (process_file): Use st_?time if st_?tim are not there. -+ -+ * configure.ac: Check for futimes function. -+ * src/strip.c (handle_elf) [! HAVE_FUTIMES]: Use utimes instead. -+ (handle_ar) [! HAVE_FUTIMES]: Likewise. -+ - 2005-05-19 Roland McGrath - - * configure.ac [AH_BOTTOM] (INTDECL, _INTDECL): New macros. -diffelfutils/config/ChangeLog git-portable/config/ChangeLog ---- elfutils/config/ChangeLog -+++ elfutils/config/ChangeLog -@@ -110,6 +110,10 @@ - - * known-dwarf.awk: Use gawk. - -+2011-10-08 Mike Frysinger -+ -+ * eu.am [BUILD_WERROR]: Conditionalize -Werror use on this. -+ - 2010-07-02 Ulrich Drepper - - * elfutils.spec.in: Add more BuildRequires. -diffelfutils/config/eu.am git-portable/config/eu.am ---- elfutils/config/eu.am -+++ elfutils/config/eu.am -@@ -1,6 +1,6 @@ - ## Common automake fragments for elfutils subdirectory makefiles. - ## --## Copyright (C) 2010, 2014 Red Hat, Inc. -+## Copyright (C) 2010-2011, 2014 Red Hat, Inc. - ## - ## This file is part of elfutils. - ## -@@ -29,6 +29,9 @@ - ## not, see . - ## - -+WEXTRA = @WEXTRA@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ -+ - DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"' - AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. - -@@ -38,12 +41,17 @@ STACK_USAGE_WARNING=-Wstack-usage=262144 - else - STACK_USAGE_WARNING= - endif --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow \ - $(if $($(*F)_no_Werror),,-Werror) \ -- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ -+ $(if $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) \ -+ $(if $($(*F)_no_Wformat),-Wno-format,-Wformat=2) \ - $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ - $($(*F)_CFLAGS) - -+if BUILD_WERROR -+AM_CFLAGS += $(if $($(*F)_no_Werror),,-Werror) -+endif -+ - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) - - DEFS.os = -DPIC -DSHARED -diffelfutils/config/Makefile.in git-portable/config/Makefile.in ---- elfutils/config/Makefile.in -+++ elfutils/config/Makefile.in -@@ -160,6 +160,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -191,6 +192,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = @VERSION@ -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -diffelfutils/config.h.in git-portable/config.h.in ---- elfutils/config.h.in -+++ elfutils/config.h.in -@@ -6,6 +6,12 @@ - /* Should ar and ranlib use -D behavior by default? */ - #undef DEFAULT_AR_DETERMINISTIC - -+/* Have __builtin_popcount. */ -+#undef HAVE_BUILTIN_POPCOUNT -+ -+/* Define to 1 if you have the `futimens' function. */ -+#undef HAVE_FUTIMENS -+ - /* Define to 1 if you have the header file. */ - #undef HAVE_INTTYPES_H - -@@ -105,4 +111,7 @@ - /* Define for large files, on AIX-style hosts. */ - #undef _LARGE_FILES - -+/* Stubbed out if missing compiler support. */ -+#undef __thread -+ - #include -diffelfutils/configure git-portable/configure ---- elfutils/configure -+++ elfutils/configure -@@ -672,6 +672,8 @@ ZLIB_TRUE - LIBEBL_SUBDIR - TESTS_RPATH_FALSE - TESTS_RPATH_TRUE -+BUILD_WERROR_FALSE -+BUILD_WERROR_TRUE - BUILD_STATIC_FALSE - BUILD_STATIC_TRUE - USE_VALGRIND_FALSE -@@ -687,6 +689,8 @@ NEVER_TRUE - base_cpu - NATIVE_LD_FALSE - NATIVE_LD_TRUE -+LD_AS_NEEDED -+WEXTRA - NM - READELF - ac_ct_AR -@@ -807,6 +811,7 @@ enable_gprof - enable_gcov - enable_sanitize_undefined - enable_valgrind -+enable_werror - enable_tests_rpath - enable_libebl_subdir - with_zlib -@@ -1467,6 +1472,7 @@ Optional Features: - --enable-sanitize-undefined - Use gcc undefined behaviour sanitizer - --enable-valgrind run all tests under valgrind -+ --disable-werror do not build with -Werror - --enable-tests-rpath build $ORIGIN-using rpath into tests - --enable-libebl-subdir=DIR - install libebl_CPU modules in $(libdir)/DIR -@@ -1665,6 +1671,73 @@ fi - - } # ac_fn_c_try_link - -+# ac_fn_c_check_func LINENO FUNC VAR -+# ---------------------------------- -+# Tests whether FUNC exists, setting the cache variable VAR accordingly -+ac_fn_c_check_func () -+{ -+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -+$as_echo_n "checking for $2... " >&6; } -+if eval \${$3+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+/* Define $2 to an innocuous variant, in case declares $2. -+ For example, HP-UX 11i declares gettimeofday. */ -+#define $2 innocuous_$2 -+ -+/* System header to define __stub macros and hopefully few prototypes, -+ which can conflict with char $2 (); below. -+ Prefer to if __STDC__ is defined, since -+ exists even on freestanding compilers. */ -+ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ -+#undef $2 -+ -+/* Override any GCC internal prototype to avoid an error. -+ Use char because int might match the return type of a GCC -+ builtin and then its argument prototype would still apply. */ -+#ifdef __cplusplus -+extern "C" -+#endif -+char $2 (); -+/* The GNU C library defines this for functions which it implements -+ to always fail with ENOSYS. Some functions are actually named -+ something starting with __ and the normal name is an alias. */ -+#if defined __stub_$2 || defined __stub___$2 -+choke me -+#endif -+ -+int -+main () -+{ -+return $2 (); -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_link "$LINENO"; then : -+ eval "$3=yes" -+else -+ eval "$3=no" -+fi -+rm -f core conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+fi -+eval ac_res=\$$3 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -+$as_echo "$ac_res" >&6; } -+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -+ -+} # ac_fn_c_check_func -+ - # ac_fn_c_try_run LINENO - # ---------------------- - # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -@@ -4825,6 +4898,18 @@ else - fi - - -+for ac_func in futimens -+do : -+ ac_fn_c_check_func "$LINENO" "futimens" "ac_cv_func_futimens" -+if test "x$ac_cv_func_futimens" = xyes; then : -+ cat >>confdefs.h <<_ACEOF -+#define HAVE_FUTIMENS 1 -+_ACEOF -+ -+fi -+done -+ -+ - # We use -std=gnu99 but have explicit checks for some language constructs - # and GNU extensions since some compilers claim GNU99 support, but don't - # really support all language extensions. In particular we need -@@ -4873,6 +4958,130 @@ if test "x$ac_cv_c99" != xyes; then : - as_fn_error $? "gcc with GNU99 support required" "$LINENO" 5 - fi - -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Wextra option to $CC" >&5 -+$as_echo_n "checking for -Wextra option to $CC... " >&6; } -+if ${ac_cv_cc_wextra+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ old_CFLAGS="$CFLAGS" -+CFLAGS="$CFLAGS -Wextra" -+cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+void foo (void) { } -+_ACEOF -+if ac_fn_c_try_compile "$LINENO"; then : -+ ac_cv_cc_wextra=yes -+else -+ ac_cv_cc_wextra=no -+fi -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+CFLAGS="$old_CFLAGS" -+fi -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_wextra" >&5 -+$as_echo "$ac_cv_cc_wextra" >&6; } -+ -+if test "x$ac_cv_cc_wextra" = xyes; then : -+ WEXTRA=-Wextra -+else -+ WEXTRA=-W -+fi -+ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fgnu89-inline option to $CC" >&5 -+$as_echo_n "checking for -fgnu89-inline option to $CC... " >&6; } -+if ${ac_cv_cc_gnu89_inline+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ old_CFLAGS="$CFLAGS" -+CFLAGS="$CFLAGS -fgnu89-inline -Werror" -+cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+void foo (void) -+{ -+ inline void bar (void) {} -+ bar (); -+} -+extern inline void baz (void) {} -+ -+_ACEOF -+if ac_fn_c_try_compile "$LINENO"; then : -+ ac_cv_cc_gnu89_inline=yes -+else -+ ac_cv_cc_gnu89_inline=no -+fi -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+CFLAGS="$old_CFLAGS" -+fi -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_gnu89_inline" >&5 -+$as_echo "$ac_cv_cc_gnu89_inline" >&6; } -+if test "x$ac_cv_cc_gnu89_inline" = xyes; then : -+ WEXTRA="${WEXTRA:+$WEXTRA }-fgnu89-inline" -+fi -+ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --as-needed linker option" >&5 -+$as_echo_n "checking for --as-needed linker option... " >&6; } -+if ${ac_cv_as_needed+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ cat > conftest.c <&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+ test $ac_status = 0; }; } -+then -+ ac_cv_as_needed=yes -+else -+ ac_cv_as_needed=no -+fi -+rm -f conftest* -+fi -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_as_needed" >&5 -+$as_echo "$ac_cv_as_needed" >&6; } -+if test "x$ac_cv_as_needed" = xyes; then : -+ LD_AS_NEEDED=-Wl,--as-needed -+else -+ LD_AS_NEEDED= -+fi -+ -+ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_popcount" >&5 -+$as_echo_n "checking for __builtin_popcount... " >&6; } -+if ${ac_cv_popcount+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+exit (__builtin_popcount (127)); -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_link "$LINENO"; then : -+ ac_cv_popcount=yes -+else -+ ac_cv_popcount=no -+fi -+rm -f core conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+fi -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_popcount" >&5 -+$as_echo "$ac_cv_popcount" >&6; } -+if test "x$ac_cv_popcount" = xyes; then : -+ -+$as_echo "#define HAVE_BUILTIN_POPCOUNT 1" >>confdefs.h -+ -+fi -+ - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __thread support" >&5 - $as_echo_n "checking for __thread support... " >&6; } - if ${ac_cv_tls+:} false; then : -@@ -4910,7 +5119,13 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 - $as_echo "$ac_cv_tls" >&6; } - if test "x$ac_cv_tls" != xyes; then : -- as_fn_error $? "__thread support required" "$LINENO" 5 -+ if test "$use_locks" = yes; then : -+ as_fn_error $? "--enable-thread-safety requires __thread support" "$LINENO" 5 -+else -+ -+$as_echo "#define __thread /* empty: no multi-thread support */" >>confdefs.h -+ -+fi - fi - - # Check whether --enable-largefile was given. -@@ -5318,6 +5533,22 @@ else - fi - - -+# Check whether --enable-werror was given. -+if test "${enable_werror+set}" = set; then : -+ enableval=$enable_werror; enable_werror=$enableval -+else -+ enable_werror=yes -+fi -+ -+ if test "$enable_werror" = yes; then -+ BUILD_WERROR_TRUE= -+ BUILD_WERROR_FALSE='#' -+else -+ BUILD_WERROR_TRUE='#' -+ BUILD_WERROR_FALSE= -+fi -+ -+ - # Check whether --enable-tests-rpath was given. - if test "${enable_tests_rpath+set}" = set; then : - enableval=$enable_tests_rpath; tests_use_rpath=$enableval -@@ -6199,7 +6430,7 @@ case "$eu_version" in - esac - - # Round up to the next release API (x.y) version. --eu_version=$(( (eu_version + 999) / 1000 )) -+eu_version=`expr \( $eu_version + 999 \) / 1000` - - MODVERSION="Build for ${LIBEBL_SUBDIR} ${eu_version} ${ac_cv_build}" - -@@ -7088,6 +7319,10 @@ if test -z "${BUILD_STATIC_TRUE}" && tes - as_fn_error $? "conditional \"BUILD_STATIC\" was never defined. - Usually this means the macro was only invoked conditionally." "$LINENO" 5 - fi -+if test -z "${BUILD_WERROR_TRUE}" && test -z "${BUILD_WERROR_FALSE}"; then -+ as_fn_error $? "conditional \"BUILD_WERROR\" was never defined. -+Usually this means the macro was only invoked conditionally." "$LINENO" 5 -+fi - if test -z "${TESTS_RPATH_TRUE}" && test -z "${TESTS_RPATH_FALSE}"; then - as_fn_error $? "conditional \"TESTS_RPATH\" was never defined. - Usually this means the macro was only invoked conditionally." "$LINENO" 5 -diffelfutils/configure.ac git-portable/configure.ac ---- elfutils/configure.ac -+++ elfutils/configure.ac -@@ -73,6 +73,8 @@ m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) - AC_CHECK_TOOL([READELF], [readelf]) - AC_CHECK_TOOL([NM], [nm]) - -+AC_CHECK_FUNCS([futimens]) -+ - # We use -std=gnu99 but have explicit checks for some language constructs - # and GNU extensions since some compilers claim GNU99 support, but don't - # really support all language extensions. In particular we need -@@ -106,6 +108,54 @@ CFLAGS="$old_CFLAGS"]) - AS_IF([test "x$ac_cv_c99" != xyes], - AC_MSG_ERROR([gcc with GNU99 support required])) - -+AC_CACHE_CHECK([for -Wextra option to $CC], ac_cv_cc_wextra, [dnl -+old_CFLAGS="$CFLAGS" -+CFLAGS="$CFLAGS -Wextra" -+AC_COMPILE_IFELSE([AC_LANG_SOURCE([void foo (void) { }])], -+ ac_cv_cc_wextra=yes, ac_cv_cc_wextra=no) -+CFLAGS="$old_CFLAGS"]) -+AC_SUBST(WEXTRA) -+AS_IF([test "x$ac_cv_cc_wextra" = xyes], [WEXTRA=-Wextra], [WEXTRA=-W]) -+ -+AC_CACHE_CHECK([for -fgnu89-inline option to $CC], ac_cv_cc_gnu89_inline, [dnl -+old_CFLAGS="$CFLAGS" -+CFLAGS="$CFLAGS -fgnu89-inline -Werror" -+AC_COMPILE_IFELSE([AC_LANG_SOURCE([ -+void foo (void) -+{ -+ inline void bar (void) {} -+ bar (); -+} -+extern inline void baz (void) {} -+])], ac_cv_cc_gnu89_inline=yes, ac_cv_cc_gnu89_inline=no) -+CFLAGS="$old_CFLAGS"]) -+AS_IF([test "x$ac_cv_cc_gnu89_inline" = xyes], -+ [WEXTRA="${WEXTRA:+$WEXTRA }-fgnu89-inline"]) -+ -+AC_CACHE_CHECK([for --as-needed linker option], -+ ac_cv_as_needed, [dnl -+cat > conftest.c <&AS_MESSAGE_LOG_FD]) -+then -+ ac_cv_as_needed=yes -+else -+ ac_cv_as_needed=no -+fi -+rm -f conftest*]) -+AS_IF([test "x$ac_cv_as_needed" = xyes], -+ [LD_AS_NEEDED=-Wl,--as-needed], [LD_AS_NEEDED=]) -+AC_SUBST(LD_AS_NEEDED) -+ -+AC_CACHE_CHECK([for __builtin_popcount], ac_cv_popcount, [dnl -+AC_LINK_IFELSE([AC_LANG_PROGRAM([], [[exit (__builtin_popcount (127));]])], -+ ac_cv_popcount=yes, ac_cv_popcount=no)]) -+AS_IF([test "x$ac_cv_popcount" = xyes], -+ [AC_DEFINE([HAVE_BUILTIN_POPCOUNT], [1], [Have __builtin_popcount.])]) -+ - AC_CACHE_CHECK([for __thread support], ac_cv_tls, [dnl - # Use the same flags that we use for our DSOs, so the test is representative. - # Some old compiler/linker/libc combinations fail some ways and not others. -@@ -122,7 +172,10 @@ static __thread int a; int foo (int b) { - CFLAGS="$save_CFLAGS" - LDFLAGS="$save_LDFLAGS"]) - AS_IF([test "x$ac_cv_tls" != xyes], -- AC_MSG_ERROR([__thread support required])) -+ [AS_IF([test "$use_locks" = yes], -+ [AC_MSG_ERROR([--enable-thread-safety requires __thread support])], -+ [AC_DEFINE([__thread], [/* empty: no multi-thread support */], -+ [Stubbed out if missing compiler support.])])]) - - dnl This test must come as early as possible after the compiler configuration - dnl tests, because the choice of the file model can (in principle) affect -@@ -224,6 +277,11 @@ AM_CONDITIONAL(USE_VALGRIND, test "$use_ - AM_CONDITIONAL(BUILD_STATIC, [dnl - test "$use_gprof" = yes -o "$use_gcov" = yes]) - -+AC_ARG_ENABLE([werror], -+AS_HELP_STRING([--disable-werror],[do not build with -Werror]), -+ [enable_werror=$enableval], [enable_werror=yes]) -+AM_CONDITIONAL(BUILD_WERROR, test "$enable_werror" = yes) -+ - AC_ARG_ENABLE([tests-rpath], - AS_HELP_STRING([--enable-tests-rpath],[build $ORIGIN-using rpath into tests]), - [tests_use_rpath=$enableval], [tests_use_rpath=no]) -@@ -388,7 +446,7 @@ case "$eu_version" in - esac - - # Round up to the next release API (x.y) version. --eu_version=$(( (eu_version + 999) / 1000 )) -+eu_version=`expr \( $eu_version + 999 \) / 1000` - - dnl Unique ID for this build. - MODVERSION="Build for ${LIBEBL_SUBDIR} ${eu_version} ${ac_cv_build}" -diffelfutils/lib/ChangeLog git-portable/lib/ChangeLog ---- elfutils/lib/ChangeLog -+++ elfutils/lib/ChangeLog -@@ -73,6 +73,9 @@ - - 2009-01-23 Roland McGrath - -+ * eu-config.h [! HAVE_BUILTIN_POPCOUNT] -+ (__builtin_popcount): New inline function. -+ - * eu-config.h: Add multiple inclusion protection. - - 2009-01-17 Ulrich Drepper -@@ -129,6 +132,11 @@ - * Makefile.am (libeu_a_SOURCES): Add it. - * system.h: Declare crc32_file. - -+2005-02-07 Roland McGrath -+ -+ * Makefile.am (WEXTRA): New variable, substituted by configure. -+ (AM_CFLAGS): Use it in place of -Wextra. -+ - 2005-04-30 Ulrich Drepper - - * Makefile.am: Use -ffunction-sections for xmalloc.c. -diffelfutils/lib/eu-config.h git-portable/lib/eu-config.h ---- elfutils/lib/eu-config.h -+++ elfutils/lib/eu-config.h -@@ -163,6 +163,17 @@ asm (".section predict_data, \"aw\"; .pr - /* This macro is used by the tests conditionalize for standalone building. */ - #define ELFUTILS_HEADER(name) - -+#ifndef HAVE_BUILTIN_POPCOUNT -+# define __builtin_popcount hakmem_popcount -+static inline unsigned int __attribute__ ((unused)) -+hakmem_popcount (unsigned int x) -+{ -+ /* HAKMEM 169 */ -+ unsigned int n = x - ((x >> 1) & 033333333333) - ((x >> 2) & 011111111111); -+ return ((n + (n >> 3)) & 030707070707) % 63; -+} -+#endif /* HAVE_BUILTIN_POPCOUNT */ -+ - - #ifdef SYMBOL_VERSIONING - # define OLD_VERSION(name, version) \ -diffelfutils/lib/Makefile.in git-portable/lib/Makefile.in ---- elfutils/lib/Makefile.in -+++ elfutils/lib/Makefile.in -@@ -89,7 +89,8 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING - subdir = lib - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 - am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -212,6 +213,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -243,6 +245,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = @VERSION@ -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -309,13 +312,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr - - # Warn about stack usage of more than 256K = 262144 bytes. - @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \ -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ - $($(*F)_no_Werror),,-Werror) $(if \ -- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ -+ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ - $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -- $($(*F)_CFLAGS) -fpic -+ $($(*F)_CFLAGS) $(am__append_1) -fpic - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) --DEFS.os = -DPIC -DSHARED $(am__append_1) -+DEFS.os = -DPIC -DSHARED $(am__append_2) - CLEANFILES = *.gcno *.gcda - textrel_msg = echo "WARNING: TEXTREL found in '$@'" - @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) -diffelfutils/libasm/ChangeLog git-portable/libasm/ChangeLog ---- elfutils/libasm/ChangeLog -+++ elfutils/libasm/ChangeLog -@@ -87,6 +87,11 @@ - * asm_error.c: Add new error ASM_E_IOERROR. - * libasmP.h: Add ASM_E_IOERROR definition. - -+2005-05-31 Roland McGrath -+ -+ * Makefile.am (WEXTRA): New variable, substituted by configure. -+ (AM_CFLAGS): Use it in place of -Wextra. -+ - 2005-02-15 Ulrich Drepper - - * Makefile.am (AM_CFLAGS): Add -Wunused -Wextra -Wformat=2. -diffelfutils/libasm/Makefile.in git-portable/libasm/Makefile.in ---- elfutils/libasm/Makefile.in -+++ elfutils/libasm/Makefile.in -@@ -90,9 +90,10 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING - noinst_PROGRAMS = $(am__EXEEXT_1) --@USE_LOCKS_TRUE@am__append_2 = -lpthread -+@USE_LOCKS_TRUE@am__append_3 = -lpthread - subdir = libasm - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 - am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -263,6 +264,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -294,6 +296,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = 1 -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -361,14 +364,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr - - # Warn about stack usage of more than 256K = 262144 bytes. - @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ -- $(if $($(*F)_no_Werror),,-Werror) \ -- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ -- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -- $($(*F)_CFLAGS) -- -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ -+ $($(*F)_no_Werror),,-Werror) $(if \ -+ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ -+ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -+ $($(*F)_CFLAGS) $(am__append_1) - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) --DEFS.os = -DPIC -DSHARED $(am__append_1) -+DEFS.os = -DPIC -DSHARED $(am__append_2) - CLEANFILES = *.gcno *.gcda $(am_libasm_pic_a_OBJECTS) \ - libasm.so.$(VERSION) - textrel_msg = echo "WARNING: TEXTREL found in '$@'" -@@ -395,7 +398,7 @@ libasm_a_SOURCES = asm_begin.c asm_abort - - libasm_pic_a_SOURCES = - am_libasm_pic_a_OBJECTS = $(libasm_a_SOURCES:.c=.os) --libasm_so_LDLIBS = $(am__append_2) -+libasm_so_LDLIBS = $(am__append_3) - libasm_so_SOURCES = - noinst_HEADERS = libasmP.h symbolhash.h - EXTRA_DIST = libasm.map -diffelfutils/libcpu/ChangeLog git-portable/libcpu/ChangeLog ---- elfutils/libcpu/ChangeLog -+++ elfutils/libcpu/ChangeLog -@@ -51,6 +51,9 @@ - - 2009-01-23 Roland McGrath - -+ * i386_disasm.c (i386_disasm): Add abort after assert-constant for old -+ compilers that don't realize it's noreturn. -+ - * Makefile.am (i386_parse_CFLAGS): Use quotes around command - substitution that can produce leading whitespace. - -@@ -380,6 +383,11 @@ - * defs/i386.doc: New file. - * defs/x86_64: New file. - -+2005-04-04 Roland McGrath -+ -+ * Makefile.am (WEXTRA): New variable, substituted by configure. -+ (AM_CFLAGS): Use it instead of -Wextra. -+ - 2005-02-15 Ulrich Drepper - - * Makefile (AM_CFLAGS): Add -Wunused -Wextra -Wformat=2. -diffelfutils/libcpu/i386_disasm.c git-portable/libcpu/i386_disasm.c ---- elfutils/libcpu/i386_disasm.c -+++ elfutils/libcpu/i386_disasm.c -@@ -822,6 +822,7 @@ i386_disasm (const uint8_t **startp, con - - default: - assert (! "INVALID not handled"); -+ abort (); - } - } - else -diffelfutils/libcpu/Makefile.in git-portable/libcpu/Makefile.in ---- elfutils/libcpu/Makefile.in -+++ elfutils/libcpu/Makefile.in -@@ -90,7 +90,8 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING - @MAINTAINER_MODE_TRUE@noinst_PROGRAMS = i386_gendis$(EXEEXT) - subdir = libcpu - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -@@ -238,6 +239,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = lex.$( -+ -+ * dwarf_begin_elf.c: Add fallback for be64toh if not defined. -+ - 2011-07-14 Mark Wielaard - - * libdw.h (dwarf_offdie): Fix documentation to mention .debug_info. -@@ -1263,6 +1267,10 @@ - - * dwarf_hasattr_integrate.c: Integrate DW_AT_specification too. - -+2009-08-17 Roland McGrath -+ -+ * libdw.h: Disable extern inlines for GCC 4.2. -+ - 2009-08-10 Roland McGrath - - * dwarf_getscopevar.c: Use dwarf_diename. -@@ -2031,6 +2039,11 @@ - - 2005-05-31 Roland McGrath - -+ * Makefile.am (WEXTRA): New variable, substituted by configure. -+ (AM_CFLAGS): Use it in place of -Wextra. -+ -+2005-05-31 Roland McGrath -+ - * dwarf_formref_die.c (dwarf_formref_die): Add CU header offset to - formref offset. - -diffelfutils/libdw/dwarf_begin_elf.c git-portable/libdw/dwarf_begin_elf.c ---- elfutils/libdw/dwarf_begin_elf.c -+++ elfutils/libdw/dwarf_begin_elf.c -@@ -47,6 +47,14 @@ - #if USE_ZLIB - # include - # define crc32 loser_crc32 -+# ifndef be64toh -+# include -+# if __BYTE_ORDER == __LITTLE_ENDIAN -+# define be64toh(x) bswap_64 (x) -+# else -+# define be64toh(x) (x) -+# endif -+# endif - # include - # undef crc32 - #endif -diffelfutils/libdw/libdw.h git-portable/libdw/libdw.h ---- elfutils/libdw/libdw.h -+++ elfutils/libdw/libdw.h -@@ -1004,7 +1004,7 @@ extern Dwarf_OOM dwarf_new_oom_handler ( - - - /* Inline optimizations. */ --#ifdef __OPTIMIZE__ -+#if defined __OPTIMIZE__ && !(__GNUC__ == 4 && __GNUC_MINOR__ == 2) - /* Return attribute code of given attribute. */ - __libdw_extern_inline unsigned int - dwarf_whatattr (Dwarf_Attribute *attr) -diffelfutils/libdw/Makefile.in git-portable/libdw/Makefile.in ---- elfutils/libdw/Makefile.in -+++ elfutils/libdw/Makefile.in -@@ -90,8 +90,9 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING --@BUILD_STATIC_TRUE@am__append_2 = -fpic -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING -+@BUILD_STATIC_TRUE@am__append_3 = -fpic - noinst_PROGRAMS = $(am__EXEEXT_1) - subdir = libdw - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -@@ -312,6 +313,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -343,6 +345,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = 1 -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -409,13 +412,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr - - # Warn about stack usage of more than 256K = 262144 bytes. - @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \ -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ - $($(*F)_no_Werror),,-Werror) $(if \ -- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ -+ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ - $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -- $($(*F)_CFLAGS) $(am__append_2) -+ $($(*F)_CFLAGS) $(am__append_1) $(am__append_3) - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) --DEFS.os = -DPIC -DSHARED $(am__append_1) -+DEFS.os = -DPIC -DSHARED $(am__append_2) - CLEANFILES = *.gcno *.gcda - textrel_msg = echo "WARNING: TEXTREL found in '$@'" - @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) -diffelfutils/libdwelf/Makefile.in git-portable/libdwelf/Makefile.in ---- elfutils/libdwelf/Makefile.in -+++ elfutils/libdwelf/Makefile.in -@@ -89,7 +89,8 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING - subdir = libdwelf - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 - am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -242,6 +243,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -273,6 +275,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = 1 -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -340,14 +343,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr - - # Warn about stack usage of more than 256K = 262144 bytes. - @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ -- $(if $($(*F)_no_Werror),,-Werror) \ -- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ -- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -- $($(*F)_CFLAGS) -- -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ -+ $($(*F)_no_Werror),,-Werror) $(if \ -+ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ -+ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -+ $($(*F)_CFLAGS) $(am__append_1) - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) --DEFS.os = -DPIC -DSHARED $(am__append_1) -+DEFS.os = -DPIC -DSHARED $(am__append_2) - CLEANFILES = *.gcno *.gcda $(am_libdwelf_pic_a_OBJECTS) - textrel_msg = echo "WARNING: TEXTREL found in '$@'" - @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) -diffelfutils/libdwfl/ChangeLog git-portable/libdwfl/ChangeLog ---- elfutils/libdwfl/ChangeLog -+++ elfutils/libdwfl/ChangeLog -@@ -713,6 +713,21 @@ - (dwfl_module_addrsym) (i_to_symfile): New function. - (dwfl_module_addrsym) (search_table): Use it. - -+2013-11-09 Jan Kratochvil -+ -+ Older OS compatibility bits. -+ * linux-core-attach.c (be64toh, le64toh, be32toh, le32toh): Provide -+ fallbacks if not defined by system. -+ -+2013-11-09 Jan Kratochvil -+ -+ Handle T-stopped detach for old kernels. -+ * linux-pid-attach.c (struct pid_arg): New field stopped. -+ (ptrace_attach): New parameter stoppedp. Set it appropriately. -+ (pid_set_initial_registers): Pass the new field. -+ (pid_thread_detach): Handle the case of STOPPED for old kernels. -+ (__libdwfl_attach_state_for_pid): Initialize STOPPED. -+ - 2013-11-07 Jan Kratochvil - Mark Wielaard - -@@ -2478,6 +2493,11 @@ - - 2005-07-21 Roland McGrath - -+ * Makefile.am (WEXTRA): New variable, substituted by configure. -+ (AM_CFLAGS): Use it in place of -Wextra. -+ -+2005-07-21 Roland McGrath -+ - * Makefile.am (noinst_HEADERS): Add loc2c.c. - - * test2.c (main): Check sscanf result to quiet warning. -diffelfutils/libdwfl/linux-core-attach.c git-portable/libdwfl/linux-core-attach.c ---- elfutils/libdwfl/linux-core-attach.c -+++ elfutils/libdwfl/linux-core-attach.c -@@ -29,6 +29,35 @@ - #include "libdwflP.h" - #include - #include "system.h" -+#include -+#include -+#if __BYTE_ORDER == __LITTLE_ENDIAN -+# ifndef be64toh -+# define be64toh(x) bswap_64 (x) -+# endif -+# ifndef le64toh -+# define le64toh(x) (x) -+# endif -+# ifndef be32toh -+# define be32toh(x) bswap_32 (x) -+# endif -+# ifndef le32toh -+# define le32toh(x) (x) -+# endif -+#else -+# ifndef be64toh -+# define be64toh(x) (x) -+# endif -+# ifndef le64toh -+# define le64toh(x) bswap_64 (x) -+# endif -+# ifndef be32toh -+# define be32toh(x) (x) -+# endif -+# ifndef le32toh -+# define le32toh(x) bswap_32 (x) -+# endif -+#endif - - #include "../libdw/memory-access.h" - -diffelfutils/libdwfl/linux-pid-attach.c git-portable/libdwfl/linux-pid-attach.c ---- elfutils/libdwfl/linux-pid-attach.c -+++ elfutils/libdwfl/linux-pid-attach.c -@@ -255,6 +255,11 @@ void - internal_function - __libdwfl_ptrace_detach (pid_t tid, bool tid_was_stopped) - { -+ // Older kernels (tested kernel-2.6.18-348.12.1.el5.x86_64) need special -+ // handling of the detachment to keep the process State: T (stopped). -+ if (tid_was_stopped) -+ syscall (__NR_tkill, tid, SIGSTOP); -+ - /* This handling is needed only on older Linux kernels such as - 2.6.32-358.23.2.el6.ppc64. Later kernels such as - 3.11.7-200.fc19.x86_64 remember the T (stopped) state -@@ -262,6 +267,15 @@ __libdwfl_ptrace_detach (pid_t tid, bool - PTRACE_DETACH. */ - ptrace (PTRACE_DETACH, tid, NULL, - (void *) (intptr_t) (tid_was_stopped ? SIGSTOP : 0)); -+ -+ if (tid_was_stopped) -+ { -+ // Wait till the SIGSTOP settles down. -+ int i; -+ for (i = 0; i < 100000; i++) -+ if (linux_proc_pid_is_stopped (tid)) -+ break; -+ } - } - - static void -diffelfutils/libdwfl/Makefile.in git-portable/libdwfl/Makefile.in ---- elfutils/libdwfl/Makefile.in -+++ elfutils/libdwfl/Makefile.in -@@ -89,10 +89,11 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING --@ZLIB_TRUE@am__append_2 = gzip.c --@BZLIB_TRUE@am__append_3 = bzip2.c --@LZMA_TRUE@am__append_4 = lzma.c -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING -+@ZLIB_TRUE@am__append_3 = gzip.c -+@BZLIB_TRUE@am__append_4 = bzip2.c -+@LZMA_TRUE@am__append_5 = lzma.c - subdir = libdwfl - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 - am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -301,6 +302,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -332,6 +334,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = 1 -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -399,14 +402,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr - - # Warn about stack usage of more than 256K = 262144 bytes. - @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ -- $(if $($(*F)_no_Werror),,-Werror) \ -- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ -- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -- $($(*F)_CFLAGS) -- -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ -+ $($(*F)_no_Werror),,-Werror) $(if \ -+ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ -+ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -+ $($(*F)_CFLAGS) $(am__append_1) - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) --DEFS.os = -DPIC -DSHARED $(am__append_1) -+DEFS.os = -DPIC -DSHARED $(am__append_2) - CLEANFILES = *.gcno *.gcda $(am_libdwfl_pic_a_OBJECTS) - textrel_msg = echo "WARNING: TEXTREL found in '$@'" - @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) -@@ -435,8 +438,8 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_en - dwfl_module_register_names.c dwfl_segment_report_module.c \ - link_map.c core-file.c open.c image-header.c dwfl_frame.c \ - frame_unwind.c dwfl_frame_pc.c linux-pid-attach.c \ -- linux-core-attach.c dwfl_frame_regs.c $(am__append_2) \ -- $(am__append_3) $(am__append_4) -+ linux-core-attach.c dwfl_frame_regs.c $(am__append_3) \ -+ $(am__append_4) $(am__append_5) - libdwfl = $(libdw) - libdw = ../libdw/libdw.so - libelf = ../libelf/libelf.so -diffelfutils/libebl/ChangeLog git-portable/libebl/ChangeLog ---- elfutils/libebl/ChangeLog -+++ elfutils/libebl/ChangeLog -@@ -785,6 +785,11 @@ - * Makefile.am (libebl_*_so_SOURCES): Set to $(*_SRCS) so dependency - tracking works right. - -+2005-05-31 Roland McGrath -+ -+ * Makefile.am (WEXTRA): New variable, substituted by configure. -+ (AM_CFLAGS): Use it in place of -Wextra. -+ - 2005-05-21 Ulrich Drepper - - * libebl_x86_64.map: Add x86_64_core_note. -diffelfutils/libebl/Makefile.in git-portable/libebl/Makefile.in ---- elfutils/libebl/Makefile.in -+++ elfutils/libebl/Makefile.in -@@ -89,7 +89,8 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING - subdir = libebl - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 - am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -264,6 +265,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -295,6 +297,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = 1 -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -362,13 +365,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr - - # Warn about stack usage of more than 256K = 262144 bytes. - @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \ -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ - $($(*F)_no_Werror),,-Werror) $(if \ -- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ -+ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ - $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -- $($(*F)_CFLAGS) -fpic -+ $($(*F)_CFLAGS) $(am__append_1) -fpic - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) --DEFS.os = -DPIC -DSHARED $(am__append_1) -+DEFS.os = -DPIC -DSHARED $(am__append_2) - CLEANFILES = *.gcno *.gcda $(am_libebl_pic_a_OBJECTS) - textrel_msg = echo "WARNING: TEXTREL found in '$@'" - @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) -diffelfutils/libelf/ChangeLog git-portable/libelf/ChangeLog ---- elfutils/libelf/ChangeLog -+++ elfutils/libelf/ChangeLog -@@ -412,6 +412,11 @@ - - * elf-knowledge.h (SECTION_STRIP_P): Remove < SHT_NUM check. - -+2011-03-10 Roland McGrath -+ -+ * gnuhash_xlate.h (elf_cvt_gnuhash): Avoid post-increment in bswap_32 -+ argument, since some implementations are buggy macros. -+ - 2011-02-26 Mark Wielaard - - * elf_end.c (elf_end): Call rwlock_unlock before rwlock_fini. -@@ -1089,6 +1094,11 @@ - - * elf.h: Update from glibc. - -+2005-05-31 Roland McGrath -+ -+ * Makefile.am (WEXTRA): New variable, substituted by configure. -+ (AM_CFLAGS): Use it in place of -Wextra. -+ - 2005-05-08 Roland McGrath - - * elf_begin.c (read_file) [_MUDFLAP]: Don't use mmap for now. -diffelfutils/libelf/common.h git-portable/libelf/common.h ---- elfutils/libelf/common.h -+++ elfutils/libelf/common.h -@@ -139,7 +139,7 @@ libelf_release_all (Elf *elf) - (Var) = (sizeof (Var) == 1 \ - ? (unsigned char) (Var) \ - : (sizeof (Var) == 2 \ -- ? bswap_16 (Var) \ -+ ? (unsigned short int) bswap_16 (Var) \ - : (sizeof (Var) == 4 \ - ? bswap_32 (Var) \ - : bswap_64 (Var)))) -@@ -148,7 +148,7 @@ libelf_release_all (Elf *elf) - (Dst) = (sizeof (Var) == 1 \ - ? (unsigned char) (Var) \ - : (sizeof (Var) == 2 \ -- ? bswap_16 (Var) \ -+ ? (unsigned short int) bswap_16 (Var) \ - : (sizeof (Var) == 4 \ - ? bswap_32 (Var) \ - : bswap_64 (Var)))) -diffelfutils/libelf/gnuhash_xlate.h git-portable/libelf/gnuhash_xlate.h ---- elfutils/libelf/gnuhash_xlate.h -+++ elfutils/libelf/gnuhash_xlate.h -@@ -1,5 +1,5 @@ - /* Conversion functions for versioning information. -- Copyright (C) 2006, 2007 Red Hat, Inc. -+ Copyright (C) 2006-2011 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 2006. - -@@ -68,7 +68,9 @@ elf_cvt_gnuhash (void *dest, const void - dest32 = (Elf32_Word *) &dest64[bitmask_words]; - while (len >= 4) - { -- *dest32++ = bswap_32 (*src32++); -+ *dest32 = bswap_32 (*src32); -+ ++dest32; -+ ++src32; - len -= 4; - } - } -diffelfutils/libelf/Makefile.in git-portable/libelf/Makefile.in ---- elfutils/libelf/Makefile.in -+++ elfutils/libelf/Makefile.in -@@ -90,10 +90,11 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING --@BUILD_STATIC_TRUE@am__append_2 = -fpic -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING -+@BUILD_STATIC_TRUE@am__append_3 = -fpic - noinst_PROGRAMS = $(am__EXEEXT_1) --@USE_LOCKS_TRUE@am__append_3 = -lpthread -+@USE_LOCKS_TRUE@am__append_4 = -lpthread - subdir = libelf - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 - am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -305,6 +306,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -336,6 +338,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = 1 -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -401,13 +404,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr - - # Warn about stack usage of more than 256K = 262144 bytes. - @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \ -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ - $($(*F)_no_Werror),,-Werror) $(if \ -- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ -+ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ - $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -- $($(*F)_CFLAGS) $(am__append_2) -+ $($(*F)_CFLAGS) $(am__append_1) $(am__append_3) - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) --DEFS.os = -DPIC -DSHARED $(am__append_1) -+DEFS.os = -DPIC -DSHARED $(am__append_2) - CLEANFILES = *.gcno *.gcda $(am_libelf_pic_a_OBJECTS) \ - libelf.so.$(VERSION) - textrel_msg = echo "WARNING: TEXTREL found in '$@'" -@@ -470,7 +474,7 @@ libelf_a_SOURCES = elf_version.c elf_has - - libelf_pic_a_SOURCES = - am_libelf_pic_a_OBJECTS = $(libelf_a_SOURCES:.c=.os) --libelf_so_LDLIBS = $(am__append_3) -+libelf_so_LDLIBS = $(am__append_4) - libelf_so_SOURCES = - noinst_HEADERS = elf.h abstract.h common.h exttypes.h gelf_xlate.h libelfP.h \ - version_xlate.h gnuhash_xlate.h note_xlate.h dl-hash.h -diffelfutils/m4/Makefile.in git-portable/m4/Makefile.in ---- elfutils/m4/Makefile.in -+++ elfutils/m4/Makefile.in -@@ -159,6 +159,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -190,6 +191,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = @VERSION@ -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -diffelfutils/Makefile.in git-portable/Makefile.in ---- elfutils/Makefile.in -+++ elfutils/Makefile.in -@@ -277,6 +277,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -308,6 +309,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = @VERSION@ -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -diffelfutils/src/addr2line.c git-portable/src/addr2line.c ---- elfutils/src/addr2line.c -+++ elfutils/src/addr2line.c -@@ -622,10 +622,10 @@ handle_address (const char *string, Dwfl - bool parsed = false; - int i, j; - char *name = NULL; -- if (sscanf (string, "(%m[^)])%" PRIiMAX "%n", &name, &addr, &i) == 2 -+ if (sscanf (string, "(%a[^)])%" PRIiMAX "%n", &name, &addr, &i) == 2 - && string[i] == '\0') - parsed = adjust_to_section (name, &addr, dwfl); -- switch (sscanf (string, "%m[^-+]%n%" PRIiMAX "%n", &name, &i, &addr, &j)) -+ switch (sscanf (string, "%a[^-+]%n%" PRIiMAX "%n", &name, &i, &addr, &j)) - { - default: - break; -diffelfutils/src/ar.c git-portable/src/ar.c ---- elfutils/src/ar.c -+++ elfutils/src/ar.c -@@ -685,7 +685,14 @@ do_oper_extract (int oper, const char *a - tv[1].tv_sec = arhdr->ar_date; - tv[1].tv_nsec = 0; - -+#ifdef HAVE_FUTIMENS - if (unlikely (futimens (xfd, tv) != 0)) -+#else -+ struct timeval times[2]; -+ TIMESPEC_TO_TIMEVAL (×[0], &tv[0]); -+ TIMESPEC_TO_TIMEVAL (×[1], &tv[1]); -+ if (unlikely (futimes (xfd, times) != 0)) -+#endif - { - error (0, errno, - gettext ("cannot change modification time of %s"), -diffelfutils/src/ChangeLog git-portable/src/ChangeLog ---- elfutils/src/ChangeLog -+++ elfutils/src/ChangeLog -@@ -1626,8 +1626,16 @@ - * readelf.c (attr_callback): Use print_block only when we don't use - print_ops. - -+2009-08-17 Roland McGrath -+ -+ * ld.h: Disable extern inlines for GCC 4.2. -+ - 2009-08-14 Roland McGrath - -+ * strings.c (read_block): Conditionalize posix_fadvise use -+ on [POSIX_FADV_SEQUENTIAL]. -+ From Petr Salinger . -+ - * ar.c (do_oper_extract): Use pathconf instead of statfs. - - 2009-08-01 Ulrich Drepper -@@ -1791,6 +1799,8 @@ - * readelf.c (print_debug_frame_section): Use t instead of j formats - for ptrdiff_t OFFSET. - -+ * addr2line.c (handle_address): Use %a instead of %m for compatibility. -+ - 2009-01-21 Ulrich Drepper - - * elflint.c (check_program_header): Fix typo in .eh_frame_hdr section -@@ -1974,6 +1984,11 @@ - that matches its PT_LOAD's p_flags &~ PF_W. On sparc, PF_X really - is valid in RELRO. - -+2008-03-01 Roland McGrath -+ -+ * readelf.c (dump_archive_index): Tweak portability hack -+ to match [__GNUC__ < 4] too. -+ - 2008-02-29 Roland McGrath - - * readelf.c (print_attributes): Add a cast. -@@ -2225,6 +2240,8 @@ - - * readelf.c (hex_dump): Fix rounding error in whitespace calculation. - -+ * Makefile.am (readelf_no_Werror): New variable. -+ - 2007-10-15 Roland McGrath - - * make-debug-archive.in: New file. -@@ -2664,6 +2681,10 @@ - * elflint.c (valid_e_machine): Add EM_ALPHA. - Reported by Christian Aichinger . - -+ * strings.c (map_file): Define POSIX_MADV_SEQUENTIAL to -+ MADV_SEQUENTIAL if undefined. Don't call posix_madvise -+ if neither is defined. -+ - 2006-08-08 Ulrich Drepper - - * elflint.c (check_dynamic): Don't require DT_HASH for DT_SYMTAB. -@@ -2740,6 +2761,10 @@ - * Makefile.am: Add hacks to create dependency files for non-generic - linker. - -+2006-04-05 Roland McGrath -+ -+ * strings.c (MAP_POPULATE): Define to 0 if undefined. -+ - 2006-06-12 Ulrich Drepper - - * ldgeneric.c (ld_generic_generate_sections): Don't create .interp -@@ -3088,6 +3113,11 @@ - * readelf.c (print_debug_loc_section): Fix indentation for larger - address size. - -+2005-05-31 Roland McGrath -+ -+ * Makefile.am (WEXTRA): New variable, substituted by configure. -+ (AM_CFLAGS): Use it in place of -Wextra. -+ - 2005-05-30 Roland McGrath - - * readelf.c (print_debug_line_section): Print section offset of each -diffelfutils/src/findtextrel.c git-portable/src/findtextrel.c ---- elfutils/src/findtextrel.c -+++ elfutils/src/findtextrel.c -@@ -503,7 +503,11 @@ ptrcompare (const void *p1, const void * - - - static void --check_rel (size_t nsegments, struct segments segments[nsegments], -+check_rel (size_t nsegments, struct segments segments[ -+#if __GNUC__ >= 4 -+ nsegments -+#endif -+ ], - GElf_Addr addr, Elf *elf, Elf_Scn *symscn, Dwarf *dw, - const char *fname, bool more_than_one, void **knownsrcs) - { -diffelfutils/src/ld.h git-portable/src/ld.h ---- elfutils/src/ld.h -+++ elfutils/src/ld.h -@@ -1114,6 +1114,7 @@ extern bool dynamically_linked_p (void); - - /* Checked whether the symbol is undefined and referenced from a DSO. */ - extern bool linked_from_dso_p (struct scninfo *scninfo, size_t symidx); -+#if defined __OPTIMIZE__ && !(__GNUC__ == 4 && __GNUC_MINOR__ == 2) - #ifdef __GNUC_STDC_INLINE__ - __attribute__ ((__gnu_inline__)) - #endif -@@ -1131,5 +1132,6 @@ linked_from_dso_p (struct scninfo *scnin - - return sym->defined && sym->in_dso; - } -+#endif /* Optimizing and not GCC 4.2. */ - - #endif /* ld.h */ -diffelfutils/src/Makefile.am git-portable/src/Makefile.am ---- elfutils/src/Makefile.am -+++ elfutils/src/Makefile.am -@@ -90,6 +90,11 @@ endif - ldgeneric_no_Wunused = yes - ldgeneric_no_Wstack_usage = yes - -+# Buggy old compilers or libc headers. -+readelf_no_Werror = yes -+strings_no_Werror = yes -+addr2line_no_Wformat = yes -+ - # Bad, bad stack usage... - readelf_no_Wstack_usage = yes - nm_no_Wstack_usage = yes -diffelfutils/src/Makefile.in git-portable/src/Makefile.in ---- elfutils/src/Makefile.in -+++ elfutils/src/Makefile.in -@@ -91,7 +91,8 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING - bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEEXT) size$(EXEEXT) \ - strip$(EXEEXT) ld$(EXEEXT) elflint$(EXEEXT) \ - findtextrel$(EXEEXT) addr2line$(EXEEXT) elfcmp$(EXEEXT) \ -@@ -100,9 +101,9 @@ bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEE - @NATIVE_LD_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1) - # We never build this library but we need to get the dependency files - # of all the linker backends that might be used in a non-generic linker. --@NEVER_TRUE@am__append_2 = libdummy.a -+@NEVER_TRUE@am__append_3 = libdummy.a - # -ldl is always needed for libebl. --@NATIVE_LD_TRUE@am__append_3 = libld_elf.a -+@NATIVE_LD_TRUE@am__append_4 = libld_elf.a - @NATIVE_LD_TRUE@am_libld_elf_i386_pic_a_OBJECTS = - subdir = src - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -@@ -172,7 +173,7 @@ am_ld_OBJECTS = ld.$(OBJEXT) ldgeneric.$ - versionhash.$(OBJEXT) - ld_OBJECTS = $(am_ld_OBJECTS) - ld_DEPENDENCIES = $(libebl) $(libelf) $(libeu) $(am__DEPENDENCIES_1) \ -- $(am__append_3) -+ $(am__append_4) - ld_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(ld_LDFLAGS) $(LDFLAGS) -o \ - $@ - am_libld_elf_i386_so_OBJECTS = -@@ -361,6 +362,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -392,6 +394,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = @VERSION@ -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -460,14 +463,14 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_sr - - # Warn about stack usage of more than 256K = 262144 bytes. - @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ -- $(if $($(*F)_no_Werror),,-Werror) \ -- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ -- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -- $($(*F)_CFLAGS) -- -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ -+ $($(*F)_no_Werror),,-Werror) $(if \ -+ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ -+ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -+ $($(*F)_CFLAGS) $(am__append_1) - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) --DEFS.os = -DPIC -DSHARED $(am__append_1) -+DEFS.os = -DPIC -DSHARED $(am__append_2) - CLEANFILES = *.gcno *.gcda make-debug-archive none_ld.os \ - $(ld_modules:.c=.os) *.gconv - textrel_msg = echo "WARNING: TEXTREL found in '$@'" -@@ -480,8 +483,8 @@ AM_LFLAGS = -Pld -olex.yy.c - native_ld = @native_ld@ - ld_dsos = libld_elf_i386_pic.a - @NATIVE_LD_FALSE@noinst_LIBRARIES = libld_elf.a libar.a $(ld_dsos) \ --@NATIVE_LD_FALSE@ $(am__append_2) --@NATIVE_LD_TRUE@noinst_LIBRARIES = libld_elf.a libar.a $(am__append_2) -+@NATIVE_LD_FALSE@ $(am__append_3) -+@NATIVE_LD_TRUE@noinst_LIBRARIES = libld_elf.a libar.a $(am__append_3) - @NATIVE_LD_TRUE@native_ld_cflags = -DBASE_ELF_NAME=elf_$(base_cpu) - @NEVER_TRUE@libdummy_a_SOURCES = i386_ld.c - ld_SOURCES = ld.c ldgeneric.c ldlex.l ldscript.y symbolhash.c sectionhash.c \ -@@ -509,6 +512,11 @@ libeu = ../lib/libeu.a - ldgeneric_no_Wunused = yes - ldgeneric_no_Wstack_usage = yes - -+# Buggy old compilers or libc headers. -+readelf_no_Werror = yes -+strings_no_Werror = yes -+addr2line_no_Wformat = yes -+ - # Bad, bad stack usage... - readelf_no_Wstack_usage = yes - nm_no_Wstack_usage = yes -@@ -528,7 +536,7 @@ nm_LDADD = $(libdw) $(libebl) $(libelf) - size_LDADD = $(libelf) $(libeu) $(argp_LDADD) - strip_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl - ld_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl \ -- $(am__append_3) -+ $(am__append_4) - ld_LDFLAGS = -rdynamic - elflint_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl - findtextrel_LDADD = $(libdw) $(libelf) $(argp_LDADD) -diffelfutils/src/readelf.c git-portable/src/readelf.c ---- elfutils/src/readelf.c -+++ elfutils/src/readelf.c -@@ -4366,10 +4366,12 @@ listptr_base (struct listptr *p) - return base; - } - -+static const char *listptr_name; -+ - static int --compare_listptr (const void *a, const void *b, void *arg) -+compare_listptr (const void *a, const void *b) - { -- const char *name = arg; -+ const char *const name = listptr_name; - struct listptr *p1 = (void *) a; - struct listptr *p2 = (void *) b; - -@@ -4465,8 +4467,11 @@ static void - sort_listptr (struct listptr_table *table, const char *name) - { - if (table->n > 0) -- qsort_r (table->table, table->n, sizeof table->table[0], -- &compare_listptr, (void *) name); -+ { -+ listptr_name = name; -+ qsort (table->table, table->n, sizeof table->table[0], -+ &compare_listptr); -+ } - } - - static bool -@@ -9563,7 +9568,7 @@ dump_archive_index (Elf *elf, const char - if (unlikely (elf_rand (elf, as_off) == 0) - || unlikely ((subelf = elf_begin (-1, ELF_C_READ_MMAP, elf)) - == NULL)) --#if __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 7) -+#if __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 7) || __GNUC__ < 4 - while (1) - #endif - error (EXIT_FAILURE, 0, -diffelfutils/src/strings.c git-portable/src/strings.c ---- elfutils/src/strings.c -+++ elfutils/src/strings.c -@@ -43,6 +43,10 @@ - - #include - -+#ifndef MAP_POPULATE -+# define MAP_POPULATE 0 -+#endif -+ - - /* Prototypes of local functions. */ - static int read_fd (int fd, const char *fname, off64_t fdlen); -@@ -489,8 +493,13 @@ map_file (int fd, off64_t start_off, off - fd, start_off); - if (mem != MAP_FAILED) - { -+#if !defined POSIX_MADV_SEQUENTIAL && defined MADV_SEQUENTIAL -+# define POSIX_MADV_SEQUENTIAL MADV_SEQUENTIAL -+#endif -+#ifdef POSIX_MADV_SEQUENTIAL - /* We will go through the mapping sequentially. */ - (void) posix_madvise (mem, map_size, POSIX_MADV_SEQUENTIAL); -+#endif - break; - } - if (errno != EINVAL && errno != ENOMEM) -@@ -581,9 +590,11 @@ read_block (int fd, const char *fname, o - elfmap_off = from & ~(ps - 1); - elfmap_base = elfmap = map_file (fd, elfmap_off, fdlen, &elfmap_size); - -+#ifdef POSIX_FADV_SEQUENTIAL - if (unlikely (elfmap == MAP_FAILED)) - /* Let the kernel know we are going to read everything in sequence. */ - (void) posix_fadvise (fd, 0, 0, POSIX_FADV_SEQUENTIAL); -+#endif - } - - if (unlikely (elfmap == MAP_FAILED)) -diffelfutils/src/strip.c git-portable/src/strip.c ---- elfutils/src/strip.c -+++ elfutils/src/strip.c -@@ -2191,7 +2191,14 @@ while computing checksum for debug infor - /* If requested, preserve the timestamp. */ - if (tvp != NULL) - { -+#ifdef HAVE_FUTIMENS - if (futimens (fd, tvp) != 0) -+#else -+ struct timeval times[2]; -+ TIMESPEC_TO_TIMEVAL (×[0], &tvp[0]); -+ TIMESPEC_TO_TIMEVAL (×[1], &tvp[1]); -+ if (futimes (fd, times) != 0) -+#endif - { - error (0, errno, gettext ("\ - cannot set access and modification date of '%s'"), -@@ -2263,7 +2270,14 @@ handle_ar (int fd, Elf *elf, const char - - if (tvp != NULL) - { -+#ifdef HAVE_FUTIMENS - if (unlikely (futimens (fd, tvp) != 0)) -+#else -+ struct timeval times[2]; -+ TIMESPEC_TO_TIMEVAL (×[0], &tvp[0]); -+ TIMESPEC_TO_TIMEVAL (×[1], &tvp[1]); -+ if (unlikely (futimes (fd, times) != 0)) -+#endif - { - error (0, errno, gettext ("\ - cannot set access and modification date of '%s'"), fname); -diffelfutils/tests/backtrace.c git-portable/tests/backtrace.c ---- elfutils/tests/backtrace.c -+++ elfutils/tests/backtrace.c -@@ -36,6 +36,7 @@ - #include - #include - #include -+#include - #include ELFUTILS_HEADER(dwfl) - - #ifndef __linux__ -diffelfutils/tests/ChangeLog git-portable/tests/ChangeLog ---- elfutils/tests/ChangeLog -+++ elfutils/tests/ChangeLog -@@ -614,6 +614,13 @@ - - 2013-12-02 Jan Kratochvil - -+ Handle T-stopped detach for old kernels. -+ * backtrace.c: Include sys/syscall.h. -+ (linux_proc_pid_is_stopped): New function. -+ (ptrace_detach_stopped): Handle old kernels. -+ -+2013-12-02 Jan Kratochvil -+ - * Makefile.am (check_PROGRAMS): Add backtrace, backtrace-child, - backtrace-data and backtrace-dwarf. - (BUILT_SOURCES, clean-local, backtrace-child-biarch): New. -@@ -1478,6 +1485,8 @@ - - 2008-01-21 Roland McGrath - -+ * line2addr.c (main): Revert last change. -+ - * testfile45.S.bz2: Add tests for cltq, cqto. - * testfile45.expect.bz2: Adjust. - -@@ -2186,6 +2195,11 @@ - * Makefile.am (TESTS): Add run-elflint-test.sh. - (EXTRA_DIST): Add run-elflint-test.sh and testfile18.bz2. - -+2005-05-31 Roland McGrath -+ -+ * Makefile.am (WEXTRA): New variable, substituted by configure. -+ (AM_CFLAGS): Use it in place of -Wextra. -+ - 2005-05-24 Ulrich Drepper - - * get-files.c (main): Use correct format specifier. -diffelfutils/tests/line2addr.c git-portable/tests/line2addr.c ---- elfutils/tests/line2addr.c -+++ elfutils/tests/line2addr.c -@@ -124,7 +124,7 @@ main (int argc, char *argv[]) - { - struct args a = { .arg = argv[cnt] }; - -- switch (sscanf (a.arg, "%m[^:]:%d", &a.file, &a.line)) -+ switch (sscanf (a.arg, "%a[^:]:%d", &a.file, &a.line)) - { - default: - case 0: -diffelfutils/tests/Makefile.am git-portable/tests/Makefile.am ---- elfutils/tests/Makefile.am -+++ elfutils/tests/Makefile.am -@@ -382,6 +382,7 @@ get_lines_LDADD = $(libdw) $(libelf) - get_files_LDADD = $(libdw) $(libelf) - get_aranges_LDADD = $(libdw) $(libelf) - allfcts_LDADD = $(libdw) $(libelf) -+line2addr_no_Wformat = yes - line2addr_LDADD = $(libdw) $(argp_LDADD) - addrscopes_LDADD = $(libdw) $(argp_LDADD) - funcscopes_LDADD = $(libdw) $(argp_LDADD) -diffelfutils/tests/Makefile.in git-portable/tests/Makefile.in ---- elfutils/tests/Makefile.in -+++ elfutils/tests/Makefile.in -@@ -87,14 +87,15 @@ PRE_UNINSTALL = : - POST_UNINSTALL = : - build_triplet = @build@ - host_triplet = @host@ --@SYMBOL_VERSIONING_TRUE@am__append_1 = -DSYMBOL_VERSIONING --@STANDALONE_FALSE@am__append_2 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \ -+@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) -+@SYMBOL_VERSIONING_TRUE@am__append_2 = -DSYMBOL_VERSIONING -+@STANDALONE_FALSE@am__append_3 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \ - @STANDALONE_FALSE@ -I$(top_srcdir)/libdwfl -I$(top_srcdir)/libdwelf \ - @STANDALONE_FALSE@ -I$(top_srcdir)/libebl -I$(top_srcdir)/libelf \ - @STANDALONE_FALSE@ -I$(top_srcdir)/lib -I.. - --@STANDALONE_FALSE@am__append_3 = -Wl,-rpath-link,../libasm:../libdw:../libelf --@TESTS_RPATH_TRUE@am__append_4 = -Wl,-rpath,$(BUILD_RPATH) -+@STANDALONE_FALSE@am__append_4 = -Wl,-rpath-link,../libasm:../libdw:../libelf -+@TESTS_RPATH_TRUE@am__append_5 = -Wl,-rpath,$(BUILD_RPATH) - check_PROGRAMS = arextract$(EXEEXT) arsymtest$(EXEEXT) \ - newfile$(EXEEXT) saridx$(EXEEXT) scnnames$(EXEEXT) \ - sectiondump$(EXEEXT) showptable$(EXEEXT) update1$(EXEEXT) \ -@@ -123,7 +124,7 @@ check_PROGRAMS = arextract$(EXEEXT) arsy - aggregate_size$(EXEEXT) vdsosyms$(EXEEXT) getsrc_die$(EXEEXT) \ - strptr$(EXEEXT) newdata$(EXEEXT) elfstrtab$(EXEEXT) \ - $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4) --@BIARCH_TRUE@am__append_5 = backtrace-child-biarch -+@BIARCH_TRUE@am__append_6 = backtrace-child-biarch - TESTS = run-arextract.sh run-arsymtest.sh newfile$(EXEEXT) \ - test-nlist$(EXEEXT) update1$(EXEEXT) update2$(EXEEXT) \ - update3$(EXEEXT) update4$(EXEEXT) run-show-die-info.sh \ -@@ -173,14 +174,14 @@ TESTS = run-arextract.sh run-arsymtest.s - run-allfcts-multi.sh run-deleted.sh run-linkmap-cut.sh \ - run-aggregate-size.sh vdsosyms$(EXEEXT) run-readelf-A.sh \ - run-getsrc-die.sh run-strptr.sh newdata$(EXEEXT) \ -- elfstrtab$(EXEEXT) $(am__EXEEXT_2) $(am__append_8) \ -- $(am__append_9) $(am__EXEEXT_4) --@STANDALONE_FALSE@am__append_6 = msg_tst md5-sha1-test -+ elfstrtab$(EXEEXT) $(am__EXEEXT_2) $(am__append_9) \ -+ $(am__append_10) $(am__EXEEXT_4) - @STANDALONE_FALSE@am__append_7 = msg_tst md5-sha1-test --@LZMA_TRUE@am__append_8 = run-readelf-s.sh run-dwflsyms.sh --@ZLIB_TRUE@am__append_9 = run-readelf-zdebug.sh --@HAVE_LIBASM_TRUE@am__append_10 = $(asm_TESTS) -+@STANDALONE_FALSE@am__append_8 = msg_tst md5-sha1-test -+@LZMA_TRUE@am__append_9 = run-readelf-s.sh run-dwflsyms.sh -+@ZLIB_TRUE@am__append_10 = run-readelf-zdebug.sh - @HAVE_LIBASM_TRUE@am__append_11 = $(asm_TESTS) -+@HAVE_LIBASM_TRUE@am__append_12 = $(asm_TESTS) - subdir = tests - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 - am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \ -@@ -830,6 +831,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - LDFLAGS = @LDFLAGS@ -+LD_AS_NEEDED = @LD_AS_NEEDED@ - LEX = @LEX@ - LEXLIB = @LEXLIB@ - LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -@@ -861,6 +863,7 @@ SHELL = @SHELL@ - STRIP = @STRIP@ - USE_NLS = @USE_NLS@ - VERSION = @VERSION@ -+WEXTRA = @WEXTRA@ - XGETTEXT = @XGETTEXT@ - XGETTEXT_015 = @XGETTEXT_015@ - XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ -@@ -921,26 +924,26 @@ top_build_prefix = @top_build_prefix@ - top_builddir = @top_builddir@ - top_srcdir = @top_srcdir@ - zip_LIBS = @zip_LIBS@ --AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. $(am__append_2) -+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. $(am__append_3) - @ADD_STACK_USAGE_WARNING_FALSE@STACK_USAGE_WARNING = - - # Warn about stack usage of more than 256K = 262144 bytes. - @ADD_STACK_USAGE_WARNING_TRUE@STACK_USAGE_WARNING = -Wstack-usage=262144 --AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ -- $(if $($(*F)_no_Werror),,-Werror) \ -- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ -- $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -- $($(*F)_CFLAGS) -- -+AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ -+ $($(*F)_no_Werror),,-Werror) $(if \ -+ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ -+ $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $(if \ -+ $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -+ $($(*F)_CFLAGS) $(am__append_1) - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) --DEFS.os = -DPIC -DSHARED $(am__append_1) -+DEFS.os = -DPIC -DSHARED $(am__append_2) - CLEANFILES = *.gcno *.gcda - textrel_msg = echo "WARNING: TEXTREL found in '$@'" - @FATAL_TEXTREL_FALSE@textrel_found = $(textrel_msg) - @FATAL_TEXTREL_TRUE@textrel_found = $(textrel_msg); exit 1 - textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then $(textrel_found); fi - BUILD_RPATH = \$$ORIGIN/../libasm:\$$ORIGIN/../libdw:\$$ORIGIN/../backends:\$$ORIGIN/../libelf --AM_LDFLAGS = $(am__append_3) $(am__append_4) -+AM_LDFLAGS = $(am__append_4) $(am__append_5) - @TESTS_RPATH_FALSE@tests_rpath = no - @TESTS_RPATH_TRUE@tests_rpath = yes - asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ -@@ -1167,6 +1170,7 @@ get_lines_LDADD = $(libdw) $(libelf) - get_files_LDADD = $(libdw) $(libelf) - get_aranges_LDADD = $(libdw) $(libelf) - allfcts_LDADD = $(libdw) $(libelf) -+line2addr_no_Wformat = yes - line2addr_LDADD = $(libdw) $(argp_LDADD) - addrscopes_LDADD = $(libdw) $(argp_LDADD) - funcscopes_LDADD = $(libdw) $(argp_LDADD) diff --git a/elfutils.spec b/elfutils.spec index ec4fbfc..57910ed 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,88 +1,38 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects -Version: 0.163 -%global baserelease 4 +Version: 0.164 +%global baserelease 1 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) Group: Development/Tools -%if %{?_with_compat:1}%{!?_with_compat:0} -%global compat 1 -%else -%global compat 0 -%endif +Release: %{baserelease}%{?dist} -%global portability %{compat} -%global scanf_has_m !%{compat} -%global separate_devel_static 1 -%global use_zlib 0 -%global use_xz 0 %global provide_yama_scope 0 -%if 0%{?rhel} -%global portability (%rhel < 6) -%global scanf_has_m (%rhel >= 6) -%global separate_devel_static (%rhel >= 6) -%global use_zlib (%rhel >= 5) -%global use_xz (%rhel >= 5) -%endif %if 0%{?fedora} -%global portability (%fedora < 9) -%global scanf_has_m (%fedora >= 8) -%global separate_devel_static (%fedora >= 7) -%global use_zlib (%fedora >= 5) -%global use_xz (%fedora >= 10) %global provide_yama_scope (%fedora >= 22) %endif -%if %{compat} || %{!?rhel:6}%{?rhel} < 6 -%global nocheck true -%else -%global nocheck false -%endif - %global depsuffix %{?_isa}%{!?_isa:-%{_arch}} Source: %{?source_url}%{name}-%{version}.tar.bz2 -Patch1: %{?source_url}elfutils-portability-%{version}.patch - -Patch2: elfutils-0.163-unstrip-shf_info_link.patch -Patch3: elfutils-0.163-default-yama-conf.patch -Patch4: elfutils-0.163-readelf-n-undefined-shift.patch - -%if !%{compat} -Release: %{baserelease}%{?dist} -%else -Release: 0.%{baserelease} -%endif +# Patches Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} -%if %{!?rhel:6}%{?rhel} < 6 || %{!?fedora:9}%{?fedora} < 10 -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) -%endif - BuildRequires: gettext BuildRequires: bison >= 1.875 BuildRequires: flex >= 2.5.4a BuildRequires: bzip2 -%if !%{compat} -BuildRequires: gcc >= 3.4 -%else -BuildRequires: gcc >= 3.2 -%endif +BuildRequires: gcc >= 4.4 -%if %{use_zlib} BuildRequires: zlib-devel >= 1.2.2.3 BuildRequires: bzip2-devel -%endif - -%if %{use_xz} BuildRequires: xz-devel -%endif %global _gnu %{nil} %global _program_prefix eu- @@ -122,9 +72,6 @@ Provides: elfutils-devel%{depsuffix} = %{version}-%{release} %endif Requires: elfutils-libs%{depsuffix} = %{version}-%{release} Requires: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} -%if !%{separate_devel_static} -Requires: elfutils-devel-static%{depsuffix} = %{version}-%{release} -%endif %description devel The elfutils-devel package contains the libraries to create @@ -170,9 +117,6 @@ License: GPLv2+ or LGPLv3+ Provides: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} %endif Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} -%if !%{separate_devel_static} -Requires: elfutils-libelf-devel-static%{depsuffix} = %{version}-%{release} -%endif Obsoletes: libelf-devel <= 0.8.2-2 %description libelf-devel @@ -217,26 +161,7 @@ profiling) of processes. %prep %setup -q -: 'compat=%compat' -: 'portability=%portability' -: 'separate_devel_static=%separate_devel_static' -: 'scanf_has_m=%scanf_has_m' - -%if %{portability} -%patch1 -p1 -b .portability -sleep 1 -find . \( -name Makefile.in -o -name aclocal.m4 \) -print | xargs touch -sleep 1 -find . \( -name configure -o -name config.h.in \) -print | xargs touch -%else -%if !%{scanf_has_m} -sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c -%endif -%endif - -%patch2 -p1 -b .shf_info_link -%patch3 -p1 -b .yama_scope -%patch4 -p1 -b .right_shift +# Apply patches find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -247,21 +172,10 @@ find . -name \*.sh ! -perm -0100 -print | xargs chmod +x # But add -Wformat explicitly for use with -Werror=format-security which # doesn't work without -Wformat (enabled by -Wall). RPM_OPT_FLAGS="${RPM_OPT_FLAGS/-Wall/}" -%if !%{compat} RPM_OPT_FLAGS="${RPM_OPT_FLAGS} -Wformat" -%endif - -%if %{compat} -# Some older glibc headers can run afoul of -Werror all by themselves. -# Disabling the fancy inlines avoids those problems. -RPM_OPT_FLAGS="$RPM_OPT_FLAGS -D__NO_INLINE__" -COMPAT_CONFIG_FLAGS="--disable-werror" -%else -COMPAT_CONFIG_FLAGS="" -%endif trap 'cat config.log' EXIT -%configure $COMPAT_CONFIG_FLAGS CFLAGS="$RPM_OPT_FLAGS -fexceptions" +%configure CFLAGS="$RPM_OPT_FLAGS -fexceptions" trap '' EXIT make -s %{?_smp_mflags} @@ -284,7 +198,7 @@ install -Dm0644 config/10-default-yama-scope.conf ${RPM_BUILD_ROOT}%{_sysctldir} %endif %check -make -s %{?_smp_mflags} check || (cat tests/test-suite.log; %{nocheck}) +make -s %{?_smp_mflags} check || (cat tests/test-suite.log; false) %clean rm -rf ${RPM_BUILD_ROOT} @@ -381,6 +295,10 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Fri Oct 16 2015 Mark Wielaard - 0.164-1 +- Update to elfutils-0.164 +- Drop old compat stuff + * Mon Sep 07 2015 Mark Wielaard - 0.163-4 - Add elfutils-0.163-readelf-n-undefined-shift.patch (#1259259) diff --git a/sources b/sources index 5b9fbad..10c085c 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -77ce87f259987d2e54e4d87b86cbee41 elfutils-0.163.tar.bz2 +2e4536c1c48034f188a80789a59114d8 elfutils-0.164.tar.bz2 From ff619663a1508de26d6bd96459e82a04082218a6 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 11 Jan 2016 11:26:15 +0100 Subject: [PATCH 018/216] Update to elfutils-0.165 (#1294079, #1236699, #807053) - Add eu-elfcompress - Add pkg-config files for libelf and libdw. --- .gitignore | 1 + elfutils.spec | 13 +++++++++++-- sources | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 5de8664..432a0fc 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /elfutils-0.162.tar.bz2 /elfutils-0.163.tar.bz2 /elfutils-0.164.tar.bz2 +/elfutils-0.165.tar.bz2 diff --git a/elfutils.spec b/elfutils.spec index 57910ed..ae5897f 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects -Version: 0.164 +Version: 0.165 %global baserelease 1 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ @@ -42,7 +42,8 @@ Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size (for listing the section sizes of an object or archive file), strip (for discarding symbols), readelf (to see the raw ELF file -structures), and elflint (to check for well-formed ELF files). +structures), elflint (to check for well-formed ELF files) and +elfcompress (to compress or decompress ELF sections). %package libs @@ -237,6 +238,7 @@ rm -rf ${RPM_BUILD_ROOT} #%%{_bindir}/eu-ld %{_bindir}/eu-unstrip %{_bindir}/eu-make-debug-archive +%{_bindir}/eu-elfcompress %files libs %defattr(-,root,root) @@ -264,6 +266,7 @@ rm -rf ${RPM_BUILD_ROOT} %{_libdir}/libebl.a %{_libdir}/libasm.so %{_libdir}/libdw.so +%{_libdir}/pkgconfig/libdw.pc %files devel-static %defattr(-,root,root) @@ -283,6 +286,7 @@ rm -rf ${RPM_BUILD_ROOT} %{_includedir}/gelf.h %{_includedir}/nlist.h %{_libdir}/libelf.so +%{_libdir}/pkgconfig/libelf.pc %files libelf-devel-static %defattr(-,root,root) @@ -295,6 +299,11 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Mon Jan 11 2016 Mark Wielaard - 0.165-1 +- Update to elfutils-0.165 (#1294079, #1236699, #807053) + - Add eu-elfcompress + - Add pkg-config files for libelf and libdw. + * Fri Oct 16 2015 Mark Wielaard - 0.164-1 - Update to elfutils-0.164 - Drop old compat stuff diff --git a/sources b/sources index 10c085c..9227df6 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -2e4536c1c48034f188a80789a59114d8 elfutils-0.164.tar.bz2 +c37fdbe18e848002b451562cba964679 elfutils-0.165.tar.bz2 From 307d33240120c7768005b83309fad0764c1a84c0 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 14 Jan 2016 14:41:08 +0100 Subject: [PATCH 019/216] 0.165-2 - Add elfutils-0.165-elf-libelf.patch --- elfutils-0.165-elf-libelf.patch | 283 ++++++++++++++++++++++++++++++++ elfutils.spec | 9 +- 2 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.165-elf-libelf.patch diff --git a/elfutils-0.165-elf-libelf.patch b/elfutils-0.165-elf-libelf.patch new file mode 100644 index 0000000..c7405a3 --- /dev/null +++ b/elfutils-0.165-elf-libelf.patch @@ -0,0 +1,283 @@ +commit 344ca0775da729e1bfdd61bb88ba4c64befece07 +Author: Mark Wielaard +Date: Wed Jan 13 17:16:48 2016 +0100 + + libelf: Add ELF compression types and defines to libelf.h for older glibc. + + Older glibc elf.h might not define the new ELF compression defines and + types. If not just define them in libelf.h directly to make the libelf + headers work on older glibc systems. + + Also include a testcase to check the libelf headers build against the + system elf.h. + + https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=810885 + + Signed-off-by: Mark Wielaard + +diff --git a/libelf/ChangeLog b/libelf/ChangeLog +index 3a1fe91..aabf6f6 100644 +--- a/libelf/ChangeLog ++++ b/libelf/ChangeLog +@@ -1,3 +1,8 @@ ++2016-01-13 Mark Wielaard ++ ++ * libelf.h: Check SHF_COMPRESSED is defined. If not define it and the ++ associated ELF compression types/defines. ++ + 2015-11-26 Mark Wielaard + + * elf_compress.c (__libelf_decompress_elf): New function, extracted +diff --git a/libelf/libelf.h b/libelf/libelf.h +index 364e776..c0d6389 100644 +--- a/libelf/libelf.h ++++ b/libelf/libelf.h +@@ -35,6 +35,34 @@ + /* Get the ELF types. */ + #include + ++#ifndef SHF_COMPRESSED ++ /* Older glibc elf.h might not yet define the ELF compression types. */ ++ #define SHF_COMPRESSED (1 << 11) /* Section with compressed data. */ ++ ++ /* Section compression header. Used when SHF_COMPRESSED is set. */ ++ ++ typedef struct ++ { ++ Elf32_Word ch_type; /* Compression format. */ ++ Elf32_Word ch_size; /* Uncompressed data size. */ ++ Elf32_Word ch_addralign; /* Uncompressed data alignment. */ ++ } Elf32_Chdr; ++ ++ typedef struct ++ { ++ Elf64_Word ch_type; /* Compression format. */ ++ Elf64_Word ch_reserved; ++ Elf64_Xword ch_size; /* Uncompressed data size. */ ++ Elf64_Xword ch_addralign; /* Uncompressed data alignment. */ ++ } Elf64_Chdr; ++ ++ /* Legal values for ch_type (compression algorithm). */ ++ #define ELFCOMPRESS_ZLIB 1 /* ZLIB/DEFLATE algorithm. */ ++ #define ELFCOMPRESS_LOOS 0x60000000 /* Start of OS-specific. */ ++ #define ELFCOMPRESS_HIOS 0x6fffffff /* End of OS-specific. */ ++ #define ELFCOMPRESS_LOPROC 0x70000000 /* Start of processor-specific. */ ++ #define ELFCOMPRESS_HIPROC 0x7fffffff /* End of processor-specific. */ ++#endif + + /* Known translation types. */ + typedef enum +diff --git a/tests/ChangeLog b/tests/ChangeLog +index 366aea9..234ae56 100644 +--- a/tests/ChangeLog ++++ b/tests/ChangeLog +@@ -1,3 +1,11 @@ ++2016-01-13 Mark Wielaard ++ ++ * system-elf-libelf-test.c: New test. ++ * Makefile.am (TESTS): Add system-elf-libelf-test, if !STANDALONE. ++ (check_PROGRAMS): Likewise. ++ (system_elf_libelf_test_CPPFLAGS): New variable. ++ (system_elf_libelf_test_LDADD): Likewise. ++ + 2016-01-08 Mark Wielaard + + * elfputzdata.c (main): Fix parentheses in strncmp test. +diff --git a/tests/Makefile.am b/tests/Makefile.am +index d09a6d7..7b9e108 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -136,8 +136,8 @@ export ELFUTILS_DISABLE_DEMANGLE = 1 + endif + + if !STANDALONE +-check_PROGRAMS += msg_tst md5-sha1-test +-TESTS += msg_tst md5-sha1-test ++check_PROGRAMS += msg_tst md5-sha1-test system-elf-libelf-test ++TESTS += msg_tst md5-sha1-test system-elf-libelf-test + endif + + if LZMA +@@ -473,6 +473,11 @@ elfgetzdata_LDADD = $(libelf) + elfputzdata_LDADD = $(libelf) + zstrptr_LDADD = $(libelf) + ++# We want to test the libelf header against the system elf.h header. ++# Don't include any -I CPPFLAGS. ++system_elf_libelf_test_CPPFLAGS = ++system_elf_libelf_test_LDADD = $(libelf) ++ + if GCOV + check: check-am coverage + .PHONY: coverage +diff --git a/tests/system-elf-libelf-test.c b/tests/system-elf-libelf-test.c +new file mode 100644 +index 0000000..7dfe498 +--- /dev/null ++++ b/tests/system-elf-libelf-test.c +@@ -0,0 +1,35 @@ ++/* Explicit test compiling with system elf.h header plus libelf header. ++ ++ Copyright (C) 2016 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 "../libelf/libelf.h" ++ ++int ++main (void) ++{ ++ /* Trivial test, this is really a compile test anyway. */ ++ if (elf_version (EV_CURRENT) == EV_NONE) ++ return -1; ++ ++ /* This will obviously fail. It is just to check that Elf32_Chdr and ++ elf32_getchdr are available (both at compile time and runtime). */ ++ Elf32_Chdr *chdr = elf32_getchdr (NULL); ++ ++ return chdr == NULL ? 0 : -1; ++} + +diff -ru elfutils-0.165.orig/tests/Makefile.in elfutils-0.165/tests/Makefile.in +--- elfutils-0.165.orig/tests/Makefile.in 2016-01-14 14:37:27.557995293 +0100 ++++ elfutils-0.165/tests/Makefile.in 2016-01-14 14:37:39.621953358 +0100 +@@ -186,8 +186,8 @@ + run-elfputzdata.sh run-zstrptr.sh run-compress-test.sh \ + run-readelf-zdebug.sh run-readelf-zdebug-rel.sh \ + $(am__EXEEXT_2) $(am__append_8) $(am__EXEEXT_4) +-@STANDALONE_FALSE@am__append_6 = msg_tst md5-sha1-test +-@STANDALONE_FALSE@am__append_7 = msg_tst md5-sha1-test ++@STANDALONE_FALSE@am__append_6 = msg_tst md5-sha1-test system-elf-libelf-test ++@STANDALONE_FALSE@am__append_7 = msg_tst md5-sha1-test system-elf-libelf-test + @LZMA_TRUE@am__append_8 = run-readelf-s.sh run-dwflsyms.sh + @HAVE_LIBASM_TRUE@am__append_9 = $(asm_TESTS) + @HAVE_LIBASM_TRUE@am__append_10 = $(asm_TESTS) +@@ -206,7 +206,8 @@ + CONFIG_CLEAN_VPATH_FILES = + @BIARCH_TRUE@am__EXEEXT_1 = backtrace-child-biarch$(EXEEXT) + @STANDALONE_FALSE@am__EXEEXT_2 = msg_tst$(EXEEXT) \ +-@STANDALONE_FALSE@ md5-sha1-test$(EXEEXT) ++@STANDALONE_FALSE@ md5-sha1-test$(EXEEXT) \ ++@STANDALONE_FALSE@ system-elf-libelf-test$(EXEEXT) + am__EXEEXT_3 = asm-tst1$(EXEEXT) asm-tst2$(EXEEXT) asm-tst3$(EXEEXT) \ + asm-tst4$(EXEEXT) asm-tst5$(EXEEXT) asm-tst6$(EXEEXT) \ + asm-tst7$(EXEEXT) asm-tst8$(EXEEXT) asm-tst9$(EXEEXT) +@@ -490,6 +491,10 @@ + strptr_SOURCES = strptr.c + strptr_OBJECTS = strptr.$(OBJEXT) + strptr_DEPENDENCIES = $(am__DEPENDENCIES_2) ++system_elf_libelf_test_SOURCES = system-elf-libelf-test.c ++system_elf_libelf_test_OBJECTS = \ ++ system_elf_libelf_test-system-elf-libelf-test.$(OBJEXT) ++system_elf_libelf_test_DEPENDENCIES = $(am__DEPENDENCIES_2) + test_elf_cntl_gelf_getshdr_SOURCES = test-elf_cntl_gelf_getshdr.c + test_elf_cntl_gelf_getshdr_OBJECTS = \ + test-elf_cntl_gelf_getshdr.$(OBJEXT) +@@ -578,9 +583,10 @@ + low_high_pc.c md5-sha1-test.c msg_tst.c newdata.c newfile.c \ + newscn.c rdwrmmap.c rerequest_tag.c saridx.c scnnames.c \ + sectiondump.c show-abbrev.c show-die-info.c showptable.c \ +- strptr.c test-elf_cntl_gelf_getshdr.c test-flag-nobits.c \ +- test-nlist.c typeiter.c typeiter2.c update1.c update2.c \ +- update3.c update4.c varlocs.c vdsosyms.c zstrptr.c ++ strptr.c system-elf-libelf-test.c test-elf_cntl_gelf_getshdr.c \ ++ test-flag-nobits.c test-nlist.c typeiter.c typeiter2.c \ ++ update1.c update2.c update3.c update4.c varlocs.c vdsosyms.c \ ++ zstrptr.c + DIST_SOURCES = addrcfi.c addrscopes.c aggregate_size.c alldts.c \ + allfcts.c allregs.c arextract.c arls.c arsymtest.c asm-tst1.c \ + asm-tst2.c asm-tst3.c asm-tst4.c asm-tst5.c asm-tst6.c \ +@@ -599,9 +605,10 @@ + low_high_pc.c md5-sha1-test.c msg_tst.c newdata.c newfile.c \ + newscn.c rdwrmmap.c rerequest_tag.c saridx.c scnnames.c \ + sectiondump.c show-abbrev.c show-die-info.c showptable.c \ +- strptr.c test-elf_cntl_gelf_getshdr.c test-flag-nobits.c \ +- test-nlist.c typeiter.c typeiter2.c update1.c update2.c \ +- update3.c update4.c varlocs.c vdsosyms.c zstrptr.c ++ strptr.c system-elf-libelf-test.c test-elf_cntl_gelf_getshdr.c \ ++ test-flag-nobits.c test-nlist.c typeiter.c typeiter2.c \ ++ update1.c update2.c update3.c update4.c varlocs.c vdsosyms.c \ ++ zstrptr.c + am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ +@@ -1301,6 +1308,11 @@ + elfgetzdata_LDADD = $(libelf) + elfputzdata_LDADD = $(libelf) + zstrptr_LDADD = $(libelf) ++ ++# We want to test the libelf header against the system elf.h header. ++# Don't include any -I CPPFLAGS. ++system_elf_libelf_test_CPPFLAGS = ++system_elf_libelf_test_LDADD = $(libelf) + all: all-am + + .SUFFIXES: +@@ -1635,6 +1647,10 @@ + @rm -f strptr$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(strptr_OBJECTS) $(strptr_LDADD) $(LIBS) + ++system-elf-libelf-test$(EXEEXT): $(system_elf_libelf_test_OBJECTS) $(system_elf_libelf_test_DEPENDENCIES) $(EXTRA_system_elf_libelf_test_DEPENDENCIES) ++ @rm -f system-elf-libelf-test$(EXEEXT) ++ $(AM_V_CCLD)$(LINK) $(system_elf_libelf_test_OBJECTS) $(system_elf_libelf_test_LDADD) $(LIBS) ++ + test-elf_cntl_gelf_getshdr$(EXEEXT): $(test_elf_cntl_gelf_getshdr_OBJECTS) $(test_elf_cntl_gelf_getshdr_DEPENDENCIES) $(EXTRA_test_elf_cntl_gelf_getshdr_DEPENDENCIES) + @rm -f test-elf_cntl_gelf_getshdr$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_elf_cntl_gelf_getshdr_OBJECTS) $(test_elf_cntl_gelf_getshdr_LDADD) $(LIBS) +@@ -1764,6 +1780,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/show-die-info.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/showptable.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strptr.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-elf_cntl_gelf_getshdr.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-flag-nobits.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-nlist.Po@am__quote@ +@@ -1833,6 +1850,20 @@ + @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(deleted_lib_so_CFLAGS) $(CFLAGS) -c -o deleted_lib_so-deleted-lib.obj `if test -f 'deleted-lib.c'; then $(CYGPATH_W) 'deleted-lib.c'; else $(CYGPATH_W) '$(srcdir)/deleted-lib.c'; fi` + ++system_elf_libelf_test-system-elf-libelf-test.o: system-elf-libelf-test.c ++@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(system_elf_libelf_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT system_elf_libelf_test-system-elf-libelf-test.o -MD -MP -MF $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Tpo -c -o system_elf_libelf_test-system-elf-libelf-test.o `test -f 'system-elf-libelf-test.c' || echo '$(srcdir)/'`system-elf-libelf-test.c ++@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Tpo $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Po ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='system-elf-libelf-test.c' object='system_elf_libelf_test-system-elf-libelf-test.o' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(system_elf_libelf_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o system_elf_libelf_test-system-elf-libelf-test.o `test -f 'system-elf-libelf-test.c' || echo '$(srcdir)/'`system-elf-libelf-test.c ++ ++system_elf_libelf_test-system-elf-libelf-test.obj: system-elf-libelf-test.c ++@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(system_elf_libelf_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT system_elf_libelf_test-system-elf-libelf-test.obj -MD -MP -MF $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Tpo -c -o system_elf_libelf_test-system-elf-libelf-test.obj `if test -f 'system-elf-libelf-test.c'; then $(CYGPATH_W) 'system-elf-libelf-test.c'; else $(CYGPATH_W) '$(srcdir)/system-elf-libelf-test.c'; fi` ++@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Tpo $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Po ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='system-elf-libelf-test.c' object='system_elf_libelf_test-system-elf-libelf-test.obj' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(system_elf_libelf_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o system_elf_libelf_test-system-elf-libelf-test.obj `if test -f 'system-elf-libelf-test.c'; then $(CYGPATH_W) 'system-elf-libelf-test.c'; else $(CYGPATH_W) '$(srcdir)/system-elf-libelf-test.c'; fi` ++ + ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique + tags: tags-am +@@ -3047,6 +3078,13 @@ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ ++ "$$tst" $(AM_TESTS_FD_REDIRECT) ++system-elf-libelf-test.log: system-elf-libelf-test$(EXEEXT) ++ @p='system-elf-libelf-test$(EXEEXT)'; \ ++ b='system-elf-libelf-test'; \ ++ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ ++ --log-file $$b.log --trs-file $$b.trs \ ++ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) + run-readelf-s.sh.log: run-readelf-s.sh + @p='run-readelf-s.sh'; \ diff --git a/elfutils.spec b/elfutils.spec index ae5897f..4ce1ad0 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.165 -%global baserelease 1 +%global baserelease 2 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -21,6 +21,9 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches +# Needed for older (pre-2.22) glibc (f22 and earlier) +Patch1: elfutils-0.165-elf-libelf.patch + Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -163,6 +166,7 @@ profiling) of processes. %setup -q # Apply patches +%patch1 -p1 -b .elf_libelf find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -299,6 +303,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Thu Jan 14 2016 Mark Wielaard - 0.165-2 +- Add elfutils-0.165-elf-libelf.patch. + * Mon Jan 11 2016 Mark Wielaard - 0.165-1 - Update to elfutils-0.165 (#1294079, #1236699, #807053) - Add eu-elfcompress From 9e628ca00c00f7e878fcae89d3ce4d232ce41933 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 28 Jan 2016 14:03:55 +0100 Subject: [PATCH 020/216] 0.165-3 - Add elfutils-0.165-reloc.patch. --- elfutils-0.165-reloc.patch | 73 ++++++++++++++++++++++++++++++++++++++ elfutils.spec | 7 +++- 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.165-reloc.patch diff --git a/elfutils-0.165-reloc.patch b/elfutils-0.165-reloc.patch new file mode 100644 index 0000000..53cc0bc --- /dev/null +++ b/elfutils-0.165-reloc.patch @@ -0,0 +1,73 @@ +diff --git a/backends/i386_reloc.def b/backends/i386_reloc.def +index de3575d..a6a03f3 100644 +--- a/backends/i386_reloc.def ++++ b/backends/i386_reloc.def +@@ -68,3 +68,4 @@ RELOC_TYPE (TLS_GOTDESC, REL) + RELOC_TYPE (TLS_DESC_CALL, REL) + RELOC_TYPE (TLS_DESC, EXEC) + RELOC_TYPE (IRELATIVE, EXEC|DYN) ++RELOC_TYPE (GOT32X, REL) +diff --git a/backends/x86_64_reloc.def b/backends/x86_64_reloc.def +index ad84efa..07a7c3d 100644 +--- a/backends/x86_64_reloc.def ++++ b/backends/x86_64_reloc.def +@@ -61,3 +61,5 @@ RELOC_TYPE (GOTPC32_TLSDESC, REL) + RELOC_TYPE (TLSDESC_CALL, REL) + RELOC_TYPE (TLSDESC, REL|EXEC|DYN) + RELOC_TYPE (IRELATIVE, EXEC|DYN) ++RELOC_TYPE (GOTPCRELX, REL) ++RELOC_TYPE (REX_GOTPCRELX, REL) +diff --git a/libelf/elf.h b/libelf/elf.h +index 12feb91..1a7000b 100644 +--- a/libelf/elf.h ++++ b/libelf/elf.h +@@ -1,5 +1,5 @@ + /* This file defines standard ELF types, structures, and macros. +- Copyright (C) 1995-2015 Free Software Foundation, Inc. ++ Copyright (C) 1995-2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -1269,8 +1269,10 @@ typedef struct + argument, returning the TLS + offset for the symbol. */ + #define R_386_IRELATIVE 42 /* Adjust indirectly by program base */ ++#define R_386_GOT32X 43 /* Load from 32 bit GOT entry, ++ relaxable. */ + /* Keep this the last entry. */ +-#define R_386_NUM 43 ++#define R_386_NUM 44 + + /* SUN SPARC specific definitions. */ + +@@ -1727,7 +1729,11 @@ typedef struct + PLT is writable. For a non-writable PLT, this is omitted or has a zero + value. */ + #define DT_MIPS_RWPLT 0x70000034 +-#define DT_MIPS_NUM 0x35 ++/* An alternative description of the classic MIPS RLD_MAP that is usable ++ in a PIE as it stores a relative offset from the address of the tag ++ rather than an absolute address. */ ++#define DT_MIPS_RLD_MAP_REL 0x70000035 ++#define DT_MIPS_NUM 0x36 + + /* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */ + +@@ -3140,8 +3146,15 @@ enum + #define R_X86_64_TLSDESC 36 /* TLS descriptor. */ + #define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */ + #define R_X86_64_RELATIVE64 38 /* 64-bit adjust by program base */ +- +-#define R_X86_64_NUM 39 ++ /* 39 Reserved was R_X86_64_PC32_BND */ ++ /* 40 Reserved was R_X86_64_PLT32_BND */ ++#define R_X86_64_GOTPCRELX 41 /* Load from 32 bit signed pc relative ++ offset to GOT entry without REX ++ prefix, relaxable. */ ++#define R_X86_64_REX_GOTPCRELX 42 /* Load from 32 bit signed pc relative ++ offset to GOT entry with REX prefix, ++ relaxable. */ ++#define R_X86_64_NUM 43 + + + /* AM33 relocations. */ diff --git a/elfutils.spec b/elfutils.spec index 4ce1ad0..4e057db 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.165 -%global baserelease 2 +%global baserelease 3 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -23,6 +23,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Needed for older (pre-2.22) glibc (f22 and earlier) Patch1: elfutils-0.165-elf-libelf.patch +Patch2: elfutils-0.165-reloc.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -167,6 +168,7 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .elf_libelf +%patch2 -p1 -b .reloc find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -303,6 +305,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Thu Jan 28 2016 Mark Wielaard - 0.165-3 +- Add elfutils-0.165-reloc.patch. + * Thu Jan 14 2016 Mark Wielaard - 0.165-2 - Add elfutils-0.165-elf-libelf.patch. From cbe28cdfa0a4194471102ce20b651d5eb899eb18 Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Wed, 3 Feb 2016 19:44:20 +0000 Subject: [PATCH 021/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 4e057db..93b1ee8 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.165 -%global baserelease 3 +%global baserelease 4 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -305,6 +305,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Wed Feb 03 2016 Fedora Release Engineering - 0.165-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + * Thu Jan 28 2016 Mark Wielaard - 0.165-3 - Add elfutils-0.165-reloc.patch. From df9a3ff5d9a0fedd7a977f8118972949c26f534e Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 4 Feb 2016 16:30:39 +0100 Subject: [PATCH 022/216] 0.165-5 - Add elfutils-0.165-nobitsalign-strip.patch. --- elfutils-0.165-nobitsalign-strip.patch | 42 ++++++++++++++++++++++++++ elfutils.spec | 7 ++++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.165-nobitsalign-strip.patch diff --git a/elfutils-0.165-nobitsalign-strip.patch b/elfutils-0.165-nobitsalign-strip.patch new file mode 100644 index 0000000..4833431 --- /dev/null +++ b/elfutils-0.165-nobitsalign-strip.patch @@ -0,0 +1,42 @@ +Upstream proposed patch. +Note that this backport doesn't actually contain the new testcase. +It is just the elf_getdata fix. + +commit edff83d3416a136ce58a21a1244c99805e98f6d8 +Author: Mark Wielaard +Date: Thu Feb 4 09:53:41 2016 +0100 + + libelf: elf_getdata should not adjust alignment for SHT_NOBITS sections. + + In commit c0748e "libelf: More checking of valid sh_addralign values." we + adjusted bogus alignment of data buffers if they were greater than the + offset of the data in the file. This works OK, except when there is no + data in the file. So make sure to not adjust any NOBITS sections. + + Also adds a test that shows the issue and makes sure elflint is called + with --gnu in run-strip-test.sh. + + https://bugzilla.redhat.com/show_bug.cgi?id=1303845 + + Signed-off-by: Mark Wielaard + +diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c +index 4ec94b9..d1fafbf 100644 +--- a/libelf/elf_getdata.c ++++ b/libelf/elf_getdata.c +@@ -1,5 +1,5 @@ + /* Return the next data element from the section after possibly converting it. +- Copyright (C) 1998-2005, 2006, 2007, 2015 Red Hat, Inc. ++ Copyright (C) 1998-2005, 2006, 2007, 2015, 2016 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 1998. + +@@ -363,7 +363,7 @@ __libelf_set_rawdata_wrlock (Elf_Scn *scn) + at least an ehdr this will only trigger for alignment values > 64 + which should be uncommon. */ + align = align ?: 1; +- if (align > offset) ++ if (type != SHT_NOBITS && align > offset) + align = offset; + scn->rawdata.d.d_align = align; + if (elf->class == ELFCLASS32 diff --git a/elfutils.spec b/elfutils.spec index 93b1ee8..0cbeb1c 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.165 -%global baserelease 4 +%global baserelease 5 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -24,6 +24,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Needed for older (pre-2.22) glibc (f22 and earlier) Patch1: elfutils-0.165-elf-libelf.patch Patch2: elfutils-0.165-reloc.patch +Patch3: elfutils-0.165-nobitsalign-strip.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -169,6 +170,7 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .elf_libelf %patch2 -p1 -b .reloc +%patch3 -p1 -b .nobitsalign find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -305,6 +307,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Thu Feb 04 2016 Mark Wielaard - 0.165-5 +- Add elfutils-0.165-nobitsalign-strip.patch. + * Wed Feb 03 2016 Fedora Release Engineering - 0.165-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild From 918ca1492d3b05abbcb18373de2879b7dd89c6c3 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 31 Mar 2016 21:59:30 +0200 Subject: [PATCH 023/216] 0.166-1 - Upgrade to elfutils-0.166 Drop upstreamed patches: - elfutils-0.165-nobitsalign-strip.patch. - elfutils-0.165-reloc.patch. - elfutils-0.165-elf-libelf.patch. --- .gitignore | 1 + elfutils-0.165-elf-libelf.patch | 283 ------------------------- elfutils-0.165-nobitsalign-strip.patch | 42 ---- elfutils-0.165-reloc.patch | 73 ------- elfutils.spec | 19 +- sources | 2 +- 6 files changed, 11 insertions(+), 409 deletions(-) delete mode 100644 elfutils-0.165-elf-libelf.patch delete mode 100644 elfutils-0.165-nobitsalign-strip.patch delete mode 100644 elfutils-0.165-reloc.patch diff --git a/.gitignore b/.gitignore index 432a0fc..a2cbf9a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ /elfutils-0.163.tar.bz2 /elfutils-0.164.tar.bz2 /elfutils-0.165.tar.bz2 +/elfutils-0.166.tar.bz2 diff --git a/elfutils-0.165-elf-libelf.patch b/elfutils-0.165-elf-libelf.patch deleted file mode 100644 index c7405a3..0000000 --- a/elfutils-0.165-elf-libelf.patch +++ /dev/null @@ -1,283 +0,0 @@ -commit 344ca0775da729e1bfdd61bb88ba4c64befece07 -Author: Mark Wielaard -Date: Wed Jan 13 17:16:48 2016 +0100 - - libelf: Add ELF compression types and defines to libelf.h for older glibc. - - Older glibc elf.h might not define the new ELF compression defines and - types. If not just define them in libelf.h directly to make the libelf - headers work on older glibc systems. - - Also include a testcase to check the libelf headers build against the - system elf.h. - - https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=810885 - - Signed-off-by: Mark Wielaard - -diff --git a/libelf/ChangeLog b/libelf/ChangeLog -index 3a1fe91..aabf6f6 100644 ---- a/libelf/ChangeLog -+++ b/libelf/ChangeLog -@@ -1,3 +1,8 @@ -+2016-01-13 Mark Wielaard -+ -+ * libelf.h: Check SHF_COMPRESSED is defined. If not define it and the -+ associated ELF compression types/defines. -+ - 2015-11-26 Mark Wielaard - - * elf_compress.c (__libelf_decompress_elf): New function, extracted -diff --git a/libelf/libelf.h b/libelf/libelf.h -index 364e776..c0d6389 100644 ---- a/libelf/libelf.h -+++ b/libelf/libelf.h -@@ -35,6 +35,34 @@ - /* Get the ELF types. */ - #include - -+#ifndef SHF_COMPRESSED -+ /* Older glibc elf.h might not yet define the ELF compression types. */ -+ #define SHF_COMPRESSED (1 << 11) /* Section with compressed data. */ -+ -+ /* Section compression header. Used when SHF_COMPRESSED is set. */ -+ -+ typedef struct -+ { -+ Elf32_Word ch_type; /* Compression format. */ -+ Elf32_Word ch_size; /* Uncompressed data size. */ -+ Elf32_Word ch_addralign; /* Uncompressed data alignment. */ -+ } Elf32_Chdr; -+ -+ typedef struct -+ { -+ Elf64_Word ch_type; /* Compression format. */ -+ Elf64_Word ch_reserved; -+ Elf64_Xword ch_size; /* Uncompressed data size. */ -+ Elf64_Xword ch_addralign; /* Uncompressed data alignment. */ -+ } Elf64_Chdr; -+ -+ /* Legal values for ch_type (compression algorithm). */ -+ #define ELFCOMPRESS_ZLIB 1 /* ZLIB/DEFLATE algorithm. */ -+ #define ELFCOMPRESS_LOOS 0x60000000 /* Start of OS-specific. */ -+ #define ELFCOMPRESS_HIOS 0x6fffffff /* End of OS-specific. */ -+ #define ELFCOMPRESS_LOPROC 0x70000000 /* Start of processor-specific. */ -+ #define ELFCOMPRESS_HIPROC 0x7fffffff /* End of processor-specific. */ -+#endif - - /* Known translation types. */ - typedef enum -diff --git a/tests/ChangeLog b/tests/ChangeLog -index 366aea9..234ae56 100644 ---- a/tests/ChangeLog -+++ b/tests/ChangeLog -@@ -1,3 +1,11 @@ -+2016-01-13 Mark Wielaard -+ -+ * system-elf-libelf-test.c: New test. -+ * Makefile.am (TESTS): Add system-elf-libelf-test, if !STANDALONE. -+ (check_PROGRAMS): Likewise. -+ (system_elf_libelf_test_CPPFLAGS): New variable. -+ (system_elf_libelf_test_LDADD): Likewise. -+ - 2016-01-08 Mark Wielaard - - * elfputzdata.c (main): Fix parentheses in strncmp test. -diff --git a/tests/Makefile.am b/tests/Makefile.am -index d09a6d7..7b9e108 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -136,8 +136,8 @@ export ELFUTILS_DISABLE_DEMANGLE = 1 - endif - - if !STANDALONE --check_PROGRAMS += msg_tst md5-sha1-test --TESTS += msg_tst md5-sha1-test -+check_PROGRAMS += msg_tst md5-sha1-test system-elf-libelf-test -+TESTS += msg_tst md5-sha1-test system-elf-libelf-test - endif - - if LZMA -@@ -473,6 +473,11 @@ elfgetzdata_LDADD = $(libelf) - elfputzdata_LDADD = $(libelf) - zstrptr_LDADD = $(libelf) - -+# We want to test the libelf header against the system elf.h header. -+# Don't include any -I CPPFLAGS. -+system_elf_libelf_test_CPPFLAGS = -+system_elf_libelf_test_LDADD = $(libelf) -+ - if GCOV - check: check-am coverage - .PHONY: coverage -diff --git a/tests/system-elf-libelf-test.c b/tests/system-elf-libelf-test.c -new file mode 100644 -index 0000000..7dfe498 ---- /dev/null -+++ b/tests/system-elf-libelf-test.c -@@ -0,0 +1,35 @@ -+/* Explicit test compiling with system elf.h header plus libelf header. -+ -+ Copyright (C) 2016 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 "../libelf/libelf.h" -+ -+int -+main (void) -+{ -+ /* Trivial test, this is really a compile test anyway. */ -+ if (elf_version (EV_CURRENT) == EV_NONE) -+ return -1; -+ -+ /* This will obviously fail. It is just to check that Elf32_Chdr and -+ elf32_getchdr are available (both at compile time and runtime). */ -+ Elf32_Chdr *chdr = elf32_getchdr (NULL); -+ -+ return chdr == NULL ? 0 : -1; -+} - -diff -ru elfutils-0.165.orig/tests/Makefile.in elfutils-0.165/tests/Makefile.in ---- elfutils-0.165.orig/tests/Makefile.in 2016-01-14 14:37:27.557995293 +0100 -+++ elfutils-0.165/tests/Makefile.in 2016-01-14 14:37:39.621953358 +0100 -@@ -186,8 +186,8 @@ - run-elfputzdata.sh run-zstrptr.sh run-compress-test.sh \ - run-readelf-zdebug.sh run-readelf-zdebug-rel.sh \ - $(am__EXEEXT_2) $(am__append_8) $(am__EXEEXT_4) --@STANDALONE_FALSE@am__append_6 = msg_tst md5-sha1-test --@STANDALONE_FALSE@am__append_7 = msg_tst md5-sha1-test -+@STANDALONE_FALSE@am__append_6 = msg_tst md5-sha1-test system-elf-libelf-test -+@STANDALONE_FALSE@am__append_7 = msg_tst md5-sha1-test system-elf-libelf-test - @LZMA_TRUE@am__append_8 = run-readelf-s.sh run-dwflsyms.sh - @HAVE_LIBASM_TRUE@am__append_9 = $(asm_TESTS) - @HAVE_LIBASM_TRUE@am__append_10 = $(asm_TESTS) -@@ -206,7 +206,8 @@ - CONFIG_CLEAN_VPATH_FILES = - @BIARCH_TRUE@am__EXEEXT_1 = backtrace-child-biarch$(EXEEXT) - @STANDALONE_FALSE@am__EXEEXT_2 = msg_tst$(EXEEXT) \ --@STANDALONE_FALSE@ md5-sha1-test$(EXEEXT) -+@STANDALONE_FALSE@ md5-sha1-test$(EXEEXT) \ -+@STANDALONE_FALSE@ system-elf-libelf-test$(EXEEXT) - am__EXEEXT_3 = asm-tst1$(EXEEXT) asm-tst2$(EXEEXT) asm-tst3$(EXEEXT) \ - asm-tst4$(EXEEXT) asm-tst5$(EXEEXT) asm-tst6$(EXEEXT) \ - asm-tst7$(EXEEXT) asm-tst8$(EXEEXT) asm-tst9$(EXEEXT) -@@ -490,6 +491,10 @@ - strptr_SOURCES = strptr.c - strptr_OBJECTS = strptr.$(OBJEXT) - strptr_DEPENDENCIES = $(am__DEPENDENCIES_2) -+system_elf_libelf_test_SOURCES = system-elf-libelf-test.c -+system_elf_libelf_test_OBJECTS = \ -+ system_elf_libelf_test-system-elf-libelf-test.$(OBJEXT) -+system_elf_libelf_test_DEPENDENCIES = $(am__DEPENDENCIES_2) - test_elf_cntl_gelf_getshdr_SOURCES = test-elf_cntl_gelf_getshdr.c - test_elf_cntl_gelf_getshdr_OBJECTS = \ - test-elf_cntl_gelf_getshdr.$(OBJEXT) -@@ -578,9 +583,10 @@ - low_high_pc.c md5-sha1-test.c msg_tst.c newdata.c newfile.c \ - newscn.c rdwrmmap.c rerequest_tag.c saridx.c scnnames.c \ - sectiondump.c show-abbrev.c show-die-info.c showptable.c \ -- strptr.c test-elf_cntl_gelf_getshdr.c test-flag-nobits.c \ -- test-nlist.c typeiter.c typeiter2.c update1.c update2.c \ -- update3.c update4.c varlocs.c vdsosyms.c zstrptr.c -+ strptr.c system-elf-libelf-test.c test-elf_cntl_gelf_getshdr.c \ -+ test-flag-nobits.c test-nlist.c typeiter.c typeiter2.c \ -+ update1.c update2.c update3.c update4.c varlocs.c vdsosyms.c \ -+ zstrptr.c - DIST_SOURCES = addrcfi.c addrscopes.c aggregate_size.c alldts.c \ - allfcts.c allregs.c arextract.c arls.c arsymtest.c asm-tst1.c \ - asm-tst2.c asm-tst3.c asm-tst4.c asm-tst5.c asm-tst6.c \ -@@ -599,9 +605,10 @@ - low_high_pc.c md5-sha1-test.c msg_tst.c newdata.c newfile.c \ - newscn.c rdwrmmap.c rerequest_tag.c saridx.c scnnames.c \ - sectiondump.c show-abbrev.c show-die-info.c showptable.c \ -- strptr.c test-elf_cntl_gelf_getshdr.c test-flag-nobits.c \ -- test-nlist.c typeiter.c typeiter2.c update1.c update2.c \ -- update3.c update4.c varlocs.c vdsosyms.c zstrptr.c -+ strptr.c system-elf-libelf-test.c test-elf_cntl_gelf_getshdr.c \ -+ test-flag-nobits.c test-nlist.c typeiter.c typeiter2.c \ -+ update1.c update2.c update3.c update4.c varlocs.c vdsosyms.c \ -+ zstrptr.c - am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ -@@ -1301,6 +1308,11 @@ - elfgetzdata_LDADD = $(libelf) - elfputzdata_LDADD = $(libelf) - zstrptr_LDADD = $(libelf) -+ -+# We want to test the libelf header against the system elf.h header. -+# Don't include any -I CPPFLAGS. -+system_elf_libelf_test_CPPFLAGS = -+system_elf_libelf_test_LDADD = $(libelf) - all: all-am - - .SUFFIXES: -@@ -1635,6 +1647,10 @@ - @rm -f strptr$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(strptr_OBJECTS) $(strptr_LDADD) $(LIBS) - -+system-elf-libelf-test$(EXEEXT): $(system_elf_libelf_test_OBJECTS) $(system_elf_libelf_test_DEPENDENCIES) $(EXTRA_system_elf_libelf_test_DEPENDENCIES) -+ @rm -f system-elf-libelf-test$(EXEEXT) -+ $(AM_V_CCLD)$(LINK) $(system_elf_libelf_test_OBJECTS) $(system_elf_libelf_test_LDADD) $(LIBS) -+ - test-elf_cntl_gelf_getshdr$(EXEEXT): $(test_elf_cntl_gelf_getshdr_OBJECTS) $(test_elf_cntl_gelf_getshdr_DEPENDENCIES) $(EXTRA_test_elf_cntl_gelf_getshdr_DEPENDENCIES) - @rm -f test-elf_cntl_gelf_getshdr$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(test_elf_cntl_gelf_getshdr_OBJECTS) $(test_elf_cntl_gelf_getshdr_LDADD) $(LIBS) -@@ -1764,6 +1780,7 @@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/show-die-info.Po@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/showptable.Po@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strptr.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Po@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-elf_cntl_gelf_getshdr.Po@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-flag-nobits.Po@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-nlist.Po@am__quote@ -@@ -1833,6 +1850,20 @@ - @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(deleted_lib_so_CFLAGS) $(CFLAGS) -c -o deleted_lib_so-deleted-lib.obj `if test -f 'deleted-lib.c'; then $(CYGPATH_W) 'deleted-lib.c'; else $(CYGPATH_W) '$(srcdir)/deleted-lib.c'; fi` - -+system_elf_libelf_test-system-elf-libelf-test.o: system-elf-libelf-test.c -+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(system_elf_libelf_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT system_elf_libelf_test-system-elf-libelf-test.o -MD -MP -MF $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Tpo -c -o system_elf_libelf_test-system-elf-libelf-test.o `test -f 'system-elf-libelf-test.c' || echo '$(srcdir)/'`system-elf-libelf-test.c -+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Tpo $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Po -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='system-elf-libelf-test.c' object='system_elf_libelf_test-system-elf-libelf-test.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(system_elf_libelf_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o system_elf_libelf_test-system-elf-libelf-test.o `test -f 'system-elf-libelf-test.c' || echo '$(srcdir)/'`system-elf-libelf-test.c -+ -+system_elf_libelf_test-system-elf-libelf-test.obj: system-elf-libelf-test.c -+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(system_elf_libelf_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT system_elf_libelf_test-system-elf-libelf-test.obj -MD -MP -MF $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Tpo -c -o system_elf_libelf_test-system-elf-libelf-test.obj `if test -f 'system-elf-libelf-test.c'; then $(CYGPATH_W) 'system-elf-libelf-test.c'; else $(CYGPATH_W) '$(srcdir)/system-elf-libelf-test.c'; fi` -+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Tpo $(DEPDIR)/system_elf_libelf_test-system-elf-libelf-test.Po -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='system-elf-libelf-test.c' object='system_elf_libelf_test-system-elf-libelf-test.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(system_elf_libelf_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o system_elf_libelf_test-system-elf-libelf-test.obj `if test -f 'system-elf-libelf-test.c'; then $(CYGPATH_W) 'system-elf-libelf-test.c'; else $(CYGPATH_W) '$(srcdir)/system-elf-libelf-test.c'; fi` -+ - ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique - tags: tags-am -@@ -3047,6 +3078,13 @@ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ -+ "$$tst" $(AM_TESTS_FD_REDIRECT) -+system-elf-libelf-test.log: system-elf-libelf-test$(EXEEXT) -+ @p='system-elf-libelf-test$(EXEEXT)'; \ -+ b='system-elf-libelf-test'; \ -+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ -+ --log-file $$b.log --trs-file $$b.trs \ -+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) - run-readelf-s.sh.log: run-readelf-s.sh - @p='run-readelf-s.sh'; \ diff --git a/elfutils-0.165-nobitsalign-strip.patch b/elfutils-0.165-nobitsalign-strip.patch deleted file mode 100644 index 4833431..0000000 --- a/elfutils-0.165-nobitsalign-strip.patch +++ /dev/null @@ -1,42 +0,0 @@ -Upstream proposed patch. -Note that this backport doesn't actually contain the new testcase. -It is just the elf_getdata fix. - -commit edff83d3416a136ce58a21a1244c99805e98f6d8 -Author: Mark Wielaard -Date: Thu Feb 4 09:53:41 2016 +0100 - - libelf: elf_getdata should not adjust alignment for SHT_NOBITS sections. - - In commit c0748e "libelf: More checking of valid sh_addralign values." we - adjusted bogus alignment of data buffers if they were greater than the - offset of the data in the file. This works OK, except when there is no - data in the file. So make sure to not adjust any NOBITS sections. - - Also adds a test that shows the issue and makes sure elflint is called - with --gnu in run-strip-test.sh. - - https://bugzilla.redhat.com/show_bug.cgi?id=1303845 - - Signed-off-by: Mark Wielaard - -diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c -index 4ec94b9..d1fafbf 100644 ---- a/libelf/elf_getdata.c -+++ b/libelf/elf_getdata.c -@@ -1,5 +1,5 @@ - /* Return the next data element from the section after possibly converting it. -- Copyright (C) 1998-2005, 2006, 2007, 2015 Red Hat, Inc. -+ Copyright (C) 1998-2005, 2006, 2007, 2015, 2016 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 1998. - -@@ -363,7 +363,7 @@ __libelf_set_rawdata_wrlock (Elf_Scn *scn) - at least an ehdr this will only trigger for alignment values > 64 - which should be uncommon. */ - align = align ?: 1; -- if (align > offset) -+ if (type != SHT_NOBITS && align > offset) - align = offset; - scn->rawdata.d.d_align = align; - if (elf->class == ELFCLASS32 diff --git a/elfutils-0.165-reloc.patch b/elfutils-0.165-reloc.patch deleted file mode 100644 index 53cc0bc..0000000 --- a/elfutils-0.165-reloc.patch +++ /dev/null @@ -1,73 +0,0 @@ -diff --git a/backends/i386_reloc.def b/backends/i386_reloc.def -index de3575d..a6a03f3 100644 ---- a/backends/i386_reloc.def -+++ b/backends/i386_reloc.def -@@ -68,3 +68,4 @@ RELOC_TYPE (TLS_GOTDESC, REL) - RELOC_TYPE (TLS_DESC_CALL, REL) - RELOC_TYPE (TLS_DESC, EXEC) - RELOC_TYPE (IRELATIVE, EXEC|DYN) -+RELOC_TYPE (GOT32X, REL) -diff --git a/backends/x86_64_reloc.def b/backends/x86_64_reloc.def -index ad84efa..07a7c3d 100644 ---- a/backends/x86_64_reloc.def -+++ b/backends/x86_64_reloc.def -@@ -61,3 +61,5 @@ RELOC_TYPE (GOTPC32_TLSDESC, REL) - RELOC_TYPE (TLSDESC_CALL, REL) - RELOC_TYPE (TLSDESC, REL|EXEC|DYN) - RELOC_TYPE (IRELATIVE, EXEC|DYN) -+RELOC_TYPE (GOTPCRELX, REL) -+RELOC_TYPE (REX_GOTPCRELX, REL) -diff --git a/libelf/elf.h b/libelf/elf.h -index 12feb91..1a7000b 100644 ---- a/libelf/elf.h -+++ b/libelf/elf.h -@@ -1,5 +1,5 @@ - /* This file defines standard ELF types, structures, and macros. -- Copyright (C) 1995-2015 Free Software Foundation, Inc. -+ Copyright (C) 1995-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or -@@ -1269,8 +1269,10 @@ typedef struct - argument, returning the TLS - offset for the symbol. */ - #define R_386_IRELATIVE 42 /* Adjust indirectly by program base */ -+#define R_386_GOT32X 43 /* Load from 32 bit GOT entry, -+ relaxable. */ - /* Keep this the last entry. */ --#define R_386_NUM 43 -+#define R_386_NUM 44 - - /* SUN SPARC specific definitions. */ - -@@ -1727,7 +1729,11 @@ typedef struct - PLT is writable. For a non-writable PLT, this is omitted or has a zero - value. */ - #define DT_MIPS_RWPLT 0x70000034 --#define DT_MIPS_NUM 0x35 -+/* An alternative description of the classic MIPS RLD_MAP that is usable -+ in a PIE as it stores a relative offset from the address of the tag -+ rather than an absolute address. */ -+#define DT_MIPS_RLD_MAP_REL 0x70000035 -+#define DT_MIPS_NUM 0x36 - - /* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */ - -@@ -3140,8 +3146,15 @@ enum - #define R_X86_64_TLSDESC 36 /* TLS descriptor. */ - #define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */ - #define R_X86_64_RELATIVE64 38 /* 64-bit adjust by program base */ -- --#define R_X86_64_NUM 39 -+ /* 39 Reserved was R_X86_64_PC32_BND */ -+ /* 40 Reserved was R_X86_64_PLT32_BND */ -+#define R_X86_64_GOTPCRELX 41 /* Load from 32 bit signed pc relative -+ offset to GOT entry without REX -+ prefix, relaxable. */ -+#define R_X86_64_REX_GOTPCRELX 42 /* Load from 32 bit signed pc relative -+ offset to GOT entry with REX prefix, -+ relaxable. */ -+#define R_X86_64_NUM 43 - - - /* AM33 relocations. */ diff --git a/elfutils.spec b/elfutils.spec index 0cbeb1c..33e5f85 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects -Version: 0.165 -%global baserelease 5 +Version: 0.166 +%global baserelease 1 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -21,11 +21,6 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -# Needed for older (pre-2.22) glibc (f22 and earlier) -Patch1: elfutils-0.165-elf-libelf.patch -Patch2: elfutils-0.165-reloc.patch -Patch3: elfutils-0.165-nobitsalign-strip.patch - Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -168,9 +163,6 @@ profiling) of processes. %setup -q # Apply patches -%patch1 -p1 -b .elf_libelf -%patch2 -p1 -b .reloc -%patch3 -p1 -b .nobitsalign find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -307,6 +299,13 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Thu Mar 31 2016 Mark Wielaard - 0.166-1 +- Upgrade to elfutils-0.166 + Drop upstreamed patches: + - elfutils-0.165-nobitsalign-strip.patch. + - elfutils-0.165-reloc.patch. + - elfutils-0.165-elf-libelf.patch. + * Thu Feb 04 2016 Mark Wielaard - 0.165-5 - Add elfutils-0.165-nobitsalign-strip.patch. diff --git a/sources b/sources index 9227df6..12f5a82 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -c37fdbe18e848002b451562cba964679 elfutils-0.165.tar.bz2 +d4e462b7891915dc5326bccefa2024ff elfutils-0.166.tar.bz2 From f8dc59bc6fd2013cbe701707b1c0997ab92ce196 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 14 Apr 2016 11:22:40 +0200 Subject: [PATCH 024/216] 0.166-2 - Add elfutils-0.166-elfcmp-comp-gcc6.patch --- elfutils-0.166-elfcmp-comp-gcc6.patch | 50 +++++++++++++++++++++++++++ elfutils.spec | 7 +++- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.166-elfcmp-comp-gcc6.patch diff --git a/elfutils-0.166-elfcmp-comp-gcc6.patch b/elfutils-0.166-elfcmp-comp-gcc6.patch new file mode 100644 index 0000000..2183b35 --- /dev/null +++ b/elfutils-0.166-elfcmp-comp-gcc6.patch @@ -0,0 +1,50 @@ +From 836a16fe5b5bab4a3afe2c991c104652775ce3a3 Mon Sep 17 00:00:00 2001 +From: David Abdurachmanov +Date: Mon, 11 Apr 2016 16:00:57 +0200 +Subject: [PATCH] elfcmp: fix self-comparison error with GCC 6 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Noticed with Fedora 24 Alpha, gcc (GCC) 6.0.0 20160406 +(Red Hat 6.0.0-0.20). + +elfcmp.c: In function ‘main’: +elfcmp.c:364:199: error: self-comparison always evaluates +to false [-Werror=tautological-compare] + if (unlikely (name1 == NULL || name2 == NULL + +Signed-off-by: David Abdurachmanov +--- + src/ChangeLog | 4 ++++ + src/elfcmp.c | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/src/ChangeLog b/src/ChangeLog +index f74b5dc..bdc9d13 100644 +--- a/src/ChangeLog ++++ b/src/ChangeLog +@@ -1,3 +1,7 @@ ++2016-04-11 David Abdurachmanov ++ ++ * elfcmp.c (main): Fix self-comparison error with GCC 6. ++ + 2016-03-21 Mark Wielaard + + * nm.c (show_symbols): Check for malloc size argument overflow. +diff --git a/src/elfcmp.c b/src/elfcmp.c +index 852b92f..7b5d39c 100644 +--- a/src/elfcmp.c ++++ b/src/elfcmp.c +@@ -368,7 +368,7 @@ main (int argc, char *argv[]) + && sym1->st_shndx != SHN_UNDEF) + || sym1->st_info != sym2->st_info + || sym1->st_other != sym2->st_other +- || sym1->st_shndx != sym1->st_shndx)) ++ || sym1->st_shndx != sym2->st_shndx)) + { + // XXX Do we want to allow reordered symbol tables? + symtab_mismatch: +-- +1.8.3.1 + diff --git a/elfutils.spec b/elfutils.spec index 33e5f85..220dc38 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.166 -%global baserelease 1 +%global baserelease 2 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,6 +20,7 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches +Patch1: elfutils-0.166-elfcmp-comp-gcc6.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -163,6 +164,7 @@ profiling) of processes. %setup -q # Apply patches +%patch1 -p1 -b .elfcmp_gcc6 find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -299,6 +301,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Thu Apr 14 2016 Mark Wielaard - 0.166-2 +- Add elfutils-0.166-elfcmp-comp-gcc6.patch + * Thu Mar 31 2016 Mark Wielaard - 0.166-1 - Upgrade to elfutils-0.166 Drop upstreamed patches: From cda9a70a34dc392bd6b9be2773438099cc1cf0ae Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 26 Aug 2016 16:24:56 +0200 Subject: [PATCH 025/216] Update to 0.167. Resolves: #1365812 eu-stack killed by SIGABRT processing gcore created core file. Resolves: #1352232 libelf: Can't add Program Header when e_type is set to OS/Proc specific. --- .gitignore | 1 + elfutils.spec | 17 +++++++---------- sources | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index a2cbf9a..6a39ce8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /elfutils-0.164.tar.bz2 /elfutils-0.165.tar.bz2 /elfutils-0.166.tar.bz2 +/elfutils-0.167.tar.bz2 diff --git a/elfutils.spec b/elfutils.spec index 220dc38..77b1cc0 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects -Version: 0.166 -%global baserelease 2 +Version: 0.167 +%global baserelease 1 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,7 +20,6 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -Patch1: elfutils-0.166-elfcmp-comp-gcc6.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -164,7 +163,6 @@ profiling) of processes. %setup -q # Apply patches -%patch1 -p1 -b .elfcmp_gcc6 find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -189,11 +187,6 @@ make -s install DESTDIR=${RPM_BUILD_ROOT} chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib*.so* chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/elfutils/lib*.so* -# XXX Nuke unpackaged files -(cd ${RPM_BUILD_ROOT} - rm -f .%{_bindir}/eu-ld -) - %find_lang %{name} %if %{provide_yama_scope} @@ -237,7 +230,6 @@ rm -rf ${RPM_BUILD_ROOT} %{_bindir}/eu-stack %{_bindir}/eu-strings %{_bindir}/eu-strip -#%%{_bindir}/eu-ld %{_bindir}/eu-unstrip %{_bindir}/eu-make-debug-archive %{_bindir}/eu-elfcompress @@ -301,6 +293,11 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Fri Aug 26 2016 Mark Wielaard - 0.167-1 +- Upgrade to elfutils-0.167 + Drop upstream elfutils-0.166-elfcmp-comp-gcc6.patch + Fixes: #1365812, #1352232. + * Thu Apr 14 2016 Mark Wielaard - 0.166-2 - Add elfutils-0.166-elfcmp-comp-gcc6.patch diff --git a/sources b/sources index 12f5a82..2ad862a 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -d4e462b7891915dc5326bccefa2024ff elfutils-0.166.tar.bz2 +efc6c2067dfad5646777e93e85222e8f elfutils-0.167.tar.bz2 From d3c2ef0ac88967069dfd1bc99f79417a8b17236e Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 7 Oct 2016 17:53:24 +0200 Subject: [PATCH 026/216] 0.167-2 - Add elfutils-0.167-strip-alloc-symbol.patch Resolves: #1380961 eu-strip on rust libraries breaks dynamic symbols --- elfutils-0.167-strip-alloc-symbol.patch | 92 +++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.167-strip-alloc-symbol.patch diff --git a/elfutils-0.167-strip-alloc-symbol.patch b/elfutils-0.167-strip-alloc-symbol.patch new file mode 100644 index 0000000..50c8c8a --- /dev/null +++ b/elfutils-0.167-strip-alloc-symbol.patch @@ -0,0 +1,92 @@ +commit 7bf4b63a4980788e6c1969cae02f0483e79c069f +Author: Mark Wielaard +Date: Thu Oct 6 16:06:32 2016 +0200 + + strip: Don't remove real symbols from allocated symbol tables. + + Having a symbol in an allocated symbol table (like .dynsym) that + points to an unallocated section is wrong. Traditionally strip + has removed such symbols if they are section or group symbols. + But removing a real symbol from an allocate symbol table is hard + and probably a mistake. Really removing it means rewriting the + dynamic segment and hash sections. Since we don't do that, don't + remove the symbol (and corrupt the ELF file). Do warn and set + the symbol section to SHN_UNDEF. + + https://bugzilla.redhat.com/show_bug.cgi?id=1380961 + + Signed-off-by: Mark Wielaard + +diff --git a/src/ChangeLog b/src/ChangeLog +index e5b3b20..70d11f2 100644 +--- a/src/ChangeLog ++++ b/src/ChangeLog +@@ -1,3 +1,8 @@ ++2016-10-06 Mark Wielaard ++ ++ * strip.c (handle_elf): Don't remove real symbols from allocated ++ symbol tables. ++ + 2016-08-25 Mark Wielaard + + * strip.c (handle_elf): Recompress with ELF_CHF_FORCE. +diff --git a/src/strip.c b/src/strip.c +index da093e9..819b67e 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -1341,15 +1341,12 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + + /* Get the full section index, if necessary from the + XINDEX table. */ +- if (sym->st_shndx != SHN_XINDEX) +- sec = shdr_info[sym->st_shndx].idx; +- else +- { +- elf_assert (shndxdata != NULL +- && shndxdata->d_buf != NULL); +- +- sec = shdr_info[xshndx].idx; +- } ++ if (sym->st_shndx == SHN_XINDEX) ++ elf_assert (shndxdata != NULL ++ && shndxdata->d_buf != NULL); ++ size_t sidx = (sym->st_shndx != SHN_XINDEX ++ ? sym->st_shndx : xshndx); ++ sec = shdr_info[sidx].idx; + + if (sec != 0) + { +@@ -1387,6 +1384,24 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + shdr_info[cnt].shdr.sh_info = destidx - 1; + } + } ++ else if ((shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) != 0 ++ && GELF_ST_TYPE (sym->st_info) != STT_SECTION ++ && shdr_info[sidx].shdr.sh_type != SHT_GROUP) ++ { ++ /* Removing a real symbol from an allocated ++ symbol table is hard and probably a ++ mistake. Really removing it means ++ rewriting the dynamic segment and hash ++ sections. Just warn and set the symbol ++ section to UNDEF. */ ++ error (0, 0, ++ gettext ("Cannot remove symbol [%zd] from allocated symbol table [%zd]"), inner, cnt); ++ sym->st_shndx = SHN_UNDEF; ++ if (gelf_update_sym (shdr_info[cnt].data, destidx, ++ sym) == 0) ++ INTERNAL_ERROR (fname); ++ shdr_info[cnt].newsymidx[inner] = destidx++; ++ } + else if (debug_fname != NULL + && shdr_info[cnt].debug_data == NULL) + /* The symbol points to a section that is discarded +@@ -1394,8 +1409,6 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + this is a section or group signature symbol + for a section which has been removed. */ + { +- size_t sidx = (sym->st_shndx != SHN_XINDEX +- ? sym->st_shndx : xshndx); + elf_assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION + || ((shdr_info[sidx].shdr.sh_type + == SHT_GROUP) diff --git a/elfutils.spec b/elfutils.spec index 77b1cc0..f015438 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle compiled objects Version: 0.167 -%global baserelease 1 +%global baserelease 2 URL: https://fedorahosted.org/elfutils/ %global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,6 +20,7 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches +Patch1: elfutils-0.167-strip-alloc-symbol.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -163,6 +164,7 @@ profiling) of processes. %setup -q # Apply patches +%patch1 -p1 -b .strip_alloc_sym find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -293,6 +295,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Fri Oct 7 2016 Mark Wielaard - 0.167-2 +- Add elfutils-0.167-strip-alloc-symbol.patch (#1380961) + * Fri Aug 26 2016 Mark Wielaard - 0.167-1 - Upgrade to elfutils-0.167 Drop upstream elfutils-0.166-elfcmp-comp-gcc6.patch From af747cd6830f9f9a6d1515af50ef1a21fc75de59 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 28 Dec 2016 18:15:48 +0100 Subject: [PATCH 027/216] 0.168-1 - New upstream release from https://sourceware.org/elfutils/ --- .gitignore | 1 + elfutils-0.166-elfcmp-comp-gcc6.patch | 50 -------------- elfutils-0.167-strip-alloc-symbol.patch | 92 ------------------------- elfutils.spec | 19 +++-- sources | 2 +- 5 files changed, 14 insertions(+), 150 deletions(-) delete mode 100644 elfutils-0.166-elfcmp-comp-gcc6.patch delete mode 100644 elfutils-0.167-strip-alloc-symbol.patch diff --git a/.gitignore b/.gitignore index 6a39ce8..35486d3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ /elfutils-0.165.tar.bz2 /elfutils-0.166.tar.bz2 /elfutils-0.167.tar.bz2 +/elfutils-0.168.tar.bz2 diff --git a/elfutils-0.166-elfcmp-comp-gcc6.patch b/elfutils-0.166-elfcmp-comp-gcc6.patch deleted file mode 100644 index 2183b35..0000000 --- a/elfutils-0.166-elfcmp-comp-gcc6.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 836a16fe5b5bab4a3afe2c991c104652775ce3a3 Mon Sep 17 00:00:00 2001 -From: David Abdurachmanov -Date: Mon, 11 Apr 2016 16:00:57 +0200 -Subject: [PATCH] elfcmp: fix self-comparison error with GCC 6 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Noticed with Fedora 24 Alpha, gcc (GCC) 6.0.0 20160406 -(Red Hat 6.0.0-0.20). - -elfcmp.c: In function ‘main’: -elfcmp.c:364:199: error: self-comparison always evaluates -to false [-Werror=tautological-compare] - if (unlikely (name1 == NULL || name2 == NULL - -Signed-off-by: David Abdurachmanov ---- - src/ChangeLog | 4 ++++ - src/elfcmp.c | 2 +- - 2 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/src/ChangeLog b/src/ChangeLog -index f74b5dc..bdc9d13 100644 ---- a/src/ChangeLog -+++ b/src/ChangeLog -@@ -1,3 +1,7 @@ -+2016-04-11 David Abdurachmanov -+ -+ * elfcmp.c (main): Fix self-comparison error with GCC 6. -+ - 2016-03-21 Mark Wielaard - - * nm.c (show_symbols): Check for malloc size argument overflow. -diff --git a/src/elfcmp.c b/src/elfcmp.c -index 852b92f..7b5d39c 100644 ---- a/src/elfcmp.c -+++ b/src/elfcmp.c -@@ -368,7 +368,7 @@ main (int argc, char *argv[]) - && sym1->st_shndx != SHN_UNDEF) - || sym1->st_info != sym2->st_info - || sym1->st_other != sym2->st_other -- || sym1->st_shndx != sym1->st_shndx)) -+ || sym1->st_shndx != sym2->st_shndx)) - { - // XXX Do we want to allow reordered symbol tables? - symtab_mismatch: --- -1.8.3.1 - diff --git a/elfutils-0.167-strip-alloc-symbol.patch b/elfutils-0.167-strip-alloc-symbol.patch deleted file mode 100644 index 50c8c8a..0000000 --- a/elfutils-0.167-strip-alloc-symbol.patch +++ /dev/null @@ -1,92 +0,0 @@ -commit 7bf4b63a4980788e6c1969cae02f0483e79c069f -Author: Mark Wielaard -Date: Thu Oct 6 16:06:32 2016 +0200 - - strip: Don't remove real symbols from allocated symbol tables. - - Having a symbol in an allocated symbol table (like .dynsym) that - points to an unallocated section is wrong. Traditionally strip - has removed such symbols if they are section or group symbols. - But removing a real symbol from an allocate symbol table is hard - and probably a mistake. Really removing it means rewriting the - dynamic segment and hash sections. Since we don't do that, don't - remove the symbol (and corrupt the ELF file). Do warn and set - the symbol section to SHN_UNDEF. - - https://bugzilla.redhat.com/show_bug.cgi?id=1380961 - - Signed-off-by: Mark Wielaard - -diff --git a/src/ChangeLog b/src/ChangeLog -index e5b3b20..70d11f2 100644 ---- a/src/ChangeLog -+++ b/src/ChangeLog -@@ -1,3 +1,8 @@ -+2016-10-06 Mark Wielaard -+ -+ * strip.c (handle_elf): Don't remove real symbols from allocated -+ symbol tables. -+ - 2016-08-25 Mark Wielaard - - * strip.c (handle_elf): Recompress with ELF_CHF_FORCE. -diff --git a/src/strip.c b/src/strip.c -index da093e9..819b67e 100644 ---- a/src/strip.c -+++ b/src/strip.c -@@ -1341,15 +1341,12 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - - /* Get the full section index, if necessary from the - XINDEX table. */ -- if (sym->st_shndx != SHN_XINDEX) -- sec = shdr_info[sym->st_shndx].idx; -- else -- { -- elf_assert (shndxdata != NULL -- && shndxdata->d_buf != NULL); -- -- sec = shdr_info[xshndx].idx; -- } -+ if (sym->st_shndx == SHN_XINDEX) -+ elf_assert (shndxdata != NULL -+ && shndxdata->d_buf != NULL); -+ size_t sidx = (sym->st_shndx != SHN_XINDEX -+ ? sym->st_shndx : xshndx); -+ sec = shdr_info[sidx].idx; - - if (sec != 0) - { -@@ -1387,6 +1384,24 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - shdr_info[cnt].shdr.sh_info = destidx - 1; - } - } -+ else if ((shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) != 0 -+ && GELF_ST_TYPE (sym->st_info) != STT_SECTION -+ && shdr_info[sidx].shdr.sh_type != SHT_GROUP) -+ { -+ /* Removing a real symbol from an allocated -+ symbol table is hard and probably a -+ mistake. Really removing it means -+ rewriting the dynamic segment and hash -+ sections. Just warn and set the symbol -+ section to UNDEF. */ -+ error (0, 0, -+ gettext ("Cannot remove symbol [%zd] from allocated symbol table [%zd]"), inner, cnt); -+ sym->st_shndx = SHN_UNDEF; -+ if (gelf_update_sym (shdr_info[cnt].data, destidx, -+ sym) == 0) -+ INTERNAL_ERROR (fname); -+ shdr_info[cnt].newsymidx[inner] = destidx++; -+ } - else if (debug_fname != NULL - && shdr_info[cnt].debug_data == NULL) - /* The symbol points to a section that is discarded -@@ -1394,8 +1409,6 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - this is a section or group signature symbol - for a section which has been removed. */ - { -- size_t sidx = (sym->st_shndx != SHN_XINDEX -- ? sym->st_shndx : xshndx); - elf_assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION - || ((shdr_info[sidx].shdr.sh_type - == SHT_GROUP) diff --git a/elfutils.spec b/elfutils.spec index f015438..51495b4 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,9 +1,9 @@ Name: elfutils -Summary: A collection of utilities and DSOs to handle compiled objects -Version: 0.167 -%global baserelease 2 -URL: https://fedorahosted.org/elfutils/ -%global source_url http://fedorahosted.org/releases/e/l/elfutils/%{version}/ +Summary: A collection of utilities and DSOs to handle ELF files and DWARF data +Version: 0.168 +%global baserelease 1 +URL: http://elfutils.org/ +%global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) Group: Development/Tools @@ -20,7 +20,6 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -Patch1: elfutils-0.167-strip-alloc-symbol.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -164,7 +163,6 @@ profiling) of processes. %setup -q # Apply patches -%patch1 -p1 -b .strip_alloc_sym find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -295,6 +293,13 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Wed Dec 28 2016 Mark Wielaard - 0.168-1 +- New upstream release from new home https://sourceware.org/elfutils/ +- Resolves: + - #1396092 Please implement eu-readelf --symbols[=SECTION] + - #1388057 memory allocation failure in allocate_elf + - #1387584 memory allocation failure in __libelf_set_rawdata_wrlock + * Fri Oct 7 2016 Mark Wielaard - 0.167-2 - Add elfutils-0.167-strip-alloc-symbol.patch (#1380961) diff --git a/sources b/sources index 2ad862a..55263c0 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -efc6c2067dfad5646777e93e85222e8f elfutils-0.167.tar.bz2 +SHA512 (elfutils-0.168.tar.bz2) = c8f2077ffe6877ad9e9d2f553bf0576361799c601d246f53e1d99a6f7046794c5916e1087b97ad1d1e5f59f9debc20384f864d507ef6c4c75a8e767d15d6eb91 From 625555810c109f7ba85e965d3ec2040d69096ea3 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 13 Jan 2017 14:59:34 +0100 Subject: [PATCH 028/216] 0.168-2 - Filter out private libebl backends from provides. --- elfutils.spec | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 51495b4..dbb403b 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.168 -%global baserelease 1 +%global baserelease 2 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -37,6 +37,16 @@ BuildRequires: xz-devel %global _gnu %{nil} %global _program_prefix eu- +# The lib[64]/elfutils directory contains the private ebl backend +# libraries. They must not be exposed as global provides. We don't +# need to filter the requires since they are only loaded with dlopen. +%if 0%{?fedora} >= 15 +%global __provides_exclude ^libebl_.*\\.so.*$ +%else +%filter_provides_in %{_libdir}/elfutils/libebl_.*\.so$ +%filter_setup +%endif + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -293,6 +303,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Fri Jan 13 2017 Mark Wielaard - 0.168-2 +- Filter out private libebl backends from provides. + * Wed Dec 28 2016 Mark Wielaard - 0.168-1 - New upstream release from new home https://sourceware.org/elfutils/ - Resolves: From 8926ce40f28f102764633a56a21aa61992547943 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 16 Jan 2017 11:13:34 +0100 Subject: [PATCH 029/216] 0.168-3 - Never use old, deprecated, filter_provides_in, it is too broken. --- elfutils.spec | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index dbb403b..6f27749 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.168 -%global baserelease 2 +%global baserelease 3 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -40,11 +40,8 @@ BuildRequires: xz-devel # The lib[64]/elfutils directory contains the private ebl backend # libraries. They must not be exposed as global provides. We don't # need to filter the requires since they are only loaded with dlopen. -%if 0%{?fedora} >= 15 +%if 0%{?fedora} >= 15 || 0%{?rhel} >= 7 %global __provides_exclude ^libebl_.*\\.so.*$ -%else -%filter_provides_in %{_libdir}/elfutils/libebl_.*\.so$ -%filter_setup %endif %description @@ -303,6 +300,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Mon Jan 16 2017 Mark Wielaard - 0.168-3 +- Never use old, deprecated, filter_provides_in, it really is too broken. + * Fri Jan 13 2017 Mark Wielaard - 0.168-2 - Filter out private libebl backends from provides. From 928e6dfaa72a6d5afcac0795b47615229d363d70 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 10 Feb 2017 09:07:12 +0000 Subject: [PATCH 030/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 6f27749..88001c4 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.168 -%global baserelease 3 +%global baserelease 4 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -300,6 +300,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Fri Feb 10 2017 Fedora Release Engineering - 0.168-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + * Mon Jan 16 2017 Mark Wielaard - 0.168-3 - Never use old, deprecated, filter_provides_in, it really is too broken. From 10270ba914bcfdd498ebdf17bb3425d8d1313aa9 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 15 Feb 2017 15:00:22 +0100 Subject: [PATCH 031/216] 0.168-5 - Add patches for new gcc warnings and new binutils ppc64 attributes. - elfutils-0.168-libasm-truncation.patch - elfutils-0.168-ppc64-attrs.patch --- elfutils-0.168-libasm-truncation.patch | 37 ++++++++++++++++++++++++ elfutils-0.168-ppc64-attrs.patch | 39 ++++++++++++++++++++++++++ elfutils.spec | 11 +++++++- 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.168-libasm-truncation.patch create mode 100644 elfutils-0.168-ppc64-attrs.patch diff --git a/elfutils-0.168-libasm-truncation.patch b/elfutils-0.168-libasm-truncation.patch new file mode 100644 index 0000000..f6429a5 --- /dev/null +++ b/elfutils-0.168-libasm-truncation.patch @@ -0,0 +1,37 @@ +commit 9e977aca87678417184f01d02c92b2ecb15727e3 +Author: Mark Wielaard +Date: Sun Feb 12 21:51:34 2017 +0100 + + libasm: Fix GCC7 one -Wformat-truncation=2 warning. + + Make sure that if we have really many labels the tempsym doesn't get + truncated because it is too small to hold the whole name. + + This doesn't enable -Wformat-truncation=2 or fix other "issues" pointed + out by enabling this warning because there are currently some issues + with it. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79448 + + Signed-off-by: Mark Wielaard + +diff --git a/libasm/asm_newsym.c b/libasm/asm_newsym.c +index 332432a..5389166 100644 +--- a/libasm/asm_newsym.c ++++ b/libasm/asm_newsym.c +@@ -1,5 +1,5 @@ + /* Define new symbol for current position in given section. +- Copyright (C) 2002, 2005, 2016 Red Hat, Inc. ++ Copyright (C) 2002, 2005, 2016, 2017 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 2002. + +@@ -44,7 +44,9 @@ AsmSym_t * + asm_newsym (AsmScn_t *asmscn, const char *name, GElf_Xword size, + int type, int binding) + { +-#define TEMPSYMLEN 10 ++/* We don't really expect labels with many digits, but in theory it could ++ be 10 digits (plus ".L" and a zero terminator). */ ++#define TEMPSYMLEN 13 + char tempsym[TEMPSYMLEN]; + AsmSym_t *result; + diff --git a/elfutils-0.168-ppc64-attrs.patch b/elfutils-0.168-ppc64-attrs.patch new file mode 100644 index 0000000..06f8cef --- /dev/null +++ b/elfutils-0.168-ppc64-attrs.patch @@ -0,0 +1,39 @@ +From 817bd9376dd01039a30dfc4cf9dddd8cdd247446 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Wed, 15 Feb 2017 14:30:27 +0100 +Subject: [PATCH] backends: Add support for EM_PPC64 GNU_ATTRIBUTES. + +ppc64 and ppc64le ELF files can also contain a power specific +.gnu.attributes section. Add support for those and recognize the new +GNU_Power_ABI_FP Single-precision hard float value. + +Signed-off-by: Mark Wielaard +--- +diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c +index 2ba8232..11d3a77 100644 +--- a/backends/ppc64_init.c ++++ b/backends/ppc64_init.c +@@ -67,6 +67,7 @@ ppc64_init (Elf *elf __attribute__ ((unused)), + HOOK (eh, syscall_abi); + HOOK (eh, core_note); + HOOK (eh, auxv_info); ++ HOOK (eh, check_object_attribute); + HOOK (eh, abi_cfi); + /* gcc/config/ #define DWARF_FRAME_REGISTERS. */ + eh->frame_nregs = (114 - 1) + 32; +diff --git a/backends/ppc_attrs.c b/backends/ppc_attrs.c +index 612c576..48d7129 100644 +--- a/backends/ppc_attrs.c ++++ b/backends/ppc_attrs.c +@@ -51,6 +51,7 @@ ppc_check_object_attribute (Ebl *ebl __attribute__ ((unused)), + "Hard or soft float", + "Hard float", + "Soft float", ++ "Single-precision hard float", + }; + if (value < sizeof fp_kinds / sizeof fp_kinds[0]) + *value_name = fp_kinds[value]; + +-- +1.8.3.1 + diff --git a/elfutils.spec b/elfutils.spec index 88001c4..5ee779a 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.168 -%global baserelease 4 +%global baserelease 5 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,6 +20,8 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches +Patch1: elfutils-0.168-libasm-truncation.patch +Patch2: elfutils-0.168-ppc64-attrs.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -170,6 +172,8 @@ profiling) of processes. %setup -q # Apply patches +%patch1 -p1 -b .trunc +%patch2 -p1 -b .attr find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -300,6 +304,11 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Wed Feb 15 2017 Mark Wielaard - 0.168-5 +- Add patches for new gcc warnings and new binutils ppc64 attributes. + - elfutils-0.168-libasm-truncation.patch + - elfutils-0.168-ppc64-attrs.patch + * Fri Feb 10 2017 Fedora Release Engineering - 0.168-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild From e67242de84610b0b4c7842b151288936f8a13b03 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 5 May 2017 12:03:14 +0200 Subject: [PATCH 032/216] New upstream release. elfutils 0.169. --- .gitignore | 1 + elfutils-0.168-libasm-truncation.patch | 37 ------------------------ elfutils-0.168-ppc64-attrs.patch | 39 -------------------------- elfutils.spec | 11 ++++---- sources | 2 +- 5 files changed, 7 insertions(+), 83 deletions(-) delete mode 100644 elfutils-0.168-libasm-truncation.patch delete mode 100644 elfutils-0.168-ppc64-attrs.patch diff --git a/.gitignore b/.gitignore index 35486d3..6e96ec1 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ /elfutils-0.166.tar.bz2 /elfutils-0.167.tar.bz2 /elfutils-0.168.tar.bz2 +/elfutils-0.169.tar.bz2 diff --git a/elfutils-0.168-libasm-truncation.patch b/elfutils-0.168-libasm-truncation.patch deleted file mode 100644 index f6429a5..0000000 --- a/elfutils-0.168-libasm-truncation.patch +++ /dev/null @@ -1,37 +0,0 @@ -commit 9e977aca87678417184f01d02c92b2ecb15727e3 -Author: Mark Wielaard -Date: Sun Feb 12 21:51:34 2017 +0100 - - libasm: Fix GCC7 one -Wformat-truncation=2 warning. - - Make sure that if we have really many labels the tempsym doesn't get - truncated because it is too small to hold the whole name. - - This doesn't enable -Wformat-truncation=2 or fix other "issues" pointed - out by enabling this warning because there are currently some issues - with it. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79448 - - Signed-off-by: Mark Wielaard - -diff --git a/libasm/asm_newsym.c b/libasm/asm_newsym.c -index 332432a..5389166 100644 ---- a/libasm/asm_newsym.c -+++ b/libasm/asm_newsym.c -@@ -1,5 +1,5 @@ - /* Define new symbol for current position in given section. -- Copyright (C) 2002, 2005, 2016 Red Hat, Inc. -+ Copyright (C) 2002, 2005, 2016, 2017 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 2002. - -@@ -44,7 +44,9 @@ AsmSym_t * - asm_newsym (AsmScn_t *asmscn, const char *name, GElf_Xword size, - int type, int binding) - { --#define TEMPSYMLEN 10 -+/* We don't really expect labels with many digits, but in theory it could -+ be 10 digits (plus ".L" and a zero terminator). */ -+#define TEMPSYMLEN 13 - char tempsym[TEMPSYMLEN]; - AsmSym_t *result; - diff --git a/elfutils-0.168-ppc64-attrs.patch b/elfutils-0.168-ppc64-attrs.patch deleted file mode 100644 index 06f8cef..0000000 --- a/elfutils-0.168-ppc64-attrs.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 817bd9376dd01039a30dfc4cf9dddd8cdd247446 Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Wed, 15 Feb 2017 14:30:27 +0100 -Subject: [PATCH] backends: Add support for EM_PPC64 GNU_ATTRIBUTES. - -ppc64 and ppc64le ELF files can also contain a power specific -.gnu.attributes section. Add support for those and recognize the new -GNU_Power_ABI_FP Single-precision hard float value. - -Signed-off-by: Mark Wielaard ---- -diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c -index 2ba8232..11d3a77 100644 ---- a/backends/ppc64_init.c -+++ b/backends/ppc64_init.c -@@ -67,6 +67,7 @@ ppc64_init (Elf *elf __attribute__ ((unused)), - HOOK (eh, syscall_abi); - HOOK (eh, core_note); - HOOK (eh, auxv_info); -+ HOOK (eh, check_object_attribute); - HOOK (eh, abi_cfi); - /* gcc/config/ #define DWARF_FRAME_REGISTERS. */ - eh->frame_nregs = (114 - 1) + 32; -diff --git a/backends/ppc_attrs.c b/backends/ppc_attrs.c -index 612c576..48d7129 100644 ---- a/backends/ppc_attrs.c -+++ b/backends/ppc_attrs.c -@@ -51,6 +51,7 @@ ppc_check_object_attribute (Ebl *ebl __attribute__ ((unused)), - "Hard or soft float", - "Hard float", - "Soft float", -+ "Single-precision hard float", - }; - if (value < sizeof fp_kinds / sizeof fp_kinds[0]) - *value_name = fp_kinds[value]; - --- -1.8.3.1 - diff --git a/elfutils.spec b/elfutils.spec index 5ee779a..40b3823 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.168 -%global baserelease 5 +Version: 0.169 +%global baserelease 1 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,8 +20,6 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -Patch1: elfutils-0.168-libasm-truncation.patch -Patch2: elfutils-0.168-ppc64-attrs.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -172,8 +170,6 @@ profiling) of processes. %setup -q # Apply patches -%patch1 -p1 -b .trunc -%patch2 -p1 -b .attr find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -304,6 +300,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Fri May 5 2017 Mark Wielaard - 0.169-1 +- New upstream release. Removed upstreamed patches. + * Wed Feb 15 2017 Mark Wielaard - 0.168-5 - Add patches for new gcc warnings and new binutils ppc64 attributes. - elfutils-0.168-libasm-truncation.patch diff --git a/sources b/sources index 55263c0..6547a41 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.168.tar.bz2) = c8f2077ffe6877ad9e9d2f553bf0576361799c601d246f53e1d99a6f7046794c5916e1087b97ad1d1e5f59f9debc20384f864d507ef6c4c75a8e767d15d6eb91 +SHA512 (elfutils-0.169.tar.bz2) = 0a81a20bb2aff533d035d6b76f1403437b2e11bce390db57e34b8c26e4b9b3150346d83dddcbfbbdc58063f046ca3223508dba35c6ce88e375d201e7a777a8b9 From d0b10ff2303337b49b983c564c594bfa8e341ac5 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 30 May 2017 22:04:46 +0200 Subject: [PATCH 033/216] 0.169-2 - Add ppc64 fallback unwinder. --- backtrace.ppc64le.fp.core.bz2 | Bin 0 -> 37786 bytes backtrace.ppc64le.fp.exec.bz2 | Bin 0 -> 383808 bytes elfutils-0.169-ppc64-fallback-unwinder.patch | 275 +++++++++++++++++++ elfutils.spec | 10 +- 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 backtrace.ppc64le.fp.core.bz2 create mode 100755 backtrace.ppc64le.fp.exec.bz2 create mode 100644 elfutils-0.169-ppc64-fallback-unwinder.patch diff --git a/backtrace.ppc64le.fp.core.bz2 b/backtrace.ppc64le.fp.core.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e63babf38a441f9fd94ee88910be5f5eb173435f GIT binary patch literal 37786 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 emVZY30$-doAlsUYiB!db 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

g+q{{AFf#DFp>|T@THr4GH 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%0DP0pu| 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%0D^+0iDKh;*oSKYUTmifyw)P6 zuq4>Afi@jWnISc5(!A+l;0=yQ)`AZ<)({u0F)W8TV*LreWv|L$jgN zl{*7Svw#*!Vx-DMU~g#*Uzkf7<%CnKOBp?!luiNC8HS7vXh6XMIAf0)xJVjLeDt8Zz!3wE3n5dSNC;ApA%cc1JYr7H_Go&T!O6`-7{YI@1tMhj!Pw!Z z1TyJc5g4M8;S$pQU=(=q!{I|mf~1}4vE$Iug~Qi0BgK@cHa0ZdLru3+RSDMKrtepa zv%Y%#4EJ$Sp3>}jdR~{G=v(KmFjZeoe><7%{J9DT*+}|WJkUKcuR{Kv0Bbd(=pK|^ zJ;+d(xtV0QukG=mprFp173iE~k|d9^<%*#7`Vm0VVR{j{n)E(84$kMR!&&#(alRh7 z2Isw^@Ixn?TR^)F0kopQC%4W{-t8yBGB%W0DV^~H4jZhBBhufB@P_t9kPMzd6d{wq zK^~j~&*nU;gWPY>AvbB^Dif$vt^#o~Fqo#E0m(bhp!eAMA4`z%r2m;6j%&x*H|Vk^)xiuTltnYneW-=<690KnSE3*!NR!Gt03I%UNG@()BNg zK1nS-gJ;0zV`8H+t4qv;xHdp=d;0vHJ9$+Wa*U{}h;%z{reP`9q0@$@UUl|yWoA7}7)gv-?+b7~ zt2Z>?jlUt=oP2mwiGcH50<0BN6}mj1AMS{%#wxo&+7KBHgfJoS;0K4YOdYzaY0BZ} zCe%Vpy$cA@xKTYCtW~4EQfa8220Cad#A4uiJN$2VZR6Zs^Lp9*ES3t+hON|%j#kM<%iv=)kZeyxl~KS9 zWWx2!jqv|(GL>FKd$g9r$bWss5+n)wVKbD-$GcR6ArXeDuJ^pU zkgQo@cDLQ=4&Q?6bQ5qmrj`>P)?6~;X$@F})~i(GkYwPXJr85dgmk$F+7Rm*F7wOD`JcP;(q=RH`g7onVA$+Z5KXDV00!h> z@FN)j1J(LYlg`-xE{Rr0o%=QWe}A^>@$}7G8$aQ!?&-@@UBYG4c3gk6dD}8D+7X)T zy3f(mr}}gfO|jKx-Enlf1^w5#=Kr4u@BC`CoQ@ncGW<6NjzkOgX(}@2=(;Y;n~Bit zG=0Y!F7j;FqwM8smsU#up6}+*;=_Y+Fa-W-Vspu_Y zYf{34(?W+6-Nczy3Wl%ak8hcWm3vqS+#H{W?*H=*eoxTf_ufZG=l%AO97cZfLn^2a z-IgRN+3cqSpZk6-2fLu@dCD%EXlF}(VM6``u<_^yR@WiH^s&4+7u$=k)$l{a)iN** z4A8!dKX0ql%{P6e%cwF*Di;t%&Xt`S%)}t*#<-V@jKpbiK`9n z&POwWci(q8oF;82fNi&ymIu9WpZ$L;&PNY3-t_E1hC!o4f+6yCR4MtMR!wK~_Bp;z zTT`6+7wHP9W!r}2Z(Yr&FAK2vzVDyOh2v%SyefbB#qWeRbaT$$I(7(XbSkyKhGkQY z)OPm#3Ry0ob#0?I4UAReeVSe2>HjRAQ+vb9YjYB{)i7iRj!HZ;hYmr;W0@z_^PY02 z>3okDvC*}_8o}I|oR+P&@2u@>ey83S%@>XA@BW<5a-&9sL(|GTt=L;>wOVZ+6J1v> zbrInPjWI~#F@dz%B+=nm0C}sU{qz$qWcU&#AUDILo2R?XafPvRllUC4;7CndWdaPI;Eex9N;(NOALj zi0{^sc@vOwvDw6k+o?iHB|zsjy;&xC^+7z^1764y->Jb^ z2`HH;fn_q!HE9MF>}Uw0z%sBs_+t0knWF;e2kx|+zI<-Eezo*t?WAlO)%jtc{EFqNA3wdvc-AsK{Jga8G$Hu9}$3IM?l zg9y%(2gkfV=wu?&^^C_yc|$`y9oB4}+j9gc(`O^+!lgZGA;aUWEKD6EU^#Vndzn6- z0sQ&w)?fg{5Y&Ma2MwrK5RoJ{s$^06rvuTcBq9LO8^G1ufF1w< literal 0 HcmV?d00001 diff --git a/elfutils-0.169-ppc64-fallback-unwinder.patch b/elfutils-0.169-ppc64-fallback-unwinder.patch new file mode 100644 index 0000000..da727b5 --- /dev/null +++ b/elfutils-0.169-ppc64-fallback-unwinder.patch @@ -0,0 +1,275 @@ +From 1b2cd3f4dc581eed0fc1ee98f97aa492a19873b0 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Sun, 21 May 2017 23:33:15 +0200 +Subject: [PATCH] ppc64: Add minimal fallback unwinder. + +This adds a minimal fallback unwinder for ppc64[le] in case we cannot find +CFI for a particular address. It simply always sets the program counter to +the link register, picks the previous stack pointer from the backchain, +and the previous link register from the LR save area. + +This is enough for some simple situations when we don't have CFI and +seems to work nicely in the case of perf with libdw powerpc support: +https://lkml.org/lkml/2017/5/18/998 + +Signed-off-by: Mark Wielaard +--- + backends/ChangeLog | 6 +++ + backends/Makefile.am | 2 +- + backends/ppc64_init.c | 1 + + backends/ppc64_unwind.c | 76 +++++++++++++++++++++++++++++++++ + tests/ChangeLog | 10 +++++ + tests/Makefile.am | 3 ++ + tests/backtrace-subr.sh | 2 +- + tests/backtrace.ppc64le.fp.core.bz2 | Bin 0 -> 37786 bytes + tests/backtrace.ppc64le.fp.exec.bz2 | Bin 0 -> 383808 bytes + tests/run-backtrace-fp-core-ppc64le.sh | 29 +++++++++++++ + 10 files changed, 127 insertions(+), 2 deletions(-) + create mode 100644 backends/ppc64_unwind.c + create mode 100644 tests/backtrace.ppc64le.fp.core.bz2 + create mode 100755 tests/backtrace.ppc64le.fp.exec.bz2 + create mode 100755 tests/run-backtrace-fp-core-ppc64le.sh + +index ff80a82..ac45a45 100644 +--- a/backends/Makefile.am ++++ b/backends/Makefile.am +@@ -98,7 +98,7 @@ am_libebl_ppc_pic_a_OBJECTS = $(ppc_SRCS:.c=.os) + + ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c \ + ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \ +- ppc_cfi.c ppc_initreg.c ppc64_resolve_sym.c ++ ppc_cfi.c ppc_initreg.c ppc64_unwind.c ppc64_resolve_sym.c + libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS) + am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os) + +diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c +index 11d3a77..e567033 100644 +--- a/backends/ppc64_init.c ++++ b/backends/ppc64_init.c +@@ -73,6 +73,7 @@ ppc64_init (Elf *elf __attribute__ ((unused)), + eh->frame_nregs = (114 - 1) + 32; + HOOK (eh, set_initial_registers_tid); + HOOK (eh, dwarf_to_regno); ++ HOOK (eh, unwind); + HOOK (eh, resolve_sym_value); + + /* Find the function descriptor .opd table for resolve_sym_value. */ +diff --git a/backends/ppc64_unwind.c b/backends/ppc64_unwind.c +new file mode 100644 +index 0000000..4fa0b5a +--- /dev/null ++++ b/backends/ppc64_unwind.c +@@ -0,0 +1,76 @@ ++/* Get previous frame state for an existing frame state. ++ Copyright (C) 2017 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 either ++ ++ * the GNU Lesser General Public License as published by the Free ++ Software Foundation; either version 3 of the License, or (at ++ your option) any later version ++ ++ or ++ ++ * 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 ++ ++ or both in parallel, as here. ++ ++ 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 copies of the GNU General Public License and ++ the GNU Lesser General Public License along with this program. If ++ not, see . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#define BACKEND ppc64_ ++ ++#define LR_REG 65 /* Not 108, see ppc_dwarf_to_regno. */ ++#define SP_REG 1 ++ ++#define LR_OFFSET 16 ++ ++#include "libebl_CPU.h" ++ ++/* Simplistic fallback frame unwinder. SP points to the backchain (contains ++ address of previous stack pointer). At SP offset 16 is the LR save area ++ (contains the value of the previous LR). */ ++ ++bool ++EBLHOOK(unwind) (Ebl *ebl __attribute__ ((unused)), ++ Dwarf_Addr pc __attribute__ ((unused)), ++ ebl_tid_registers_t *setfunc, ebl_tid_registers_get_t *getfunc, ++ ebl_pid_memory_read_t *readfunc, void *arg, ++ bool *signal_framep __attribute__ ((unused))) ++{ ++ Dwarf_Word sp, newSp, lr, newLr; ++ ++ /* Stack pointer points to the backchain which contains the previous sp. */ ++ if (! getfunc (SP_REG, 1, &sp, arg)) ++ sp = 0; ++ ++ /* Link register contains previous program counter. */ ++ if (! getfunc (LR_REG, 1, &lr, arg) ++ || lr == 0 ++ || ! setfunc (-1, 1, &lr, arg)) ++ return false; ++ ++ if (! readfunc(sp, &newSp, arg)) ++ newSp = 0; ++ ++ if (! readfunc(newSp + LR_OFFSET, &newLr, arg)) ++ newLr = 0; ++ ++ setfunc(SP_REG, 1, &newSp, arg); ++ setfunc(LR_REG, 1, &newLr, arg); ++ ++ /* Sanity check the stack grows down. */ ++ return newSp > sp; ++} +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 3a12fe3..50648db 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -117,6 +117,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ + run-backtrace-native-core-biarch.sh run-backtrace-core-x86_64.sh \ + run-backtrace-fp-core-x86_64.sh \ + run-backtrace-fp-core-aarch64.sh \ ++ run-backtrace-fp-core-ppc64le.sh \ + run-backtrace-core-x32.sh \ + run-backtrace-core-i386.sh run-backtrace-fp-core-i386.sh \ + run-backtrace-core-ppc.sh \ +@@ -303,6 +304,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ + backtrace-subr.sh backtrace.i386.core.bz2 backtrace.i386.exec.bz2 \ + run-backtrace-fp-core-i386.sh \ + backtrace.i386.fp.core.bz2 backtrace.i386.fp.exec.bz2 \ ++ run-backtrace-fp-core-ppc64le.sh \ ++ backtrace.ppc64le.fp.core.bz2 backtrace.ppc64le.fp.exec.bz2 \ + backtrace.x86_64.core.bz2 backtrace.x86_64.exec.bz2 \ + backtrace.x86_64.fp.core.bz2 backtrace.x86_64.fp.exec.bz2 \ + backtrace.ppc.core.bz2 backtrace.ppc.exec.bz2 \ +diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh +index 9731c43..c1f3156 100644 +--- a/tests/backtrace-subr.sh ++++ b/tests/backtrace-subr.sh +@@ -59,7 +59,7 @@ check_backtracegen() + # Ignore it here as it is a bug of OS, not a bug of elfutils. + check_err() + { +- if [ $(egrep -v <$1 'dwfl_thread_getframes: (No DWARF information found|no matching address range|address out of range|Invalid register)$' \ ++ if [ $(egrep -v <$1 'dwfl_thread_getframes: (No DWARF information found|no matching address range|address out of range|Invalid register|\(null\))$' \ + | wc -c) \ + -eq 0 ] + then +diff --git a/tests/run-backtrace-fp-core-ppc64le.sh b/tests/run-backtrace-fp-core-ppc64le.sh +new file mode 100755 +index 0000000..326ca34 +--- /dev/null ++++ b/tests/run-backtrace-fp-core-ppc64le.sh +@@ -0,0 +1,29 @@ ++#! /bin/bash ++# Copyright (C) 2017 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/backtrace-subr.sh ++ ++# The binary is generated by compiling backtrace-child without unwind ++# information, but with -fno-omit-frame-pointer. ++# ++# gcc -static -O2 -fno-omit-frame-pointer -fno-asynchronous-unwind-tables \ ++# -D_GNU_SOURCE -pthread -o tests/backtrace.ppc64le.fp.exec -I. -Ilib \ ++# tests/backtrace-child.c ++# ++# The core is generated by calling tests/backtrace.ppc64le.fp.exec --gencore ++ ++check_core ppc64le.fp +-- +1.8.3.1 + +diff -ru elfutils-0.169.orig/backends/Makefile.in elfutils-0.169/backends/Makefile.in +--- elfutils-0.169.orig/backends/Makefile.in 2017-05-30 21:43:28.725454717 +0200 ++++ elfutils-0.169/backends/Makefile.in 2017-05-30 21:43:55.681944556 +0200 +@@ -159,7 +159,7 @@ + ppc64_retval.$(OBJEXT) ppc64_corenote.$(OBJEXT) \ + ppc_regs.$(OBJEXT) ppc_auxv.$(OBJEXT) ppc_attrs.$(OBJEXT) \ + ppc_syscall.$(OBJEXT) ppc_cfi.$(OBJEXT) ppc_initreg.$(OBJEXT) \ +- ppc64_resolve_sym.$(OBJEXT) ++ ppc64_unwind.$(OBJEXT) ppc64_resolve_sym.$(OBJEXT) + libebl_ppc64_pic_a_OBJECTS = $(am_libebl_ppc64_pic_a_OBJECTS) + libebl_ppc_pic_a_AR = $(AR) $(ARFLAGS) + libebl_ppc_pic_a_LIBADD = +@@ -505,7 +505,7 @@ + am_libebl_ppc_pic_a_OBJECTS = $(ppc_SRCS:.c=.os) + ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c \ + ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \ +- ppc_cfi.c ppc_initreg.c ppc64_resolve_sym.c ++ ppc_cfi.c ppc_initreg.c ppc64_unwind.c ppc64_resolve_sym.c + + libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS) + am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os) +@@ -696,6 +696,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_resolve_sym.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_retval.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_symbol.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_unwind.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_attrs.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_auxv.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_cfi.Po@am__quote@ +diff -ru elfutils-0.169.orig/tests/Makefile.in elfutils-0.169/tests/Makefile.in +--- elfutils-0.169.orig/tests/Makefile.in 2017-05-30 21:43:28.743454377 +0200 ++++ elfutils-0.169/tests/Makefile.in 2017-05-30 21:43:56.191934904 +0200 +@@ -174,7 +174,8 @@ + run-backtrace-native-biarch.sh run-backtrace-native-core.sh \ + run-backtrace-native-core-biarch.sh \ + run-backtrace-core-x86_64.sh run-backtrace-fp-core-x86_64.sh \ +- run-backtrace-fp-core-aarch64.sh run-backtrace-core-x32.sh \ ++ run-backtrace-fp-core-aarch64.sh \ ++ run-backtrace-fp-core-ppc64le.sh run-backtrace-core-x32.sh \ + run-backtrace-core-i386.sh run-backtrace-fp-core-i386.sh \ + run-backtrace-core-ppc.sh run-backtrace-core-s390x.sh \ + run-backtrace-core-s390.sh run-backtrace-core-aarch64.sh \ +@@ -1174,6 +1175,8 @@ + backtrace-subr.sh backtrace.i386.core.bz2 backtrace.i386.exec.bz2 \ + run-backtrace-fp-core-i386.sh \ + backtrace.i386.fp.core.bz2 backtrace.i386.fp.exec.bz2 \ ++ run-backtrace-fp-core-ppc64le.sh \ ++ backtrace.ppc64le.fp.core.bz2 backtrace.ppc64le.fp.exec.bz2 \ + backtrace.x86_64.core.bz2 backtrace.x86_64.exec.bz2 \ + backtrace.x86_64.fp.core.bz2 backtrace.x86_64.fp.exec.bz2 \ + backtrace.ppc.core.bz2 backtrace.ppc.exec.bz2 \ +@@ -2924,6 +2927,13 @@ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ ++ "$$tst" $(AM_TESTS_FD_REDIRECT) ++run-backtrace-fp-core-ppc64le.sh.log: run-backtrace-fp-core-ppc64le.sh ++ @p='run-backtrace-fp-core-ppc64le.sh'; \ ++ b='run-backtrace-fp-core-ppc64le.sh'; \ ++ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ ++ --log-file $$b.log --trs-file $$b.trs \ ++ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) + run-backtrace-core-x32.sh.log: run-backtrace-core-x32.sh + @p='run-backtrace-core-x32.sh'; \ diff --git a/elfutils.spec b/elfutils.spec index 40b3823..12ac0da 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.169 -%global baserelease 1 +%global baserelease 2 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,6 +20,9 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches +Patch1: elfutils-0.169-ppc64-fallback-unwinder.patch +Source1: backtrace.ppc64le.fp.exec.bz2 +Source2: backtrace.ppc64le.fp.core.bz2 Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -170,6 +173,8 @@ profiling) of processes. %setup -q # Apply patches +%patch1 -p1 -b .ppc64_unwind +cp %SOURCE1 %SOURCE2 tests/ find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -300,6 +305,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Tue May 30 2017 Mark Wielaard - 0.169-2 +- Add ppc64 fallback unwinder. + * Fri May 5 2017 Mark Wielaard - 0.169-1 - New upstream release. Removed upstreamed patches. From 4341caedce06cf6c317f1a5bd98a572b42e8fca9 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 7 Jun 2017 21:52:20 +0200 Subject: [PATCH 034/216] 0.169-3 dup-shstrtab and strip-empty fixes. - Add elfutils-0.169-dup-shstrtab.patch - Add elfutils-0.169-strip-empty.patch --- elfutils-0.169-dup-shstrtab.patch | 98 +++++++++++++ elfutils-0.169-strip-empty.patch | 235 ++++++++++++++++++++++++++++++ elfutils.spec | 10 +- 3 files changed, 342 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.169-dup-shstrtab.patch create mode 100644 elfutils-0.169-strip-empty.patch diff --git a/elfutils-0.169-dup-shstrtab.patch b/elfutils-0.169-dup-shstrtab.patch new file mode 100644 index 0000000..d6095eb --- /dev/null +++ b/elfutils-0.169-dup-shstrtab.patch @@ -0,0 +1,98 @@ +commit e014cbba4e16f717807bca88512d2875a1c17ee4 +Author: Mark Wielaard +Date: Wed Jun 7 14:05:36 2017 +0200 + + strip: Make sure old .shstrab is removed when eu-strip recreates it. + + Although we always recreate the .shstrtab section for the new output + file we never explicitly assumed it could be removed. It might not be + possible to remove it when the section string table is shared with + a symbol table. But if it is removable we should (and recreate it for + the new section list). + + Regression introduced in commit elfutils-0.163-33-gdf7dfab. + "Handle merged strtab/shstrtab string tables in strip and unstrip." + Add extra testcase to explicitly check for this case. + + https://sourceware.org/bugzilla/show_bug.cgi?id=21525 + + Signed-off-by: Mark Wielaard + +diff --git a/src/ChangeLog b/src/ChangeLog +index cbb77fc..6ac0ef2 100644 +--- a/src/ChangeLog ++++ b/src/ChangeLog +@@ -1,3 +1,7 @@ ++2017-06-06 Mark Wielaard ++ ++ * strip.c (handle_elf): Assume e_shstrndx section can be removed. ++ + 2017-04-20 Ulf Hermann + + * readelf.c: Include strings.h. +diff --git a/src/strip.c b/src/strip.c +index f747441..11b2a37 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -711,11 +711,13 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + in the sh_link or sh_info element it cannot be removed either + */ + for (cnt = 1; cnt < shnum; ++cnt) +- /* Check whether the section can be removed. */ ++ /* Check whether the section can be removed. Since we will create ++ a new .shstrtab assume it will be removed too. */ + if (remove_shdrs ? !(shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) +- : ebl_section_strip_p (ebl, ehdr, &shdr_info[cnt].shdr, +- shdr_info[cnt].name, remove_comment, +- remove_debug)) ++ : (ebl_section_strip_p (ebl, ehdr, &shdr_info[cnt].shdr, ++ shdr_info[cnt].name, remove_comment, ++ remove_debug) ++ || cnt == ehdr->e_shstrndx)) + { + /* For now assume this section will be removed. */ + shdr_info[cnt].idx = 0; +@@ -1062,8 +1064,10 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + } + + /* Test whether we are doing anything at all. */ +- if (cnt == idx) +- /* Nope, all removable sections are already gone. */ ++ if (cnt == idx ++ || (cnt == idx + 1 && shdr_info[ehdr->e_shstrndx].idx == 0)) ++ /* Nope, all removable sections are already gone. Or the only section ++ we would remove is the .shstrtab section which we will add again. */ + goto fail_close; + + /* Create the reference to the file with the debug info. */ +diff --git a/tests/ChangeLog b/tests/ChangeLog +index 5b0d486..5800946 100644 +--- a/tests/ChangeLog ++++ b/tests/ChangeLog +@@ -1,3 +1,7 @@ ++2017-06-06 Mark Wielaard ++ ++ * run-strip-test.sh: Test strip -g doesn't introduce extra .shstrtab. ++ + 2017-02-13 Ulf Hermann + Mark Wielaard + +diff --git a/tests/run-strip-test.sh b/tests/run-strip-test.sh +index 42aa988..280814e 100755 +--- a/tests/run-strip-test.sh ++++ b/tests/run-strip-test.sh +@@ -49,6 +49,14 @@ testrun ${abs_top_builddir}/src/unstrip -o testfile.unstrip testfile.temp testfi + testrun ${abs_top_builddir}/src/elfcmp --hash-inexact $original testfile.unstrip + } + ++# test strip -g ++testrun ${abs_top_builddir}/src/strip -g -o testfile.temp $original ++ ++# Buggy eu-strip created multiple .shstrtab sections ++shstrtab_SECS=$(testrun ${abs_top_builddir}/src/readelf -S testfile.temp | grep '.shstrtab' | wc --lines) ++test $shstrtab_SECS -eq 1 || ++ { echo "*** failure not just one '.shstrtab' testfile.temp ($shstrtab_SECS)"; status=1; } ++ + # Now strip in-place and make sure it is smaller. + SIZE_original=$(stat -c%s $original) + testrun ${abs_top_builddir}/src/strip $original diff --git a/elfutils-0.169-strip-empty.patch b/elfutils-0.169-strip-empty.patch new file mode 100644 index 0000000..13d0c0f --- /dev/null +++ b/elfutils-0.169-strip-empty.patch @@ -0,0 +1,235 @@ +commit b065d4a401e2120c11c92357b213a85e6d70f300 +Author: Mark Wielaard +Date: Wed Jun 7 20:32:38 2017 +0200 + + strip: Don't generate empty output file when nothing to do. + + If there was nothing to do strip would skip generating a separate + debug file if one was requested, but it would also not finish the + creation of a new output file (with the non-stripped sections). + Also if there was an error any partially created output would be kept. + + Make sure that when the -o output file option is given we always generate + a complete output file (except on error). Also make sure that when the -f + debug file option is given it is only generated when it is not empty. + + Add testcase run-strip-nothing.sh that tests the various combinations. + + https://sourceware.org/bugzilla/show_bug.cgi?id=21522 + + Signed-off-by: Mark Wielaard + +diff --git a/src/ChangeLog b/src/ChangeLog +index 6ac0ef2..e19122e 100644 +--- a/src/ChangeLog ++++ b/src/ChangeLog +@@ -1,3 +1,9 @@ ++2017-06-07 Mark Wielaard ++ ++ * strip.c (handle_elf): Introduce new handle_elf boolean. Use it to ++ determine whether to create an output and/or debug file. Remove new ++ output file on error. ++ + 2017-06-06 Mark Wielaard + + * strip.c (handle_elf): Assume e_shstrndx section can be removed. +diff --git a/src/strip.c b/src/strip.c +index 11b2a37..2bf95f9 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -1063,15 +1063,17 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + shdr_info[cnt].se = dwelf_strtab_add (shst, shdr_info[cnt].name); + } + +- /* Test whether we are doing anything at all. */ +- if (cnt == idx +- || (cnt == idx + 1 && shdr_info[ehdr->e_shstrndx].idx == 0)) +- /* Nope, all removable sections are already gone. Or the only section +- we would remove is the .shstrtab section which we will add again. */ +- goto fail_close; +- +- /* Create the reference to the file with the debug info. */ +- if (debug_fname != NULL && !remove_shdrs) ++ /* Test whether we are doing anything at all. Either all removable ++ sections are already gone. Or the only section we would remove is ++ the .shstrtab section which we would add again. */ ++ bool removing_sections = !(cnt == idx ++ || (cnt == idx + 1 ++ && shdr_info[ehdr->e_shstrndx].idx == 0)); ++ if (output_fname == NULL && !removing_sections) ++ goto fail_close; ++ ++ /* Create the reference to the file with the debug info (if any). */ ++ if (debug_fname != NULL && !remove_shdrs && removing_sections) + { + /* Add the section header string table section name. */ + shdr_info[cnt].se = dwelf_strtab_add_len (shst, ".gnu_debuglink", 15); +@@ -1759,7 +1761,8 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + /* Remove any relocations between debug sections in ET_REL + for the debug file when requested. These relocations are always + zero based between the unallocated sections. */ +- if (debug_fname != NULL && reloc_debug && ehdr->e_type == ET_REL) ++ if (debug_fname != NULL && removing_sections ++ && reloc_debug && ehdr->e_type == ET_REL) + { + scn = NULL; + cnt = 0; +@@ -1997,7 +2000,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + + /* Now that we have done all adjustments to the data, + we can actually write out the debug file. */ +- if (debug_fname != NULL) ++ if (debug_fname != NULL && removing_sections) + { + /* Finally write the file. */ + if (unlikely (elf_update (debugelf, ELF_C_WRITE) == -1)) +@@ -2230,7 +2233,11 @@ cannot set access and modification date of '%s'"), + + /* Close the file descriptor if we created a new file. */ + if (output_fname != NULL) +- close (fd); ++ { ++ close (fd); ++ if (result != 0) ++ unlink (output_fname); ++ } + + return result; + } +diff --git a/tests/ChangeLog b/tests/ChangeLog +index 5800946..5550eac 100644 +--- a/tests/ChangeLog ++++ b/tests/ChangeLog +@@ -1,3 +1,9 @@ ++2017-06-07 Mark Wielaard ++ ++ * run-strip-nothing.sh: New test. ++ * Makefile.am (TESTS): Add run-strip-nothing.sh. ++ (EXTRA_DIST): Likewise. ++ + 2017-06-06 Mark Wielaard + + * run-strip-test.sh: Test strip -g doesn't introduce extra .shstrtab. +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 3a12fe3..28e997c 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -81,6 +81,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ + run-strip-test3.sh run-strip-test4.sh run-strip-test5.sh \ + run-strip-test6.sh run-strip-test7.sh run-strip-test8.sh \ + run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ ++ run-strip-nothing.sh \ + run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ + run-strip-nobitsalign.sh \ + run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-test3.sh \ +@@ -174,6 +175,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ + run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ + run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ + run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ ++ run-strip-nothing.sh \ + run-strip-strmerge.sh run-strip-nobitsalign.sh \ + testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ + run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ +diff --git a/tests/run-strip-nothing.sh b/tests/run-strip-nothing.sh +new file mode 100755 +index 0000000..e80bd90 +--- /dev/null ++++ b/tests/run-strip-nothing.sh +@@ -0,0 +1,62 @@ ++#! /bin/sh ++# Copyright (C) 2017 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 ++ ++# If there is nothing to strip then -o output should be identical to input. ++# And there should not be an (empty) -f debug file. ++ ++tempfiles a.out strip.out debug.out ++ ++# Create no-debug a.out. ++echo "int main() { return 1; }" | gcc -xc - ++ ++# strip to file ++testrun ${abs_top_builddir}/src/strip -g -o strip.out || ++ { echo "*** failed to strip -g -o strip.out a.out"; exit -1; } ++ ++testrun ${abs_top_builddir}/src/elfcmp a.out strip.out || ++ { echo "*** failed strip.out different from a.out"; exit -1; } ++ ++# strip original ++testrun ${abs_top_builddir}/src/strip -g || ++ { echo "*** failed to strip -g a.out"; exit -1; } ++ ++testrun ${abs_top_builddir}/src/elfcmp strip.out a.out || ++ { echo "*** failed a.out different from strip.out"; exit -1; } ++ ++# strip to file with debug file ++testrun ${abs_top_builddir}/src/strip -g -o strip.out -f debug.out || ++ { echo "*** failed to strip -g -o strip.out -f debug.out a.out"; exit -1; } ++ ++testrun ${abs_top_builddir}/src/elfcmp a.out strip.out || ++ { echo "*** failed strip.out different from a.out (with debug)"; exit -1; } ++ ++test ! -f debug.out || ++ { echo "*** failed strip.out and debug.out exist"; exit -1; } ++ ++# strip original with debug file ++testrun ${abs_top_builddir}/src/strip -g -f debug.out || ++ { echo "*** failed to strip -g -f debug.out a.out"; exit -1; } ++ ++testrun ${abs_top_builddir}/src/elfcmp strip.out a.out || ++ { echo "*** failed a.out different from strip.out (with debug)"; exit -1; } ++ ++test ! -f debug.out || ++ { echo "*** failed a.out and debug.out exist"; exit -1; } ++ ++exit 0 +--- elfutils-0.169/tests/Makefile.in.orig 2017-06-07 21:48:55.475994222 +0200 ++++ elfutils-0.169/tests/Makefile.in 2017-06-07 21:49:20.441430261 +0200 +@@ -138,8 +138,8 @@ + run-strip-test.sh run-strip-test2.sh run-strip-test3.sh \ + run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ + run-strip-test7.sh run-strip-test8.sh run-strip-test9.sh \ +- run-strip-test10.sh run-strip-test11.sh run-strip-groups.sh \ +- run-strip-reloc.sh run-strip-strmerge.sh \ ++ run-strip-test10.sh run-strip-test11.sh run-strip-nothing.sh \ ++ run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ + run-strip-nobitsalign.sh run-unstrip-test.sh \ + run-unstrip-test2.sh run-unstrip-test3.sh run-unstrip-test4.sh \ + run-unstrip-M.sh run-elfstrmerge-test.sh run-ecp-test.sh \ +@@ -1046,6 +1046,7 @@ + run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ + run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ + run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ ++ run-strip-nothing.sh \ + run-strip-strmerge.sh run-strip-nobitsalign.sh \ + testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ + run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ +@@ -2332,6 +2333,13 @@ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ ++ "$$tst" $(AM_TESTS_FD_REDIRECT) ++run-strip-nothing.sh.log: run-strip-nothing.sh ++ @p='run-strip-nothing.sh'; \ ++ b='run-strip-nothing.sh'; \ ++ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ ++ --log-file $$b.log --trs-file $$b.trs \ ++ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) + run-strip-groups.sh.log: run-strip-groups.sh + @p='run-strip-groups.sh'; \ diff --git a/elfutils.spec b/elfutils.spec index 12ac0da..2e43004 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.169 -%global baserelease 2 +%global baserelease 3 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -23,6 +23,8 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: elfutils-0.169-ppc64-fallback-unwinder.patch Source1: backtrace.ppc64le.fp.exec.bz2 Source2: backtrace.ppc64le.fp.core.bz2 +Patch2: elfutils-0.169-dup-shstrtab.patch +Patch3: elfutils-0.169-strip-empty.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -175,6 +177,8 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .ppc64_unwind cp %SOURCE1 %SOURCE2 tests/ +%patch2 -p1 -b .shstrtab_dup +%patch3 -p1 -b .strip_empty find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -305,6 +309,10 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Wed Jun 7 2017 Mark Wielaard - 0.169-3 +- Add elfutils-0.169-dup-shstrtab.patch +- Add elfutils-0.169-strip-empty.patch + * Tue May 30 2017 Mark Wielaard - 0.169-2 - Add ppc64 fallback unwinder. From 650c3959197755ade8883e5159d08224ba053551 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 17 Jul 2017 11:32:28 +0200 Subject: [PATCH 035/216] 0.169-4 - Add elfutils-0.169-strip-keep-remove-section.patch (#1465997) --- ...tils-0.169-strip-keep-remove-section.patch | 1063 +++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 1069 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.169-strip-keep-remove-section.patch diff --git a/elfutils-0.169-strip-keep-remove-section.patch b/elfutils-0.169-strip-keep-remove-section.patch new file mode 100644 index 0000000..d864e60 --- /dev/null +++ b/elfutils-0.169-strip-keep-remove-section.patch @@ -0,0 +1,1063 @@ +commit d03be4f70c688a8c675935973663014c3c4bba76 +Author: Mark Wielaard +Date: Fri Jul 14 17:09:40 2017 +0200 + + strip: Add --keep-section=SECTION and --remove-section=SECTION. + + Adds two new output options: + + --keep-section=SECTION Keep the named section. SECTION is an extended + wildcard pattern. May be given more than once. + + --remove-section=SECTION Remove the named section. SECTION is an + extended wildcard pattern. May be given more than + once. Only non-allocated sections can be removed. + + The --remove-section was already partially implemented, but only for the + .comment section. The short option -R is to be compatible with binutils. + + The new testcase makes sure that various combinations of kept/removed + sections pull the correct dependencies into the output and/or debug files. + + https://bugzilla.redhat.com/show_bug.cgi?id=1465997 + + Signed-off-by: Mark Wielaard + +diff --git a/ChangeLog b/ChangeLog +index 0d6cd2b..c9db732 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,7 @@ ++2017-07-14 Mark Wielaard ++ ++ * NEWS: Add 0.170 section and new strip options. ++ + 2017-05-05 Mark Wielaard + + * configure.ac: Set version to 0.169. Update copyright year. +diff --git a/NEWS b/NEWS +index eb7dd97..b69aef4 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,3 +1,7 @@ ++Version 0.170 ++ ++strip: Add -R, --remove-section=SECTION and --keep-section=SECTION. ++ + Version 0.169 + + backends: Add support for EM_PPC64 GNU_ATTRIBUTES. +diff --git a/src/ChangeLog b/src/ChangeLog +index e19122e..0b60fc7 100644 +--- a/src/ChangeLog ++++ b/src/ChangeLog +@@ -1,3 +1,16 @@ ++2017-07-14 Mark Wielaard ++ ++ * strip (OPT_KEEP_SECTION): New define. ++ (options): Add documentation for remove-section. Add keep-section. ++ (struct section_pattern): New data type. ++ (keep_secs, remove_secs): New globals. ++ (add_pattern, free_sec_patterns, free_patterns, section_name_matches): ++ New functions. ++ (main): Call free_patterns. ++ (parse_opt): Handle 'R' and OPT_KEEP_SECTION. Check remove_comment ++ on ARGP_KEY_SUCCESS. ++ (handle_elf): Handle and sanity check keep_secs and remove_secs. ++ + 2017-06-07 Mark Wielaard + + * strip.c (handle_elf): Introduce new handle_elf boolean. Use it to +diff --git a/src/strip.c b/src/strip.c +index 2bf95f9..4a35ea1 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -60,6 +61,7 @@ ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT; + #define OPT_PERMISSIVE 0x101 + #define OPT_STRIP_SECTIONS 0x102 + #define OPT_RELOC_DEBUG 0x103 ++#define OPT_KEEP_SECTION 0x104 + + + /* Definitions of arguments for argp functions. */ +@@ -83,7 +85,8 @@ static const struct argp_option options[] = + N_("Resolve all trivial relocations between debug sections if the removed sections are placed in a debug file (only relevant for ET_REL files, operation is not reversable, needs -f)"), 0 }, + { "remove-comment", OPT_REMOVE_COMMENT, NULL, 0, + N_("Remove .comment section"), 0 }, +- { "remove-section", 'R', "SECTION", OPTION_HIDDEN, NULL, 0 }, ++ { "remove-section", 'R', "SECTION", 0, N_("Remove the named section. SECTION is an extended wildcard pattern. May be given more than once. Only non-allocated sections can be removed."), 0 }, ++ { "keep-section", OPT_KEEP_SECTION, "SECTION", 0, N_("Keep the named section. SECTION is an extended wildcard pattern. May be given more than once."), 0 }, + { "permissive", OPT_PERMISSIVE, NULL, 0, + N_("Relax a few rules to handle slightly broken ELF files"), 0 }, + { NULL, 0, NULL, 0, NULL, 0 } +@@ -157,6 +160,58 @@ static bool permissive; + /* If true perform relocations between debug sections. */ + static bool reloc_debug; + ++/* Sections the user explicitly wants to keep or remove. */ ++struct section_pattern ++{ ++ char *pattern; ++ struct section_pattern *next; ++}; ++ ++static struct section_pattern *keep_secs = NULL; ++static struct section_pattern *remove_secs = NULL; ++ ++static void ++add_pattern (struct section_pattern **patterns, const char *pattern) ++{ ++ struct section_pattern *p = xmalloc (sizeof *p); ++ p->pattern = xstrdup (pattern); ++ p->next = *patterns; ++ *patterns = p; ++} ++ ++static void ++free_sec_patterns (struct section_pattern *patterns) ++{ ++ struct section_pattern *pattern = patterns; ++ while (pattern != NULL) ++ { ++ struct section_pattern *p = pattern; ++ pattern = p->next; ++ free (p->pattern); ++ free (p); ++ } ++} ++ ++static void ++free_patterns (void) ++{ ++ free_sec_patterns (keep_secs); ++ free_sec_patterns (remove_secs); ++} ++ ++static bool ++section_name_matches (struct section_pattern *patterns, const char *name) ++{ ++ struct section_pattern *pattern = patterns; ++ while (pattern != NULL) ++ { ++ if (fnmatch (pattern->pattern, name, FNM_EXTMATCH) == 0) ++ return true; ++ pattern = pattern->next; ++ } ++ return false; ++} ++ + + int + main (int argc, char *argv[]) +@@ -207,6 +262,7 @@ Only one input file allowed together with '-o' and '-f'")); + while (++remaining < argc); + } + ++ free_patterns (); + return result; + } + +@@ -257,14 +313,13 @@ parse_opt (int key, char *arg, struct argp_state *state) + break; + + case 'R': +- if (!strcmp (arg, ".comment")) ++ if (fnmatch (arg, ".comment", FNM_EXTMATCH) == 0) + remove_comment = true; +- else +- { +- argp_error (state, +- gettext ("-R option supports only .comment section")); +- return EINVAL; +- } ++ add_pattern (&remove_secs, arg); ++ break; ++ ++ case OPT_KEEP_SECTION: ++ add_pattern (&keep_secs, arg); + break; + + case 'g': +@@ -284,6 +339,16 @@ parse_opt (int key, char *arg, struct argp_state *state) + case 's': /* Ignored for compatibility. */ + break; + ++ case ARGP_KEY_SUCCESS: ++ if (remove_comment == true ++ && section_name_matches (keep_secs, ".comment")) ++ { ++ argp_error (state, ++ gettext ("cannot both keep and remove .comment section")); ++ return EINVAL; ++ } ++ break; ++ + default: + return ARGP_ERR_UNKNOWN; + } +@@ -622,6 +687,28 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + goto fail_close; + } + ++ /* Sanity check the user. */ ++ if (section_name_matches (remove_secs, shdr_info[cnt].name)) ++ { ++ if ((shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) != 0) ++ { ++ error (0, 0, ++ gettext ("Cannot remove allocated section '%s'"), ++ shdr_info[cnt].name); ++ result = 1; ++ goto fail_close; ++ } ++ ++ if (section_name_matches (keep_secs, shdr_info[cnt].name)) ++ { ++ error (0, 0, ++ gettext ("Cannot both keep and remove section '%s'"), ++ shdr_info[cnt].name); ++ result = 1; ++ goto fail_close; ++ } ++ } ++ + /* Mark them as present but not yet investigated. */ + shdr_info[cnt].idx = 1; + +@@ -709,6 +796,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + know how to handle them + - if a section is referred to from a section which is not removed + in the sh_link or sh_info element it cannot be removed either ++ - the user might have explicitly said to remove or keep a section + */ + for (cnt = 1; cnt < shnum; ++cnt) + /* Check whether the section can be removed. Since we will create +@@ -717,8 +805,13 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + : (ebl_section_strip_p (ebl, ehdr, &shdr_info[cnt].shdr, + shdr_info[cnt].name, remove_comment, + remove_debug) +- || cnt == ehdr->e_shstrndx)) ++ || cnt == ehdr->e_shstrndx ++ || section_name_matches (remove_secs, shdr_info[cnt].name))) + { ++ /* The user might want to explicitly keep this one. */ ++ if (section_name_matches (keep_secs, shdr_info[cnt].name)) ++ continue; ++ + /* For now assume this section will be removed. */ + shdr_info[cnt].idx = 0; + +@@ -2174,14 +2267,14 @@ while computing checksum for debug information")); + if (shdr_info != NULL) + { + /* For some sections we might have created an table to map symbol +- table indices. */ +- if (any_symtab_changes) +- for (cnt = 1; cnt <= shdridx; ++cnt) +- { +- free (shdr_info[cnt].newsymidx); +- if (shdr_info[cnt].debug_data != NULL) +- free (shdr_info[cnt].debug_data->d_buf); +- } ++ table indices. Or we might kept (original) data around to put ++ into the .debug file. */ ++ for (cnt = 1; cnt <= shdridx; ++cnt) ++ { ++ free (shdr_info[cnt].newsymidx); ++ if (shdr_info[cnt].debug_data != NULL) ++ free (shdr_info[cnt].debug_data->d_buf); ++ } + + /* Free data we allocated for the .gnu_debuglink section. */ + free (debuglink_buf); +diff --git a/tests/ChangeLog b/tests/ChangeLog +index ecf6263..3dd6f2a 100644 +--- a/tests/ChangeLog ++++ b/tests/ChangeLog +@@ -1,3 +1,9 @@ ++2017-07-14 Mark Wielaard ++ ++ * run-strip-remove-keep.sh: New test. ++ * Makefile.am (TESTS): Add run-strip-remove-keep.sh. ++ (EXTRA_DIST): Likewise. ++ + 2017-06-07 Mark Wielaard + + * run-strip-nothing.sh: New test. +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 0aa16da..7fd4b21 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -83,7 +83,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ + run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ + run-strip-nothing.sh \ + run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ +- run-strip-nobitsalign.sh \ ++ run-strip-nobitsalign.sh run-strip-remove-keep.sh \ + run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-test3.sh \ + run-unstrip-test4.sh run-unstrip-M.sh run-elfstrmerge-test.sh \ + run-ecp-test.sh run-ecp-test2.sh run-alldts.sh \ +@@ -176,7 +176,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ + run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ + run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ + run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ +- run-strip-nothing.sh \ ++ run-strip-nothing.sh run-strip-remove-keep.sh \ + run-strip-strmerge.sh run-strip-nobitsalign.sh \ + testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ + run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ +diff --git a/tests/run-strip-remove-keep.sh b/tests/run-strip-remove-keep.sh +new file mode 100755 +index 0000000..92647fa +--- /dev/null ++++ b/tests/run-strip-remove-keep.sh +@@ -0,0 +1,688 @@ ++#! /bin/sh ++# Copyright (C) 2017 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 ++ ++# strip -o output and -f debug files ++tempfiles testfile.elf testfile.debug ++ ++# A random 32bit testfile ++testfiles testfile ++ ++# Explicitly keep .strtab (but not .symtab, so .strtab will be in both). 32bit ++echo strip --keep-section=.strtab testfile ++testrun ${abs_top_builddir}/src/strip --keep-section=.strtab -o testfile.elf -f testfile.debug testfile ++echo elflint testfile.elf ++testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf ++echo elflint testfile.debug ++testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug ++echo readelf testfile.elf ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF ++There are 27 section headers, starting at offset 0xaf8: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 00000000 000000 000000 0 0 0 0 ++[ 1] .interp PROGBITS 080480f4 0000f4 000013 0 A 0 0 1 ++[ 2] .note.ABI-tag NOTE 08048108 000108 000020 0 A 0 0 4 ++[ 3] .hash HASH 08048128 000128 000030 4 A 4 0 4 ++[ 4] .dynsym DYNSYM 08048158 000158 000070 16 A 5 1 4 ++[ 5] .dynstr STRTAB 080481c8 0001c8 00008e 0 A 0 0 1 ++[ 6] .gnu.version GNU_versym 08048256 000256 00000e 2 A 4 0 2 ++[ 7] .gnu.version_r GNU_verneed 08048264 000264 000030 0 A 5 1 4 ++[ 8] .rel.got REL 08048294 000294 000008 8 A 4 19 4 ++[ 9] .rel.plt REL 0804829c 00029c 000020 8 A 4 11 4 ++[10] .init PROGBITS 080482bc 0002bc 000018 0 AX 0 0 4 ++[11] .plt PROGBITS 080482d4 0002d4 000050 4 AX 0 0 4 ++[12] .text PROGBITS 08048330 000330 00018c 0 AX 0 0 16 ++[13] .fini PROGBITS 080484bc 0004bc 00001e 0 AX 0 0 4 ++[14] .rodata PROGBITS 080484dc 0004dc 000008 0 A 0 0 4 ++[15] .data PROGBITS 080494e4 0004e4 000010 0 WA 0 0 4 ++[16] .eh_frame PROGBITS 080494f4 0004f4 000004 0 WA 0 0 4 ++[17] .ctors PROGBITS 080494f8 0004f8 000008 0 WA 0 0 4 ++[18] .dtors PROGBITS 08049500 000500 000008 0 WA 0 0 4 ++[19] .got PROGBITS 08049508 000508 000020 4 WA 0 0 4 ++[20] .dynamic DYNAMIC 08049528 000528 0000a0 8 WA 5 0 4 ++[21] .bss NOBITS 080495c8 0005c8 00001c 0 WA 0 0 4 ++[22] .comment PROGBITS 00000000 0005c8 000170 0 0 0 1 ++[23] .note NOTE 00000000 000738 0000a0 0 0 0 1 ++[24] .strtab STRTAB 00000000 0007d8 000235 0 0 0 1 ++[25] .gnu_debuglink PROGBITS 00000000 000a10 000014 0 0 0 4 ++[26] .shstrtab STRTAB 00000000 000a24 0000d1 0 0 0 1 ++ ++EOF ++echo readelf testfile.debug ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF ++There are 35 section headers, starting at offset 0x463c: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 00000000 000000 000000 0 0 0 0 ++[ 1] .interp NOBITS 080480f4 0000f4 000013 0 A 0 0 1 ++[ 2] .note.ABI-tag NOTE 08048108 0000f4 000020 0 A 0 0 4 ++[ 3] .hash NOBITS 08048128 000114 000030 4 A 4 0 4 ++[ 4] .dynsym NOBITS 08048158 000114 000070 16 A 5 1 4 ++[ 5] .dynstr NOBITS 080481c8 000114 00008e 0 A 0 0 1 ++[ 6] .gnu.version NOBITS 08048256 000114 00000e 2 A 4 0 2 ++[ 7] .gnu.version_r NOBITS 08048264 000114 000030 0 A 5 1 4 ++[ 8] .rel.got NOBITS 08048294 000114 000008 8 A 4 19 4 ++[ 9] .rel.plt NOBITS 0804829c 000114 000020 8 A 4 11 4 ++[10] .init NOBITS 080482bc 000114 000018 0 AX 0 0 4 ++[11] .plt NOBITS 080482d4 000114 000050 4 AX 0 0 4 ++[12] .text NOBITS 08048330 000120 00018c 0 AX 0 0 16 ++[13] .fini NOBITS 080484bc 000120 00001e 0 AX 0 0 4 ++[14] .rodata NOBITS 080484dc 000120 000008 0 A 0 0 4 ++[15] .data NOBITS 080494e4 000120 000010 0 WA 0 0 4 ++[16] .eh_frame NOBITS 080494f4 000120 000004 0 WA 0 0 4 ++[17] .ctors NOBITS 080494f8 000120 000008 0 WA 0 0 4 ++[18] .dtors NOBITS 08049500 000120 000008 0 WA 0 0 4 ++[19] .got NOBITS 08049508 000120 000020 4 WA 0 0 4 ++[20] .dynamic NOBITS 08049528 000120 0000a0 8 WA 5 0 4 ++[21] .sbss PROGBITS 080495c8 000120 000000 0 W 0 0 1 ++[22] .bss NOBITS 080495c8 000120 00001c 0 WA 0 0 4 ++[23] .stab PROGBITS 00000000 000120 000720 12 24 0 4 ++[24] .stabstr STRTAB 00000000 000840 001934 0 0 0 1 ++[25] .comment NOBITS 00000000 002174 000170 0 0 0 1 ++[26] .debug_aranges PROGBITS 00000000 002174 000060 0 0 0 1 ++[27] .debug_pubnames PROGBITS 00000000 0021d4 000055 0 0 0 1 ++[28] .debug_info PROGBITS 00000000 002229 001678 0 0 0 1 ++[29] .debug_abbrev PROGBITS 00000000 0038a1 0001d2 0 0 0 1 ++[30] .debug_line PROGBITS 00000000 003a73 000223 0 0 0 1 ++[31] .note NOTE 00000000 003c96 0000a0 0 0 0 1 ++[32] .shstrtab STRTAB 00000000 003d36 00012e 0 0 0 1 ++[33] .symtab SYMTAB 00000000 003e64 0005a0 16 34 68 4 ++[34] .strtab STRTAB 00000000 004404 000235 0 0 0 1 ++ ++EOF ++ ++# Explicitly keep .symtab (pulls in .strtab, so they will both be in elf). 32bit ++echo strip --keep-section=.symtab testfile ++testrun ${abs_top_builddir}/src/strip --keep-section=.symtab -o testfile.elf -f testfile.debug testfile ++echo elflint testfile.elf ++testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf ++echo elflint testfile.debug ++testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug ++echo readelf testfile.elf ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF ++There are 28 section headers, starting at offset 0x1010: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 00000000 000000 000000 0 0 0 0 ++[ 1] .interp PROGBITS 080480f4 0000f4 000013 0 A 0 0 1 ++[ 2] .note.ABI-tag NOTE 08048108 000108 000020 0 A 0 0 4 ++[ 3] .hash HASH 08048128 000128 000030 4 A 4 0 4 ++[ 4] .dynsym DYNSYM 08048158 000158 000070 16 A 5 1 4 ++[ 5] .dynstr STRTAB 080481c8 0001c8 00008e 0 A 0 0 1 ++[ 6] .gnu.version GNU_versym 08048256 000256 00000e 2 A 4 0 2 ++[ 7] .gnu.version_r GNU_verneed 08048264 000264 000030 0 A 5 1 4 ++[ 8] .rel.got REL 08048294 000294 000008 8 A 4 19 4 ++[ 9] .rel.plt REL 0804829c 00029c 000020 8 A 4 11 4 ++[10] .init PROGBITS 080482bc 0002bc 000018 0 AX 0 0 4 ++[11] .plt PROGBITS 080482d4 0002d4 000050 4 AX 0 0 4 ++[12] .text PROGBITS 08048330 000330 00018c 0 AX 0 0 16 ++[13] .fini PROGBITS 080484bc 0004bc 00001e 0 AX 0 0 4 ++[14] .rodata PROGBITS 080484dc 0004dc 000008 0 A 0 0 4 ++[15] .data PROGBITS 080494e4 0004e4 000010 0 WA 0 0 4 ++[16] .eh_frame PROGBITS 080494f4 0004f4 000004 0 WA 0 0 4 ++[17] .ctors PROGBITS 080494f8 0004f8 000008 0 WA 0 0 4 ++[18] .dtors PROGBITS 08049500 000500 000008 0 WA 0 0 4 ++[19] .got PROGBITS 08049508 000508 000020 4 WA 0 0 4 ++[20] .dynamic DYNAMIC 08049528 000528 0000a0 8 WA 5 0 4 ++[21] .bss NOBITS 080495c8 0005c8 00001c 0 WA 0 0 4 ++[22] .comment PROGBITS 00000000 0005c8 000170 0 0 0 1 ++[23] .note NOTE 00000000 000738 0000a0 0 0 0 1 ++[24] .symtab SYMTAB 00000000 0007d8 000510 16 25 59 4 ++[25] .strtab STRTAB 00000000 000ce8 000235 0 0 0 1 ++[26] .gnu_debuglink PROGBITS 00000000 000f20 000014 0 0 0 4 ++[27] .shstrtab STRTAB 00000000 000f34 0000d9 0 0 0 1 ++ ++EOF ++echo readelf testfile.debug ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF ++There are 35 section headers, starting at offset 0x3e64: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 00000000 000000 000000 0 0 0 0 ++[ 1] .interp NOBITS 080480f4 0000f4 000013 0 A 0 0 1 ++[ 2] .note.ABI-tag NOTE 08048108 0000f4 000020 0 A 0 0 4 ++[ 3] .hash NOBITS 08048128 000114 000030 4 A 4 0 4 ++[ 4] .dynsym NOBITS 08048158 000114 000070 16 A 5 1 4 ++[ 5] .dynstr NOBITS 080481c8 000114 00008e 0 A 0 0 1 ++[ 6] .gnu.version NOBITS 08048256 000114 00000e 2 A 4 0 2 ++[ 7] .gnu.version_r NOBITS 08048264 000114 000030 0 A 5 1 4 ++[ 8] .rel.got NOBITS 08048294 000114 000008 8 A 4 19 4 ++[ 9] .rel.plt NOBITS 0804829c 000114 000020 8 A 4 11 4 ++[10] .init NOBITS 080482bc 000114 000018 0 AX 0 0 4 ++[11] .plt NOBITS 080482d4 000114 000050 4 AX 0 0 4 ++[12] .text NOBITS 08048330 000120 00018c 0 AX 0 0 16 ++[13] .fini NOBITS 080484bc 000120 00001e 0 AX 0 0 4 ++[14] .rodata NOBITS 080484dc 000120 000008 0 A 0 0 4 ++[15] .data NOBITS 080494e4 000120 000010 0 WA 0 0 4 ++[16] .eh_frame NOBITS 080494f4 000120 000004 0 WA 0 0 4 ++[17] .ctors NOBITS 080494f8 000120 000008 0 WA 0 0 4 ++[18] .dtors NOBITS 08049500 000120 000008 0 WA 0 0 4 ++[19] .got NOBITS 08049508 000120 000020 4 WA 0 0 4 ++[20] .dynamic NOBITS 08049528 000120 0000a0 8 WA 5 0 4 ++[21] .sbss PROGBITS 080495c8 000120 000000 0 W 0 0 1 ++[22] .bss NOBITS 080495c8 000120 00001c 0 WA 0 0 4 ++[23] .stab PROGBITS 00000000 000120 000720 12 24 0 4 ++[24] .stabstr STRTAB 00000000 000840 001934 0 0 0 1 ++[25] .comment NOBITS 00000000 002174 000170 0 0 0 1 ++[26] .debug_aranges PROGBITS 00000000 002174 000060 0 0 0 1 ++[27] .debug_pubnames PROGBITS 00000000 0021d4 000055 0 0 0 1 ++[28] .debug_info PROGBITS 00000000 002229 001678 0 0 0 1 ++[29] .debug_abbrev PROGBITS 00000000 0038a1 0001d2 0 0 0 1 ++[30] .debug_line PROGBITS 00000000 003a73 000223 0 0 0 1 ++[31] .note NOTE 00000000 003c96 0000a0 0 0 0 1 ++[32] .shstrtab STRTAB 00000000 003d36 00012e 0 0 0 1 ++[33] .symtab NOBITS 00000000 003e64 0005a0 16 34 68 4 ++[34] .strtab NOBITS 00000000 003e64 000235 0 0 0 1 ++ ++EOF ++ ++# A random 64bit testfile ++testfiles testfile69.so ++# Explicitly keep .strtab (but not .symtab, so .strtab will be in both). 64bit ++echo strip --keep-section=.strtab testfile69.so ++testrun ${abs_top_builddir}/src/strip --keep-section=.strtab -o testfile.elf -f testfile.debug testfile69.so ++echo elflint testfile.elf ++testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf ++echo elflint testfile.debug ++testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug ++echo readelf testfile.elf ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF ++There are 27 section headers, starting at offset 0xad8: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 ++[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 ++[ 2] .gnu.hash GNU_HASH 00000000000001b8 000001b8 0000003c 0 A 3 0 8 ++[ 3] .dynsym DYNSYM 00000000000001f8 000001f8 00000108 24 A 4 2 8 ++[ 4] .dynstr STRTAB 0000000000000300 00000300 00000077 0 A 0 0 1 ++[ 5] .gnu.version GNU_versym 0000000000000378 00000378 00000016 2 A 3 0 2 ++[ 6] .gnu.version_r GNU_verneed 0000000000000390 00000390 00000020 0 A 4 1 8 ++[ 7] .rela.dyn RELA 00000000000003b0 000003b0 00000060 24 A 3 0 8 ++[ 8] .rela.plt RELA 0000000000000410 00000410 00000018 24 A 3 10 8 ++[ 9] .init PROGBITS 0000000000000428 00000428 00000018 0 AX 0 0 4 ++[10] .plt PROGBITS 0000000000000440 00000440 00000020 16 AX 0 0 16 ++[11] .text PROGBITS 0000000000000460 00000460 00000128 0 AX 0 0 16 ++[12] .fini PROGBITS 0000000000000588 00000588 0000000e 0 AX 0 0 4 ++[13] .eh_frame_hdr PROGBITS 0000000000000598 00000598 00000024 0 A 0 0 4 ++[14] .eh_frame PROGBITS 00000000000005c0 000005c0 00000084 0 A 0 0 8 ++[15] .ctors PROGBITS 0000000000200648 00000648 00000010 0 WA 0 0 8 ++[16] .dtors PROGBITS 0000000000200658 00000658 00000010 0 WA 0 0 8 ++[17] .jcr PROGBITS 0000000000200668 00000668 00000008 0 WA 0 0 8 ++[18] .data.rel.ro PROGBITS 0000000000200670 00000670 00000008 0 WA 0 0 8 ++[19] .dynamic DYNAMIC 0000000000200678 00000678 00000180 16 WA 4 0 8 ++[20] .got PROGBITS 00000000002007f8 000007f8 00000018 8 WA 0 0 8 ++[21] .got.plt PROGBITS 0000000000200810 00000810 00000020 8 WA 0 0 8 ++[22] .bss NOBITS 0000000000200830 00000830 00000010 0 WA 0 0 8 ++[23] .comment PROGBITS 0000000000000000 00000830 0000002c 1 MS 0 0 1 ++[24] .strtab STRTAB 0000000000000000 0000085c 00000175 0 0 0 1 ++[25] .gnu_debuglink PROGBITS 0000000000000000 000009d4 00000014 0 0 0 4 ++[26] .shstrtab STRTAB 0000000000000000 000009e8 000000ee 0 0 0 1 ++ ++EOF ++echo readelf testfile.debug ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF ++There are 27 section headers, starting at offset 0x918: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 ++[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 ++[ 2] .gnu.hash NOBITS 00000000000001b8 000001b8 0000003c 0 A 3 0 8 ++[ 3] .dynsym NOBITS 00000000000001f8 000001b8 00000108 24 A 4 2 8 ++[ 4] .dynstr NOBITS 0000000000000300 000001b8 00000077 0 A 0 0 1 ++[ 5] .gnu.version NOBITS 0000000000000378 000001b8 00000016 2 A 3 0 2 ++[ 6] .gnu.version_r NOBITS 0000000000000390 000001b8 00000020 0 A 4 1 8 ++[ 7] .rela.dyn NOBITS 00000000000003b0 000001b8 00000060 24 A 3 0 8 ++[ 8] .rela.plt NOBITS 0000000000000410 000001b8 00000018 24 A 3 10 8 ++[ 9] .init NOBITS 0000000000000428 000001b8 00000018 0 AX 0 0 4 ++[10] .plt NOBITS 0000000000000440 000001c0 00000020 16 AX 0 0 16 ++[11] .text NOBITS 0000000000000460 000001c0 00000128 0 AX 0 0 16 ++[12] .fini NOBITS 0000000000000588 000001c0 0000000e 0 AX 0 0 4 ++[13] .eh_frame_hdr NOBITS 0000000000000598 000001c0 00000024 0 A 0 0 4 ++[14] .eh_frame NOBITS 00000000000005c0 000001c0 00000084 0 A 0 0 8 ++[15] .ctors NOBITS 0000000000200648 000001c0 00000010 0 WA 0 0 8 ++[16] .dtors NOBITS 0000000000200658 000001c0 00000010 0 WA 0 0 8 ++[17] .jcr NOBITS 0000000000200668 000001c0 00000008 0 WA 0 0 8 ++[18] .data.rel.ro NOBITS 0000000000200670 000001c0 00000008 0 WA 0 0 8 ++[19] .dynamic NOBITS 0000000000200678 000001c0 00000180 16 WA 4 0 8 ++[20] .got NOBITS 00000000002007f8 000001c0 00000018 8 WA 0 0 8 ++[21] .got.plt NOBITS 0000000000200810 000001c0 00000020 8 WA 0 0 8 ++[22] .bss NOBITS 0000000000200830 000001c0 00000010 0 WA 0 0 8 ++[23] .comment NOBITS 0000000000000000 000001c0 0000002c 1 MS 0 0 1 ++[24] .shstrtab STRTAB 0000000000000000 000001c0 000000e7 0 0 0 1 ++[25] .symtab SYMTAB 0000000000000000 000002a8 000004f8 24 26 44 8 ++[26] .strtab STRTAB 0000000000000000 000007a0 00000175 0 0 0 1 ++ ++EOF ++ ++# Explicitly keep .symtab (pulls in .strtab, so they will both be in elf). 64bit ++# Use --remove-comment to make sure testfile.debug isn't empty. ++echo strip --keep-section=.symtab --remove-comment testfile69.so ++testrun ${abs_top_builddir}/src/strip --keep-section=.symtab --remove-comment -o testfile.elf -f testfile.debug testfile69.so ++echo elflint testfile.elf ++testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf ++echo elflint testfile.debug ++testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug ++echo readelf testfile.elf ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF ++There are 27 section headers, starting at offset 0xf90: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 ++[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 ++[ 2] .gnu.hash GNU_HASH 00000000000001b8 000001b8 0000003c 0 A 3 0 8 ++[ 3] .dynsym DYNSYM 00000000000001f8 000001f8 00000108 24 A 4 2 8 ++[ 4] .dynstr STRTAB 0000000000000300 00000300 00000077 0 A 0 0 1 ++[ 5] .gnu.version GNU_versym 0000000000000378 00000378 00000016 2 A 3 0 2 ++[ 6] .gnu.version_r GNU_verneed 0000000000000390 00000390 00000020 0 A 4 1 8 ++[ 7] .rela.dyn RELA 00000000000003b0 000003b0 00000060 24 A 3 0 8 ++[ 8] .rela.plt RELA 0000000000000410 00000410 00000018 24 A 3 10 8 ++[ 9] .init PROGBITS 0000000000000428 00000428 00000018 0 AX 0 0 4 ++[10] .plt PROGBITS 0000000000000440 00000440 00000020 16 AX 0 0 16 ++[11] .text PROGBITS 0000000000000460 00000460 00000128 0 AX 0 0 16 ++[12] .fini PROGBITS 0000000000000588 00000588 0000000e 0 AX 0 0 4 ++[13] .eh_frame_hdr PROGBITS 0000000000000598 00000598 00000024 0 A 0 0 4 ++[14] .eh_frame PROGBITS 00000000000005c0 000005c0 00000084 0 A 0 0 8 ++[15] .ctors PROGBITS 0000000000200648 00000648 00000010 0 WA 0 0 8 ++[16] .dtors PROGBITS 0000000000200658 00000658 00000010 0 WA 0 0 8 ++[17] .jcr PROGBITS 0000000000200668 00000668 00000008 0 WA 0 0 8 ++[18] .data.rel.ro PROGBITS 0000000000200670 00000670 00000008 0 WA 0 0 8 ++[19] .dynamic DYNAMIC 0000000000200678 00000678 00000180 16 WA 4 0 8 ++[20] .got PROGBITS 00000000002007f8 000007f8 00000018 8 WA 0 0 8 ++[21] .got.plt PROGBITS 0000000000200810 00000810 00000020 8 WA 0 0 8 ++[22] .bss NOBITS 0000000000200830 00000830 00000010 0 WA 0 0 8 ++[23] .symtab SYMTAB 0000000000000000 00000830 000004e0 24 24 43 8 ++[24] .strtab STRTAB 0000000000000000 00000d10 00000175 0 0 0 1 ++[25] .gnu_debuglink PROGBITS 0000000000000000 00000e88 00000014 0 0 0 4 ++[26] .shstrtab STRTAB 0000000000000000 00000e9c 000000ed 0 0 0 1 ++ ++EOF ++echo readelf testfile.debug ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF ++There are 27 section headers, starting at offset 0x2d8: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 ++[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 ++[ 2] .gnu.hash NOBITS 00000000000001b8 000001b8 0000003c 0 A 3 0 8 ++[ 3] .dynsym NOBITS 00000000000001f8 000001b8 00000108 24 A 4 2 8 ++[ 4] .dynstr NOBITS 0000000000000300 000001b8 00000077 0 A 0 0 1 ++[ 5] .gnu.version NOBITS 0000000000000378 000001b8 00000016 2 A 3 0 2 ++[ 6] .gnu.version_r NOBITS 0000000000000390 000001b8 00000020 0 A 4 1 8 ++[ 7] .rela.dyn NOBITS 00000000000003b0 000001b8 00000060 24 A 3 0 8 ++[ 8] .rela.plt NOBITS 0000000000000410 000001b8 00000018 24 A 3 10 8 ++[ 9] .init NOBITS 0000000000000428 000001b8 00000018 0 AX 0 0 4 ++[10] .plt NOBITS 0000000000000440 000001c0 00000020 16 AX 0 0 16 ++[11] .text NOBITS 0000000000000460 000001c0 00000128 0 AX 0 0 16 ++[12] .fini NOBITS 0000000000000588 000001c0 0000000e 0 AX 0 0 4 ++[13] .eh_frame_hdr NOBITS 0000000000000598 000001c0 00000024 0 A 0 0 4 ++[14] .eh_frame NOBITS 00000000000005c0 000001c0 00000084 0 A 0 0 8 ++[15] .ctors NOBITS 0000000000200648 000001c0 00000010 0 WA 0 0 8 ++[16] .dtors NOBITS 0000000000200658 000001c0 00000010 0 WA 0 0 8 ++[17] .jcr NOBITS 0000000000200668 000001c0 00000008 0 WA 0 0 8 ++[18] .data.rel.ro NOBITS 0000000000200670 000001c0 00000008 0 WA 0 0 8 ++[19] .dynamic NOBITS 0000000000200678 000001c0 00000180 16 WA 4 0 8 ++[20] .got NOBITS 00000000002007f8 000001c0 00000018 8 WA 0 0 8 ++[21] .got.plt NOBITS 0000000000200810 000001c0 00000020 8 WA 0 0 8 ++[22] .bss NOBITS 0000000000200830 000001c0 00000010 0 WA 0 0 8 ++[23] .comment PROGBITS 0000000000000000 000001c0 0000002c 1 MS 0 0 1 ++[24] .shstrtab STRTAB 0000000000000000 000001ec 000000e7 0 0 0 1 ++[25] .symtab NOBITS 0000000000000000 000002d8 000004f8 24 26 44 8 ++[26] .strtab NOBITS 0000000000000000 000002d8 00000175 0 0 0 1 ++ ++EOF ++ ++# Explicitly remove .symtab (but not .strtab, so it will be in both). 32bit ++echo strip -g --remove-section=.symtab testfile ++testrun ${abs_top_builddir}/src/strip -g --remove-section=.symtab -o testfile.elf -f testfile.debug testfile ++echo elflint testfile.elf ++testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf ++echo elflint testfile.debug ++testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug ++echo readelf testfile.elf ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF ++There are 28 section headers, starting at offset 0xafc: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 00000000 000000 000000 0 0 0 0 ++[ 1] .interp PROGBITS 080480f4 0000f4 000013 0 A 0 0 1 ++[ 2] .note.ABI-tag NOTE 08048108 000108 000020 0 A 0 0 4 ++[ 3] .hash HASH 08048128 000128 000030 4 A 4 0 4 ++[ 4] .dynsym DYNSYM 08048158 000158 000070 16 A 5 1 4 ++[ 5] .dynstr STRTAB 080481c8 0001c8 00008e 0 A 0 0 1 ++[ 6] .gnu.version GNU_versym 08048256 000256 00000e 2 A 4 0 2 ++[ 7] .gnu.version_r GNU_verneed 08048264 000264 000030 0 A 5 1 4 ++[ 8] .rel.got REL 08048294 000294 000008 8 A 4 19 4 ++[ 9] .rel.plt REL 0804829c 00029c 000020 8 A 4 11 4 ++[10] .init PROGBITS 080482bc 0002bc 000018 0 AX 0 0 4 ++[11] .plt PROGBITS 080482d4 0002d4 000050 4 AX 0 0 4 ++[12] .text PROGBITS 08048330 000330 00018c 0 AX 0 0 16 ++[13] .fini PROGBITS 080484bc 0004bc 00001e 0 AX 0 0 4 ++[14] .rodata PROGBITS 080484dc 0004dc 000008 0 A 0 0 4 ++[15] .data PROGBITS 080494e4 0004e4 000010 0 WA 0 0 4 ++[16] .eh_frame PROGBITS 080494f4 0004f4 000004 0 WA 0 0 4 ++[17] .ctors PROGBITS 080494f8 0004f8 000008 0 WA 0 0 4 ++[18] .dtors PROGBITS 08049500 000500 000008 0 WA 0 0 4 ++[19] .got PROGBITS 08049508 000508 000020 4 WA 0 0 4 ++[20] .dynamic DYNAMIC 08049528 000528 0000a0 8 WA 5 0 4 ++[21] .sbss PROGBITS 080495c8 0005c8 000000 0 W 0 0 1 ++[22] .bss NOBITS 080495c8 0005c8 00001c 0 WA 0 0 4 ++[23] .comment PROGBITS 00000000 0005c8 000170 0 0 0 1 ++[24] .note NOTE 00000000 000738 0000a0 0 0 0 1 ++[25] .strtab STRTAB 00000000 0007d8 000235 0 0 0 1 ++[26] .gnu_debuglink PROGBITS 00000000 000a10 000014 0 0 0 4 ++[27] .shstrtab STRTAB 00000000 000a24 0000d7 0 0 0 1 ++ ++EOF ++echo readelf testfile.debug ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF ++There are 35 section headers, starting at offset 0x463c: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 00000000 000000 000000 0 0 0 0 ++[ 1] .interp NOBITS 080480f4 0000f4 000013 0 A 0 0 1 ++[ 2] .note.ABI-tag NOTE 08048108 0000f4 000020 0 A 0 0 4 ++[ 3] .hash NOBITS 08048128 000114 000030 4 A 4 0 4 ++[ 4] .dynsym NOBITS 08048158 000114 000070 16 A 5 1 4 ++[ 5] .dynstr NOBITS 080481c8 000114 00008e 0 A 0 0 1 ++[ 6] .gnu.version NOBITS 08048256 000114 00000e 2 A 4 0 2 ++[ 7] .gnu.version_r NOBITS 08048264 000114 000030 0 A 5 1 4 ++[ 8] .rel.got NOBITS 08048294 000114 000008 8 A 4 19 4 ++[ 9] .rel.plt NOBITS 0804829c 000114 000020 8 A 4 11 4 ++[10] .init NOBITS 080482bc 000114 000018 0 AX 0 0 4 ++[11] .plt NOBITS 080482d4 000114 000050 4 AX 0 0 4 ++[12] .text NOBITS 08048330 000120 00018c 0 AX 0 0 16 ++[13] .fini NOBITS 080484bc 000120 00001e 0 AX 0 0 4 ++[14] .rodata NOBITS 080484dc 000120 000008 0 A 0 0 4 ++[15] .data NOBITS 080494e4 000120 000010 0 WA 0 0 4 ++[16] .eh_frame NOBITS 080494f4 000120 000004 0 WA 0 0 4 ++[17] .ctors NOBITS 080494f8 000120 000008 0 WA 0 0 4 ++[18] .dtors NOBITS 08049500 000120 000008 0 WA 0 0 4 ++[19] .got NOBITS 08049508 000120 000020 4 WA 0 0 4 ++[20] .dynamic NOBITS 08049528 000120 0000a0 8 WA 5 0 4 ++[21] .sbss NOBITS 080495c8 000120 000000 0 W 0 0 1 ++[22] .bss NOBITS 080495c8 000120 00001c 0 WA 0 0 4 ++[23] .stab PROGBITS 00000000 000120 000720 12 24 0 4 ++[24] .stabstr STRTAB 00000000 000840 001934 0 0 0 1 ++[25] .comment NOBITS 00000000 002174 000170 0 0 0 1 ++[26] .debug_aranges PROGBITS 00000000 002174 000060 0 0 0 1 ++[27] .debug_pubnames PROGBITS 00000000 0021d4 000055 0 0 0 1 ++[28] .debug_info PROGBITS 00000000 002229 001678 0 0 0 1 ++[29] .debug_abbrev PROGBITS 00000000 0038a1 0001d2 0 0 0 1 ++[30] .debug_line PROGBITS 00000000 003a73 000223 0 0 0 1 ++[31] .note NOTE 00000000 003c96 0000a0 0 0 0 1 ++[32] .shstrtab STRTAB 00000000 003d36 00012e 0 0 0 1 ++[33] .symtab SYMTAB 00000000 003e64 0005a0 16 34 68 4 ++[34] .strtab STRTAB 00000000 004404 000235 0 0 0 1 ++ ++EOF ++ ++# Explicitly remove both .symtab and .strtab. Keep .stab and .stabstr 32bit ++echo strip -g --remove-section=".s[yt][mr]tab" --keep-section=".stab*" testfile ++testrun ${abs_top_builddir}/src/strip -g --remove-section=".s[yt][mr]tab" --keep-section=".stab*" -o testfile.elf -f testfile.debug testfile ++echo elflint testfile.elf ++testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf ++echo elflint testfile.debug ++testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug ++echo readelf testfile.elf ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF ++There are 29 section headers, starting at offset 0x2920: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 00000000 000000 000000 0 0 0 0 ++[ 1] .interp PROGBITS 080480f4 0000f4 000013 0 A 0 0 1 ++[ 2] .note.ABI-tag NOTE 08048108 000108 000020 0 A 0 0 4 ++[ 3] .hash HASH 08048128 000128 000030 4 A 4 0 4 ++[ 4] .dynsym DYNSYM 08048158 000158 000070 16 A 5 1 4 ++[ 5] .dynstr STRTAB 080481c8 0001c8 00008e 0 A 0 0 1 ++[ 6] .gnu.version GNU_versym 08048256 000256 00000e 2 A 4 0 2 ++[ 7] .gnu.version_r GNU_verneed 08048264 000264 000030 0 A 5 1 4 ++[ 8] .rel.got REL 08048294 000294 000008 8 A 4 19 4 ++[ 9] .rel.plt REL 0804829c 00029c 000020 8 A 4 11 4 ++[10] .init PROGBITS 080482bc 0002bc 000018 0 AX 0 0 4 ++[11] .plt PROGBITS 080482d4 0002d4 000050 4 AX 0 0 4 ++[12] .text PROGBITS 08048330 000330 00018c 0 AX 0 0 16 ++[13] .fini PROGBITS 080484bc 0004bc 00001e 0 AX 0 0 4 ++[14] .rodata PROGBITS 080484dc 0004dc 000008 0 A 0 0 4 ++[15] .data PROGBITS 080494e4 0004e4 000010 0 WA 0 0 4 ++[16] .eh_frame PROGBITS 080494f4 0004f4 000004 0 WA 0 0 4 ++[17] .ctors PROGBITS 080494f8 0004f8 000008 0 WA 0 0 4 ++[18] .dtors PROGBITS 08049500 000500 000008 0 WA 0 0 4 ++[19] .got PROGBITS 08049508 000508 000020 4 WA 0 0 4 ++[20] .dynamic DYNAMIC 08049528 000528 0000a0 8 WA 5 0 4 ++[21] .sbss PROGBITS 080495c8 0005c8 000000 0 W 0 0 1 ++[22] .bss NOBITS 080495c8 0005c8 00001c 0 WA 0 0 4 ++[23] .stab PROGBITS 00000000 0005c8 000720 12 24 0 4 ++[24] .stabstr STRTAB 00000000 000ce8 001934 0 0 0 1 ++[25] .comment PROGBITS 00000000 00261c 000170 0 0 0 1 ++[26] .note NOTE 00000000 00278c 0000a0 0 0 0 1 ++[27] .gnu_debuglink PROGBITS 00000000 00282c 000014 0 0 0 4 ++[28] .shstrtab STRTAB 00000000 002840 0000de 0 0 0 1 ++ ++EOF ++echo readelf testfile.debug ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF ++There are 35 section headers, starting at offset 0x25e8: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 00000000 000000 000000 0 0 0 0 ++[ 1] .interp NOBITS 080480f4 0000f4 000013 0 A 0 0 1 ++[ 2] .note.ABI-tag NOTE 08048108 0000f4 000020 0 A 0 0 4 ++[ 3] .hash NOBITS 08048128 000114 000030 4 A 4 0 4 ++[ 4] .dynsym NOBITS 08048158 000114 000070 16 A 5 1 4 ++[ 5] .dynstr NOBITS 080481c8 000114 00008e 0 A 0 0 1 ++[ 6] .gnu.version NOBITS 08048256 000114 00000e 2 A 4 0 2 ++[ 7] .gnu.version_r NOBITS 08048264 000114 000030 0 A 5 1 4 ++[ 8] .rel.got NOBITS 08048294 000114 000008 8 A 4 19 4 ++[ 9] .rel.plt NOBITS 0804829c 000114 000020 8 A 4 11 4 ++[10] .init NOBITS 080482bc 000114 000018 0 AX 0 0 4 ++[11] .plt NOBITS 080482d4 000114 000050 4 AX 0 0 4 ++[12] .text NOBITS 08048330 000120 00018c 0 AX 0 0 16 ++[13] .fini NOBITS 080484bc 000120 00001e 0 AX 0 0 4 ++[14] .rodata NOBITS 080484dc 000120 000008 0 A 0 0 4 ++[15] .data NOBITS 080494e4 000120 000010 0 WA 0 0 4 ++[16] .eh_frame NOBITS 080494f4 000120 000004 0 WA 0 0 4 ++[17] .ctors NOBITS 080494f8 000120 000008 0 WA 0 0 4 ++[18] .dtors NOBITS 08049500 000120 000008 0 WA 0 0 4 ++[19] .got NOBITS 08049508 000120 000020 4 WA 0 0 4 ++[20] .dynamic NOBITS 08049528 000120 0000a0 8 WA 5 0 4 ++[21] .sbss NOBITS 080495c8 000120 000000 0 W 0 0 1 ++[22] .bss NOBITS 080495c8 000120 00001c 0 WA 0 0 4 ++[23] .stab NOBITS 00000000 000120 000720 12 24 0 4 ++[24] .stabstr NOBITS 00000000 000120 001934 0 0 0 1 ++[25] .comment NOBITS 00000000 000120 000170 0 0 0 1 ++[26] .debug_aranges PROGBITS 00000000 000120 000060 0 0 0 1 ++[27] .debug_pubnames PROGBITS 00000000 000180 000055 0 0 0 1 ++[28] .debug_info PROGBITS 00000000 0001d5 001678 0 0 0 1 ++[29] .debug_abbrev PROGBITS 00000000 00184d 0001d2 0 0 0 1 ++[30] .debug_line PROGBITS 00000000 001a1f 000223 0 0 0 1 ++[31] .note NOTE 00000000 001c42 0000a0 0 0 0 1 ++[32] .shstrtab STRTAB 00000000 001ce2 00012e 0 0 0 1 ++[33] .symtab SYMTAB 00000000 001e10 0005a0 16 34 68 4 ++[34] .strtab STRTAB 00000000 0023b0 000235 0 0 0 1 ++ ++EOF ++ ++# Explicitly remove .symtab (but not .strtab, so it will be in both). 64bit ++echo strip -g --remove-section=.symtab testfile69.so ++testrun ${abs_top_builddir}/src/strip -g --remove-section=.symtab -o testfile.elf -f testfile.debug testfile69.so ++echo elflint testfile.elf ++testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf ++echo elflint testfile.debug ++testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug ++echo readelf testfile.elf ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF ++There are 27 section headers, starting at offset 0xad8: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 ++[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 ++[ 2] .gnu.hash GNU_HASH 00000000000001b8 000001b8 0000003c 0 A 3 0 8 ++[ 3] .dynsym DYNSYM 00000000000001f8 000001f8 00000108 24 A 4 2 8 ++[ 4] .dynstr STRTAB 0000000000000300 00000300 00000077 0 A 0 0 1 ++[ 5] .gnu.version GNU_versym 0000000000000378 00000378 00000016 2 A 3 0 2 ++[ 6] .gnu.version_r GNU_verneed 0000000000000390 00000390 00000020 0 A 4 1 8 ++[ 7] .rela.dyn RELA 00000000000003b0 000003b0 00000060 24 A 3 0 8 ++[ 8] .rela.plt RELA 0000000000000410 00000410 00000018 24 A 3 10 8 ++[ 9] .init PROGBITS 0000000000000428 00000428 00000018 0 AX 0 0 4 ++[10] .plt PROGBITS 0000000000000440 00000440 00000020 16 AX 0 0 16 ++[11] .text PROGBITS 0000000000000460 00000460 00000128 0 AX 0 0 16 ++[12] .fini PROGBITS 0000000000000588 00000588 0000000e 0 AX 0 0 4 ++[13] .eh_frame_hdr PROGBITS 0000000000000598 00000598 00000024 0 A 0 0 4 ++[14] .eh_frame PROGBITS 00000000000005c0 000005c0 00000084 0 A 0 0 8 ++[15] .ctors PROGBITS 0000000000200648 00000648 00000010 0 WA 0 0 8 ++[16] .dtors PROGBITS 0000000000200658 00000658 00000010 0 WA 0 0 8 ++[17] .jcr PROGBITS 0000000000200668 00000668 00000008 0 WA 0 0 8 ++[18] .data.rel.ro PROGBITS 0000000000200670 00000670 00000008 0 WA 0 0 8 ++[19] .dynamic DYNAMIC 0000000000200678 00000678 00000180 16 WA 4 0 8 ++[20] .got PROGBITS 00000000002007f8 000007f8 00000018 8 WA 0 0 8 ++[21] .got.plt PROGBITS 0000000000200810 00000810 00000020 8 WA 0 0 8 ++[22] .bss NOBITS 0000000000200830 00000830 00000010 0 WA 0 0 8 ++[23] .comment PROGBITS 0000000000000000 00000830 0000002c 1 MS 0 0 1 ++[24] .strtab STRTAB 0000000000000000 0000085c 00000175 0 0 0 1 ++[25] .gnu_debuglink PROGBITS 0000000000000000 000009d4 00000014 0 0 0 4 ++[26] .shstrtab STRTAB 0000000000000000 000009e8 000000ee 0 0 0 1 ++ ++EOF ++echo readelf testfile.debug ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF ++There are 27 section headers, starting at offset 0x918: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 ++[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 ++[ 2] .gnu.hash NOBITS 00000000000001b8 000001b8 0000003c 0 A 3 0 8 ++[ 3] .dynsym NOBITS 00000000000001f8 000001b8 00000108 24 A 4 2 8 ++[ 4] .dynstr NOBITS 0000000000000300 000001b8 00000077 0 A 0 0 1 ++[ 5] .gnu.version NOBITS 0000000000000378 000001b8 00000016 2 A 3 0 2 ++[ 6] .gnu.version_r NOBITS 0000000000000390 000001b8 00000020 0 A 4 1 8 ++[ 7] .rela.dyn NOBITS 00000000000003b0 000001b8 00000060 24 A 3 0 8 ++[ 8] .rela.plt NOBITS 0000000000000410 000001b8 00000018 24 A 3 10 8 ++[ 9] .init NOBITS 0000000000000428 000001b8 00000018 0 AX 0 0 4 ++[10] .plt NOBITS 0000000000000440 000001c0 00000020 16 AX 0 0 16 ++[11] .text NOBITS 0000000000000460 000001c0 00000128 0 AX 0 0 16 ++[12] .fini NOBITS 0000000000000588 000001c0 0000000e 0 AX 0 0 4 ++[13] .eh_frame_hdr NOBITS 0000000000000598 000001c0 00000024 0 A 0 0 4 ++[14] .eh_frame NOBITS 00000000000005c0 000001c0 00000084 0 A 0 0 8 ++[15] .ctors NOBITS 0000000000200648 000001c0 00000010 0 WA 0 0 8 ++[16] .dtors NOBITS 0000000000200658 000001c0 00000010 0 WA 0 0 8 ++[17] .jcr NOBITS 0000000000200668 000001c0 00000008 0 WA 0 0 8 ++[18] .data.rel.ro NOBITS 0000000000200670 000001c0 00000008 0 WA 0 0 8 ++[19] .dynamic NOBITS 0000000000200678 000001c0 00000180 16 WA 4 0 8 ++[20] .got NOBITS 00000000002007f8 000001c0 00000018 8 WA 0 0 8 ++[21] .got.plt NOBITS 0000000000200810 000001c0 00000020 8 WA 0 0 8 ++[22] .bss NOBITS 0000000000200830 000001c0 00000010 0 WA 0 0 8 ++[23] .comment NOBITS 0000000000000000 000001c0 0000002c 1 MS 0 0 1 ++[24] .shstrtab STRTAB 0000000000000000 000001c0 000000e7 0 0 0 1 ++[25] .symtab SYMTAB 0000000000000000 000002a8 000004f8 24 26 44 8 ++[26] .strtab STRTAB 0000000000000000 000007a0 00000175 0 0 0 1 ++ ++EOF ++ ++# Explicitly remove both .symtab and .strtab. Keep .comment section. 64bit ++echo strip -g --remove-section=".s[yt][mr]tab" --keep-section=.comment testfile69.so ++testrun ${abs_top_builddir}/src/strip -g --remove-section=".s[yt][mr]tab" --keep-section=.comment -o testfile.elf -f testfile.debug testfile69.so ++echo elflint testfile.elf ++testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf ++echo elflint testfile.debug ++testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug ++echo readelf testfile.elf ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF ++There are 26 section headers, starting at offset 0x958: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 ++[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 ++[ 2] .gnu.hash GNU_HASH 00000000000001b8 000001b8 0000003c 0 A 3 0 8 ++[ 3] .dynsym DYNSYM 00000000000001f8 000001f8 00000108 24 A 4 2 8 ++[ 4] .dynstr STRTAB 0000000000000300 00000300 00000077 0 A 0 0 1 ++[ 5] .gnu.version GNU_versym 0000000000000378 00000378 00000016 2 A 3 0 2 ++[ 6] .gnu.version_r GNU_verneed 0000000000000390 00000390 00000020 0 A 4 1 8 ++[ 7] .rela.dyn RELA 00000000000003b0 000003b0 00000060 24 A 3 0 8 ++[ 8] .rela.plt RELA 0000000000000410 00000410 00000018 24 A 3 10 8 ++[ 9] .init PROGBITS 0000000000000428 00000428 00000018 0 AX 0 0 4 ++[10] .plt PROGBITS 0000000000000440 00000440 00000020 16 AX 0 0 16 ++[11] .text PROGBITS 0000000000000460 00000460 00000128 0 AX 0 0 16 ++[12] .fini PROGBITS 0000000000000588 00000588 0000000e 0 AX 0 0 4 ++[13] .eh_frame_hdr PROGBITS 0000000000000598 00000598 00000024 0 A 0 0 4 ++[14] .eh_frame PROGBITS 00000000000005c0 000005c0 00000084 0 A 0 0 8 ++[15] .ctors PROGBITS 0000000000200648 00000648 00000010 0 WA 0 0 8 ++[16] .dtors PROGBITS 0000000000200658 00000658 00000010 0 WA 0 0 8 ++[17] .jcr PROGBITS 0000000000200668 00000668 00000008 0 WA 0 0 8 ++[18] .data.rel.ro PROGBITS 0000000000200670 00000670 00000008 0 WA 0 0 8 ++[19] .dynamic DYNAMIC 0000000000200678 00000678 00000180 16 WA 4 0 8 ++[20] .got PROGBITS 00000000002007f8 000007f8 00000018 8 WA 0 0 8 ++[21] .got.plt PROGBITS 0000000000200810 00000810 00000020 8 WA 0 0 8 ++[22] .bss NOBITS 0000000000200830 00000830 00000010 0 WA 0 0 8 ++[23] .comment PROGBITS 0000000000000000 00000830 0000002c 1 MS 0 0 1 ++[24] .gnu_debuglink PROGBITS 0000000000000000 0000085c 00000014 0 0 0 4 ++[25] .shstrtab STRTAB 0000000000000000 00000870 000000e6 0 0 0 1 ++ ++EOF ++echo readelf testfile.debug ++testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF ++There are 27 section headers, starting at offset 0x918: ++ ++Section Headers: ++[Nr] Name Type Addr Off Size ES Flags Lk Inf Al ++[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 ++[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 ++[ 2] .gnu.hash NOBITS 00000000000001b8 000001b8 0000003c 0 A 3 0 8 ++[ 3] .dynsym NOBITS 00000000000001f8 000001b8 00000108 24 A 4 2 8 ++[ 4] .dynstr NOBITS 0000000000000300 000001b8 00000077 0 A 0 0 1 ++[ 5] .gnu.version NOBITS 0000000000000378 000001b8 00000016 2 A 3 0 2 ++[ 6] .gnu.version_r NOBITS 0000000000000390 000001b8 00000020 0 A 4 1 8 ++[ 7] .rela.dyn NOBITS 00000000000003b0 000001b8 00000060 24 A 3 0 8 ++[ 8] .rela.plt NOBITS 0000000000000410 000001b8 00000018 24 A 3 10 8 ++[ 9] .init NOBITS 0000000000000428 000001b8 00000018 0 AX 0 0 4 ++[10] .plt NOBITS 0000000000000440 000001c0 00000020 16 AX 0 0 16 ++[11] .text NOBITS 0000000000000460 000001c0 00000128 0 AX 0 0 16 ++[12] .fini NOBITS 0000000000000588 000001c0 0000000e 0 AX 0 0 4 ++[13] .eh_frame_hdr NOBITS 0000000000000598 000001c0 00000024 0 A 0 0 4 ++[14] .eh_frame NOBITS 00000000000005c0 000001c0 00000084 0 A 0 0 8 ++[15] .ctors NOBITS 0000000000200648 000001c0 00000010 0 WA 0 0 8 ++[16] .dtors NOBITS 0000000000200658 000001c0 00000010 0 WA 0 0 8 ++[17] .jcr NOBITS 0000000000200668 000001c0 00000008 0 WA 0 0 8 ++[18] .data.rel.ro NOBITS 0000000000200670 000001c0 00000008 0 WA 0 0 8 ++[19] .dynamic NOBITS 0000000000200678 000001c0 00000180 16 WA 4 0 8 ++[20] .got NOBITS 00000000002007f8 000001c0 00000018 8 WA 0 0 8 ++[21] .got.plt NOBITS 0000000000200810 000001c0 00000020 8 WA 0 0 8 ++[22] .bss NOBITS 0000000000200830 000001c0 00000010 0 WA 0 0 8 ++[23] .comment NOBITS 0000000000000000 000001c0 0000002c 1 MS 0 0 1 ++[24] .shstrtab STRTAB 0000000000000000 000001c0 000000e7 0 0 0 1 ++[25] .symtab SYMTAB 0000000000000000 000002a8 000004f8 24 26 44 8 ++[26] .strtab STRTAB 0000000000000000 000007a0 00000175 0 0 0 1 ++ ++EOF ++ ++exit 0 +diff -ur elfutils-0.169.orig/tests/Makefile.in elfutils-0.169/tests/Makefile.in +--- elfutils-0.169.orig/tests/Makefile.in 2017-07-17 11:25:44.681190429 +0200 ++++ elfutils-0.169/tests/Makefile.in 2017-07-17 11:25:56.177935408 +0200 +@@ -140,16 +140,16 @@ + run-strip-test7.sh run-strip-test8.sh run-strip-test9.sh \ + run-strip-test10.sh run-strip-test11.sh run-strip-nothing.sh \ + run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ +- run-strip-nobitsalign.sh run-unstrip-test.sh \ +- run-unstrip-test2.sh run-unstrip-test3.sh run-unstrip-test4.sh \ +- run-unstrip-M.sh run-elfstrmerge-test.sh run-ecp-test.sh \ +- run-ecp-test2.sh run-alldts.sh run-elflint-test.sh \ +- run-elflint-self.sh run-ranlib-test.sh run-ranlib-test2.sh \ +- run-ranlib-test3.sh run-ranlib-test4.sh run-addrscopes.sh \ +- run-strings-test.sh run-funcscopes.sh run-find-prologues.sh \ +- run-allregs.sh run-addrcfi.sh run-nm-self.sh \ +- run-readelf-self.sh run-readelf-test1.sh run-readelf-test2.sh \ +- run-readelf-test3.sh run-readelf-test4.sh \ ++ run-strip-nobitsalign.sh run-strip-remove-keep.sh \ ++ run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-test3.sh \ ++ run-unstrip-test4.sh run-unstrip-M.sh run-elfstrmerge-test.sh \ ++ run-ecp-test.sh run-ecp-test2.sh run-alldts.sh \ ++ run-elflint-test.sh run-elflint-self.sh run-ranlib-test.sh \ ++ run-ranlib-test2.sh run-ranlib-test3.sh run-ranlib-test4.sh \ ++ run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \ ++ run-find-prologues.sh run-allregs.sh run-addrcfi.sh \ ++ run-nm-self.sh run-readelf-self.sh run-readelf-test1.sh \ ++ run-readelf-test2.sh run-readelf-test3.sh run-readelf-test4.sh \ + run-readelf-twofiles.sh run-readelf-macro.sh \ + run-readelf-loc.sh run-readelf-aranges.sh run-readelf-line.sh \ + run-readelf-z.sh run-native-test.sh run-bug1-test.sh \ +@@ -1046,7 +1046,7 @@ + run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ + run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ + run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ +- run-strip-nothing.sh \ ++ run-strip-nothing.sh run-strip-remove-keep.sh \ + run-strip-strmerge.sh run-strip-nobitsalign.sh \ + testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ + run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ +@@ -2368,6 +2368,13 @@ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ ++ "$$tst" $(AM_TESTS_FD_REDIRECT) ++run-strip-remove-keep.sh.log: run-strip-remove-keep.sh ++ @p='run-strip-remove-keep.sh'; \ ++ b='run-strip-remove-keep.sh'; \ ++ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ ++ --log-file $$b.log --trs-file $$b.trs \ ++ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) + run-unstrip-test.sh.log: run-unstrip-test.sh + @p='run-unstrip-test.sh'; \ diff --git a/elfutils.spec b/elfutils.spec index 2e43004..caca5ac 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.169 -%global baserelease 3 +%global baserelease 4 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -25,6 +25,7 @@ Source1: backtrace.ppc64le.fp.exec.bz2 Source2: backtrace.ppc64le.fp.core.bz2 Patch2: elfutils-0.169-dup-shstrtab.patch Patch3: elfutils-0.169-strip-empty.patch +Patch4: elfutils-0.169-strip-keep-remove-section.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -179,6 +180,7 @@ profiling) of processes. cp %SOURCE1 %SOURCE2 tests/ %patch2 -p1 -b .shstrtab_dup %patch3 -p1 -b .strip_empty +%patch4 -p1 -b .strip_keep_remove find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -309,6 +311,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Mon Jul 17 2017 Mark Wielaard - 0.169-4 +- Add elfutils-0.169-strip-keep-remove-section.patch (#1465997) + * Wed Jun 7 2017 Mark Wielaard - 0.169-3 - Add elfutils-0.169-dup-shstrtab.patch - Add elfutils-0.169-strip-empty.patch From 4293512848f4ac4d2722aa460fae5494d6bbdc57 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 17 Jul 2017 17:32:42 +0200 Subject: [PATCH 036/216] 0.169-5 - Fix build on s390 (ptrace.h). --- elfutils-0.169-s390x-ptrace.patch | 27 +++++++++++++++++++++++++++ elfutils.spec | 7 ++++++- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.169-s390x-ptrace.patch diff --git a/elfutils-0.169-s390x-ptrace.patch b/elfutils-0.169-s390x-ptrace.patch new file mode 100644 index 0000000..86e51e8 --- /dev/null +++ b/elfutils-0.169-s390x-ptrace.patch @@ -0,0 +1,27 @@ +commit 1dd301b7c302b9df980946e2d04ca99748754991 +Author: Mark Wielaard +Date: Mon Jul 17 17:26:25 2017 +0200 + + backends: Swap sys/ptrace.h and asm/ptrace.h include order on s390. + + glibc 2.26 changed the sys/ptrace.h header so that it cannot be included + after asm/ptrace.h. We still need to include the kernel asm/ptrace.h for + the ptrace_area definition. Including it after sys/ptrace.h works against + both old and new glibc. + + Signed-off-by: Mark Wielaard + +diff --git a/backends/s390_initreg.c b/backends/s390_initreg.c +index 011305c..23bf8ed 100644 +--- a/backends/s390_initreg.c ++++ b/backends/s390_initreg.c +@@ -34,8 +34,8 @@ + #include + #if defined(__s390__) && defined(__linux__) + # include +-# include + # include ++# include + #endif + + #define BACKEND s390_ diff --git a/elfutils.spec b/elfutils.spec index caca5ac..e7370df 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.169 -%global baserelease 4 +%global baserelease 5 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -26,6 +26,7 @@ Source2: backtrace.ppc64le.fp.core.bz2 Patch2: elfutils-0.169-dup-shstrtab.patch Patch3: elfutils-0.169-strip-empty.patch Patch4: elfutils-0.169-strip-keep-remove-section.patch +Patch5: elfutils-0.169-s390x-ptrace.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -181,6 +182,7 @@ cp %SOURCE1 %SOURCE2 tests/ %patch2 -p1 -b .shstrtab_dup %patch3 -p1 -b .strip_empty %patch4 -p1 -b .strip_keep_remove +%patch5 -p1 -b .s390_ptrace find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -311,6 +313,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Mon Jul 17 2017 Mark Wielaard - 0.169-5 +- Fix build on s390 (ptrace.h). Add elfutils-0.169-s390x-ptrace.patch. + * Mon Jul 17 2017 Mark Wielaard - 0.169-4 - Add elfutils-0.169-strip-keep-remove-section.patch (#1465997) From 057e02726d9ba3ef79612645fa1398c87981de7a Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 21 Jul 2017 12:55:19 +0200 Subject: [PATCH 037/216] 0.169-6 - Add elfutils-0.169-strip-data-marker-symbols.patch. --- ...tils-0.169-strip-data-marker-symbols.patch | 553 ++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 559 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.169-strip-data-marker-symbols.patch diff --git a/elfutils-0.169-strip-data-marker-symbols.patch b/elfutils-0.169-strip-data-marker-symbols.patch new file mode 100644 index 0000000..37cede8 --- /dev/null +++ b/elfutils-0.169-strip-data-marker-symbols.patch @@ -0,0 +1,553 @@ +commit 17bfd57dd13f81b8ed5d1ee5109355bc377cf76c +Author: Mark Wielaard +Date: Thu Jul 20 22:34:29 2017 +0200 + + strip: Deal with ARM data marker symbols pointing to debug sections. + + ARM data marker symbols "$d" indicate the start of a sequence of data + items in a section. For data only sections no data marker symbol is + necessary, but may be put pointing to the start of the section. + binutils however has a bug which places a data marker symbol somewhere + inside the section (at least for .debug_frame). + https://sourceware.org/bugzilla/show_bug.cgi?id=21809 + + When strip finds a symbol pointing to a debug section that would be + put into the .debug file then it will copy over the whole symbol table. + This isn't necessary because the symbol is redundant. + + Add an ebl hook to recognize data marker symbols with implementations + for arm and aarch64. Use it in strip to strip such symbols from the + symbol table if they point to a debug section. + + Signed-off-by: Mark Wielaard + +diff --git a/backends/aarch64_init.c b/backends/aarch64_init.c +index 0866494..fad923f 100644 +--- a/backends/aarch64_init.c ++++ b/backends/aarch64_init.c +@@ -1,5 +1,5 @@ + /* Initialization of AArch64 specific backend library. +- Copyright (C) 2013 Red Hat, Inc. ++ Copyright (C) 2013, 2017 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -56,6 +56,7 @@ aarch64_init (Elf *elf __attribute__ ((unused)), + HOOK (eh, reloc_simple_type); + HOOK (eh, return_value_location); + HOOK (eh, check_special_symbol); ++ HOOK (eh, data_marker_symbol); + HOOK (eh, abi_cfi); + + /* X0-X30 (31 regs) + SP + 1 Reserved + ELR, 30 Reserved regs (34-43) +diff --git a/backends/aarch64_symbol.c b/backends/aarch64_symbol.c +index 76999e4..da3382e 100644 +--- a/backends/aarch64_symbol.c ++++ b/backends/aarch64_symbol.c +@@ -1,5 +1,5 @@ + /* AArch64 specific symbolic name handling. +- Copyright (C) 2013, 2015 Red Hat, Inc. ++ Copyright (C) 2013, 2015, 2017 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -90,3 +90,15 @@ aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym, + + return false; + } ++ ++/* A data mapping symbol is a symbol with "$d" name or "$d." name, ++ STT_NOTYPE, STB_LOCAL and st_size of zero. The indicate the stat of a ++ sequence of data items. */ ++bool ++aarch64_data_marker_symbol (const GElf_Sym *sym, const char *sname) ++{ ++ return (sym != NULL && sname != NULL ++ && sym->st_size == 0 && GELF_ST_BIND (sym->st_info) == STB_LOCAL ++ && GELF_ST_TYPE (sym->st_info) == STT_NOTYPE ++ && (strcmp (sname, "$d") == 0 || strncmp (sname, "$d.", 3) == 0)); ++} +diff --git a/backends/arm_init.c b/backends/arm_init.c +index caadac6..f2b1b11 100644 +--- a/backends/arm_init.c ++++ b/backends/arm_init.c +@@ -1,5 +1,5 @@ + /* Initialization of Arm specific backend library. +- Copyright (C) 2002, 2005, 2009, 2013, 2014, 2015 Red Hat, Inc. ++ Copyright (C) 2002, 2005, 2009, 2013, 2014, 2015, 2017 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 2002. + +@@ -64,6 +64,7 @@ arm_init (Elf *elf __attribute__ ((unused)), + HOOK (eh, abi_cfi); + HOOK (eh, check_reloc_target_type); + HOOK (eh, symbol_type_name); ++ HOOK (eh, data_marker_symbol); + + /* We only unwind the core integer registers. */ + eh->frame_nregs = 16; +diff --git a/backends/arm_symbol.c b/backends/arm_symbol.c +index da4a50a..3edda72 100644 +--- a/backends/arm_symbol.c ++++ b/backends/arm_symbol.c +@@ -1,5 +1,5 @@ + /* Arm specific symbolic name handling. +- Copyright (C) 2002-2009, 2014, 2015 Red Hat, Inc. ++ Copyright (C) 2002-2009, 2014, 2015, 2017 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -32,6 +32,7 @@ + + #include + #include ++#include + + #define BACKEND arm_ + #include "libebl_CPU.h" +@@ -142,3 +143,15 @@ arm_symbol_type_name (int type, + } + return NULL; + } ++ ++/* A data mapping symbol is a symbol with "$d" name or "$d." name, ++ * STT_NOTYPE, STB_LOCAL and st_size of zero. The indicate the stat of a ++ * sequence of data items. */ ++bool ++arm_data_marker_symbol (const GElf_Sym *sym, const char *sname) ++{ ++ return (sym != NULL && sname != NULL ++ && sym->st_size == 0 && GELF_ST_BIND (sym->st_info) == STB_LOCAL ++ && GELF_ST_TYPE (sym->st_info) == STT_NOTYPE ++ && (strcmp (sname, "$d") == 0 || strncmp (sname, "$d.", 3) == 0)); ++} +diff --git a/libebl/Makefile.am b/libebl/Makefile.am +index 6f945eb..2491df8 100644 +--- a/libebl/Makefile.am ++++ b/libebl/Makefile.am +@@ -1,6 +1,6 @@ + ## Process this file with automake to create Makefile.in + ## +-## Copyright (C) 2000-2010, 2013, 2016 Red Hat, Inc. ++## Copyright (C) 2000-2010, 2013, 2016, 2017 Red Hat, Inc. + ## This file is part of elfutils. + ## + ## This file is free software; you can redistribute it and/or modify +@@ -53,7 +53,8 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c \ + eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \ + ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \ + eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \ +- eblunwind.c eblresolvesym.c eblcheckreloctargettype.c ++ eblunwind.c eblresolvesym.c eblcheckreloctargettype.c \ ++ ebl_data_marker_symbol.c + + libebl_a_SOURCES = $(gen_SOURCES) + +diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h +index b725374..f3a0e64 100644 +--- a/libebl/ebl-hooks.h ++++ b/libebl/ebl-hooks.h +@@ -1,5 +1,5 @@ + /* Backend hook signatures internal interface for libebl. +- Copyright (C) 2000-2011, 2013, 2014, 2016 Red Hat, Inc. ++ Copyright (C) 2000-2011, 2013, 2014, 2016, 2017 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -121,6 +121,9 @@ bool EBLHOOK(relative_reloc_p) (int); + bool EBLHOOK(check_special_symbol) (Elf *, GElf_Ehdr *, const GElf_Sym *, + const char *, const GElf_Shdr *); + ++/* Check if this is a data marker symbol. e.g. '$d' symbols for ARM. */ ++bool EBLHOOK(data_marker_symbol) (const GElf_Sym *sym, const char *sname); ++ + /* Check whether only valid bits are set on the st_other symbol flag. + Standard ST_VISIBILITY have already been masked off. */ + bool EBLHOOK(check_st_other_bits) (unsigned char st_other); +diff --git a/libebl/ebl_data_marker_symbol.c b/libebl/ebl_data_marker_symbol.c +new file mode 100644 +index 0000000..922d720 +--- /dev/null ++++ b/libebl/ebl_data_marker_symbol.c +@@ -0,0 +1,44 @@ ++/* Check whether a symbol is a special data marker. ++ Copyright (C) 2017 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 either ++ ++ * the GNU Lesser General Public License as published by the Free ++ Software Foundation; either version 3 of the License, or (at ++ your option) any later version ++ ++ or ++ ++ * 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 ++ ++ or both in parallel, as here. ++ ++ 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 copies of the GNU General Public License and ++ the GNU Lesser General Public License along with this program. If ++ not, see . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++ ++ ++bool ++ebl_data_marker_symbol (Ebl *ebl, const GElf_Sym *sym, const char *sname) ++{ ++ if (ebl == NULL) ++ return false; ++ ++ return ebl->data_marker_symbol (sym, sname); ++} +diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c +index f3a65cf..1f81477 100644 +--- a/libebl/eblopenbackend.c ++++ b/libebl/eblopenbackend.c +@@ -1,5 +1,5 @@ + /* Generate ELF backend handle. +- Copyright (C) 2000-2016 Red Hat, Inc. ++ Copyright (C) 2000-2017 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -184,6 +184,7 @@ static bool default_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, + const GElf_Sym *sym, + const char *name, + const GElf_Shdr *destshdr); ++static bool default_data_marker_symbol (const GElf_Sym *sym, const char *sname); + static bool default_check_st_other_bits (unsigned char st_other); + static bool default_check_special_section (Ebl *, int, + const GElf_Shdr *, const char *); +@@ -235,6 +236,7 @@ fill_defaults (Ebl *result) + result->none_reloc_p = default_none_reloc_p; + result->relative_reloc_p = default_relative_reloc_p; + result->check_special_symbol = default_check_special_symbol; ++ result->data_marker_symbol = default_data_marker_symbol; + result->check_st_other_bits = default_check_st_other_bits; + result->bss_plt_p = default_bss_plt_p; + result->return_value_location = default_return_value_location; +@@ -672,6 +674,13 @@ default_check_special_symbol (Elf *elf __attribute__ ((unused)), + } + + static bool ++default_data_marker_symbol (const GElf_Sym *sym __attribute__ ((unused)), ++ const char *sname __attribute__ ((unused))) ++{ ++ return false; ++} ++ ++static bool + default_check_st_other_bits (unsigned char st_other __attribute__ ((unused))) + { + return false; +diff --git a/libebl/libebl.h b/libebl/libebl.h +index 87896e4..882bdb9 100644 +--- a/libebl/libebl.h ++++ b/libebl/libebl.h +@@ -1,5 +1,5 @@ + /* Interface for libebl. +- Copyright (C) 2000-2010, 2013, 2014, 2015, 2016 Red Hat, Inc. ++ Copyright (C) 2000-2010, 2013, 2014, 2015, 2016, 2017 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -156,6 +156,10 @@ extern bool ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr, + const GElf_Sym *sym, const char *name, + const GElf_Shdr *destshdr); + ++/* Check if this is a data marker symbol. e.g. '$d' symbols for ARM. */ ++extern bool ebl_data_marker_symbol (Ebl *ebl, const GElf_Sym *sym, ++ const char *sname); ++ + /* Check whether only valid bits are set on the st_other symbol flag. */ + extern bool ebl_check_st_other_bits (Ebl *ebl, unsigned char st_other); + +diff --git a/src/strip.c b/src/strip.c +index 4a35ea1..773ed54 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -1,5 +1,5 @@ + /* Discard section not used at runtime from object files. +- Copyright (C) 2000-2012, 2014, 2015, 2016 Red Hat, Inc. ++ Copyright (C) 2000-2012, 2014, 2015, 2016, 2017 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 2000. + +@@ -960,8 +960,19 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + if (shdr_info[scnidx].idx == 0) + /* This symbol table has a real symbol in + a discarded section. So preserve the +- original table in the debug file. */ +- shdr_info[cnt].debug_data = symdata; ++ original table in the debug file. Unless ++ it is a redundant data marker to a debug ++ (data only) section. */ ++ if (! (ebl_section_strip_p (ebl, ehdr, ++ &shdr_info[scnidx].shdr, ++ shdr_info[scnidx].name, ++ remove_comment, ++ remove_debug) ++ && ebl_data_marker_symbol (ebl, sym, ++ elf_strptr (elf, ++ shdr_info[cnt].shdr.sh_link, ++ sym->st_name)))) ++ shdr_info[cnt].debug_data = symdata; + } + } + +@@ -1293,7 +1304,10 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + shdr_info[cnt].shdr.sh_name = dwelf_strent_off (shdr_info[cnt].se); + + /* Update the section header from the input file. Some fields +- might be section indeces which now have to be adjusted. */ ++ might be section indeces which now have to be adjusted. Keep ++ the index to the "current" sh_link in case we need it to lookup ++ symbol table names. */ ++ size_t sh_link = shdr_info[cnt].shdr.sh_link; + if (shdr_info[cnt].shdr.sh_link != 0) + shdr_info[cnt].shdr.sh_link = + shdr_info[shdr_info[cnt].shdr.sh_link].idx; +@@ -1492,13 +1506,17 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + /* The symbol points to a section that is discarded + but isn't preserved in the debug file. Check that + this is a section or group signature symbol +- for a section which has been removed. */ ++ for a section which has been removed. Or a special ++ data marker symbol to a debug section. */ + { + elf_assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION + || ((shdr_info[sidx].shdr.sh_type + == SHT_GROUP) + && (shdr_info[sidx].shdr.sh_info +- == inner))); ++ == inner)) ++ || ebl_data_marker_symbol (ebl, sym, ++ elf_strptr (elf, sh_link, ++ sym->st_name))); + } + } + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 7fd4b21..edfdb53 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -81,7 +81,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ + run-strip-test3.sh run-strip-test4.sh run-strip-test5.sh \ + run-strip-test6.sh run-strip-test7.sh run-strip-test8.sh \ + run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ +- run-strip-nothing.sh \ ++ run-strip-nothing.sh run-strip-g.sh \ + run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ + run-strip-nobitsalign.sh run-strip-remove-keep.sh \ + run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-test3.sh \ +@@ -176,7 +176,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ + run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ + run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ + run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ +- run-strip-nothing.sh run-strip-remove-keep.sh \ ++ run-strip-nothing.sh run-strip-remove-keep.sh run-strip-g.sh \ + run-strip-strmerge.sh run-strip-nobitsalign.sh \ + testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ + run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ +diff --git a/tests/run-strip-g.sh b/tests/run-strip-g.sh +new file mode 100755 +index 0000000..1303819 +--- /dev/null ++++ b/tests/run-strip-g.sh +@@ -0,0 +1,102 @@ ++#! /bin/sh ++# Copyright (C) 2017 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 ++ ++# When stripping just the debug sections/symbols we keep the symtab ++# in the main ELF file. There should be no symbols pointing into the ++# debug sections and so there should not be a copy in the debug file ++# except for a NOBITS one. ++ ++tempfiles a.out strip.out debug.out readelf.out ++ ++echo Create debug a.out. ++echo "int main() { return 1; }" | gcc -g -xc - ++ ++echo strip -g to file with debug file ++testrun ${abs_top_builddir}/src/strip -g -o strip.out -f debug.out || ++ { echo "*** failed to strip -g -o strip.out -f debug.out a.out"; exit -1; } ++ ++status=0 ++testrun ${abs_top_builddir}/src/readelf -S strip.out > readelf.out ++grep SYMTAB readelf.out || status=$? ++echo $status ++if test $status -ne 0; then ++ echo no symtab found in strip.out ++ exit 1 ++fi ++ ++status=0 ++testrun ${abs_top_builddir}/src/readelf -S debug.out > readelf.out ++grep SYMTAB readelf.out || status=$? ++echo $status ++if test $status -ne 1; then ++ echo symtab found in debug.out ++ exit 1 ++fi ++ ++# arm (with data marker in .debug_frame). See tests/run-addrcfi.sh ++testfiles testfilearm ++ ++echo arm strip -g to file with debug file ++testrun ${abs_top_builddir}/src/strip -g -o strip.out -f debug.out testfilearm || ++ { echo "*** failed to strip -g -o strip.out -f debug.out a.out"; exit -1; } ++ ++status=0 ++testrun ${abs_top_builddir}/src/readelf -S strip.out > readelf.out ++grep SYMTAB readelf.out || status=$? ++echo $status ++if test $status -ne 0; then ++ echo no symtab found in strip.out ++ exit 1 ++fi ++ ++status=0 ++testrun ${abs_top_builddir}/src/readelf -S debug.out > readelf.out ++grep SYMTAB readelf.out || status=$? ++echo $status ++if test $status -ne 1; then ++ echo symtab found in debug.out ++ exit 1 ++fi ++ ++# aarch64 (with data marker in .debug_frame). See tests/run-addrcfi.sh ++testfiles testfileaarch64 ++ ++echo aarch64 strip -g to file with debug file ++testrun ${abs_top_builddir}/src/strip -g -o strip.out -f debug.out testfileaarch64 || ++ { echo "*** failed to strip -g -o strip.out -f debug.out a.out"; exit -1; } ++ ++status=0 ++testrun ${abs_top_builddir}/src/readelf -S strip.out > readelf.out ++grep SYMTAB readelf.out || status=$? ++echo $status ++if test $status -ne 0; then ++ echo no symtab found in strip.out ++ exit 1 ++fi ++ ++status=0 ++testrun ${abs_top_builddir}/src/readelf -S debug.out > readelf.out ++grep SYMTAB readelf.out || status=$? ++echo $status ++if test $status -ne 1; then ++ echo symtab found in debug.out ++ exit 1 ++fi ++ ++exit 0 +diff -ru elfutils-0.169.orig/libebl/Makefile.in elfutils-0.169/libebl/Makefile.in +--- elfutils-0.169.orig/libebl/Makefile.in 2017-07-21 12:49:56.824083447 +0200 ++++ elfutils-0.169/libebl/Makefile.in 2017-07-21 12:50:44.169036296 +0200 +@@ -163,7 +163,8 @@ + eblstother.$(OBJEXT) eblinitreg.$(OBJEXT) \ + ebldwarftoregno.$(OBJEXT) eblnormalizepc.$(OBJEXT) \ + eblunwind.$(OBJEXT) eblresolvesym.$(OBJEXT) \ +- eblcheckreloctargettype.$(OBJEXT) ++ eblcheckreloctargettype.$(OBJEXT) \ ++ ebl_data_marker_symbol.$(OBJEXT) + am_libebl_a_OBJECTS = $(am__objects_1) + libebl_a_OBJECTS = $(am_libebl_a_OBJECTS) + AM_V_P = $(am__v_P_@AM_V@) +@@ -405,7 +406,8 @@ + eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \ + ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \ + eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \ +- eblunwind.c eblresolvesym.c eblcheckreloctargettype.c ++ eblunwind.c eblresolvesym.c eblcheckreloctargettype.c \ ++ ebl_data_marker_symbol.c + + libebl_a_SOURCES = $(gen_SOURCES) + noinst_HEADERS = libeblP.h ebl-hooks.h +diff -ru elfutils-0.169.orig/tests/Makefile.in elfutils-0.169/tests/Makefile.in +--- elfutils-0.169.orig/tests/Makefile.in 2017-07-21 12:49:56.849082894 +0200 ++++ elfutils-0.169/tests/Makefile.in 2017-07-21 12:50:44.461029838 +0200 +@@ -139,17 +139,18 @@ + run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ + run-strip-test7.sh run-strip-test8.sh run-strip-test9.sh \ + run-strip-test10.sh run-strip-test11.sh run-strip-nothing.sh \ +- run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ +- run-strip-nobitsalign.sh run-strip-remove-keep.sh \ +- run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-test3.sh \ +- run-unstrip-test4.sh run-unstrip-M.sh run-elfstrmerge-test.sh \ +- run-ecp-test.sh run-ecp-test2.sh run-alldts.sh \ +- run-elflint-test.sh run-elflint-self.sh run-ranlib-test.sh \ +- run-ranlib-test2.sh run-ranlib-test3.sh run-ranlib-test4.sh \ +- run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \ +- run-find-prologues.sh run-allregs.sh run-addrcfi.sh \ +- run-nm-self.sh run-readelf-self.sh run-readelf-test1.sh \ +- run-readelf-test2.sh run-readelf-test3.sh run-readelf-test4.sh \ ++ run-strip-g.sh run-strip-groups.sh run-strip-reloc.sh \ ++ run-strip-strmerge.sh run-strip-nobitsalign.sh \ ++ run-strip-remove-keep.sh run-unstrip-test.sh \ ++ run-unstrip-test2.sh run-unstrip-test3.sh run-unstrip-test4.sh \ ++ run-unstrip-M.sh run-elfstrmerge-test.sh run-ecp-test.sh \ ++ run-ecp-test2.sh run-alldts.sh run-elflint-test.sh \ ++ run-elflint-self.sh run-ranlib-test.sh run-ranlib-test2.sh \ ++ run-ranlib-test3.sh run-ranlib-test4.sh run-addrscopes.sh \ ++ run-strings-test.sh run-funcscopes.sh run-find-prologues.sh \ ++ run-allregs.sh run-addrcfi.sh run-nm-self.sh \ ++ run-readelf-self.sh run-readelf-test1.sh run-readelf-test2.sh \ ++ run-readelf-test3.sh run-readelf-test4.sh \ + run-readelf-twofiles.sh run-readelf-macro.sh \ + run-readelf-loc.sh run-readelf-aranges.sh run-readelf-line.sh \ + run-readelf-z.sh run-native-test.sh run-bug1-test.sh \ +@@ -1046,7 +1047,7 @@ + run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ + run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ + run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ +- run-strip-nothing.sh run-strip-remove-keep.sh \ ++ run-strip-nothing.sh run-strip-remove-keep.sh run-strip-g.sh \ + run-strip-strmerge.sh run-strip-nobitsalign.sh \ + testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ + run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ +@@ -2340,6 +2341,13 @@ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ ++ "$$tst" $(AM_TESTS_FD_REDIRECT) ++run-strip-g.sh.log: run-strip-g.sh ++ @p='run-strip-g.sh'; \ ++ b='run-strip-g.sh'; \ ++ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ ++ --log-file $$b.log --trs-file $$b.trs \ ++ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) + run-strip-groups.sh.log: run-strip-groups.sh + @p='run-strip-groups.sh'; \ diff --git a/elfutils.spec b/elfutils.spec index e7370df..d8a827d 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.169 -%global baserelease 5 +%global baserelease 6 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -27,6 +27,7 @@ Patch2: elfutils-0.169-dup-shstrtab.patch Patch3: elfutils-0.169-strip-empty.patch Patch4: elfutils-0.169-strip-keep-remove-section.patch Patch5: elfutils-0.169-s390x-ptrace.patch +Patch6: elfutils-0.169-strip-data-marker-symbols.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -183,6 +184,7 @@ cp %SOURCE1 %SOURCE2 tests/ %patch3 -p1 -b .strip_empty %patch4 -p1 -b .strip_keep_remove %patch5 -p1 -b .s390_ptrace +%patch6 -p1 -b .data_markers find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -313,6 +315,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Fri Jul 21 2017 Mark Wielaard - 0.169-6 +- Add elfutils-0.169-strip-data-marker-symbols.patch. + * Mon Jul 17 2017 Mark Wielaard - 0.169-5 - Fix build on s390 (ptrace.h). Add elfutils-0.169-s390x-ptrace.patch. From 434b22b6cecbc88cdea1d70fc60cdf780c24be37 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 26 Jul 2017 07:18:20 +0000 Subject: [PATCH 038/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index d8a827d..8c46132 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.169 -%global baserelease 6 +%global baserelease 7 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -315,6 +315,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Wed Jul 26 2017 Fedora Release Engineering - 0.169-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + * Fri Jul 21 2017 Mark Wielaard - 0.169-6 - Add elfutils-0.169-strip-data-marker-symbols.patch. From ba7355de659ef34cd33d4e58d637b542804b96a2 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 2 Aug 2017 20:00:06 +0000 Subject: [PATCH 039/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 8c46132..ba49f32 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.169 -%global baserelease 7 +%global baserelease 8 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -315,6 +315,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Wed Aug 02 2017 Fedora Release Engineering - 0.169-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + * Wed Jul 26 2017 Fedora Release Engineering - 0.169-7 - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild From 01b23e59495c37b5187e92efd4cba7026caf998f Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 3 Aug 2017 12:14:34 +0200 Subject: [PATCH 040/216] 0.170-1 - New upstream release. Remove upstreamed patches. - provide_yama_scope for either fedora >= 22 and rhel >= 7. --- .gitignore | 1 + backtrace.ppc64le.fp.core.bz2 | Bin 37786 -> 0 bytes backtrace.ppc64le.fp.exec.bz2 | Bin 383808 -> 0 bytes elfutils-0.169-dup-shstrtab.patch | 98 -- elfutils-0.169-ppc64-fallback-unwinder.patch | 275 ----- elfutils-0.169-s390x-ptrace.patch | 27 - ...tils-0.169-strip-data-marker-symbols.patch | 553 --------- elfutils-0.169-strip-empty.patch | 235 ---- ...tils-0.169-strip-keep-remove-section.patch | 1063 ----------------- elfutils.spec | 27 +- sources | 2 +- 11 files changed, 10 insertions(+), 2271 deletions(-) delete mode 100644 backtrace.ppc64le.fp.core.bz2 delete mode 100755 backtrace.ppc64le.fp.exec.bz2 delete mode 100644 elfutils-0.169-dup-shstrtab.patch delete mode 100644 elfutils-0.169-ppc64-fallback-unwinder.patch delete mode 100644 elfutils-0.169-s390x-ptrace.patch delete mode 100644 elfutils-0.169-strip-data-marker-symbols.patch delete mode 100644 elfutils-0.169-strip-empty.patch delete mode 100644 elfutils-0.169-strip-keep-remove-section.patch diff --git a/.gitignore b/.gitignore index 6e96ec1..a5b5128 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ /elfutils-0.167.tar.bz2 /elfutils-0.168.tar.bz2 /elfutils-0.169.tar.bz2 +/elfutils-0.170.tar.bz2 diff --git a/backtrace.ppc64le.fp.core.bz2 b/backtrace.ppc64le.fp.core.bz2 deleted file mode 100644 index e63babf38a441f9fd94ee88910be5f5eb173435f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37786 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 emVZY30$-doAlsUYiB!db zp=|QSo|s7s(Cu7wKWl$5-iGsein;^tv?TT{qn9`vPC!?QuuI zzXOtG6gn6ok93D)h|jO)lSikiU?40Bu-<<^-*7ZL6ySa;qR2>b z(oenk^$z>V;`F@Zj#2f8uzFt`8X`2~BNP#I4B>5-DI1msz)69JR zP&TxJgi(d6X>vRANKS}>Af#jCe%*eeRf>pHW@$RraS;luy3_($X{D;qCV~;zD=~WMZ@V&_rITEha=cT0N40Y9Z!vhRh3b<4+sKu!U-e*XrSm z3Pt+WA#y~wq9t0MQ-jY2eFBLrpv$2^LM4c(G9DMqF9S*XFJ#jJ{5<#x8wOz2` z)KexhZyuqjcAt42^SdY_K~26M4PIzbl5!C`gRyIWn@(e{bz;1s&@GFj3gu!}*5k~J zs|qCQgs626OthowjzonZBYPrpxkE9?m$08tQ&M&2i3$Zq3jS?^{hIpJpLRJd5DbRn z9U`w>M{;>Tx0*=$$};CoH5u&2qO34FCUa_Y49hkxu2L1ZyuENlvQBu|M( zkYw1_;Ds&H?Zzc)%-5?Qm9mTC%%bTD&!|m|u7ExT)-1&d)D~cd!HLmiu|*0A7&DeG zPHr%n&@u>8G4QtdWP6GzAPYxjmr@^jYBwD35bJo`4slaz@wxs#L)78Jp^DE5t&Xkd z{c5T@F$AX2*<>l^ZndD#+-2$=o}BY<*Ym#L8^gjq0?oZm7g^cT_S-x0!rQXmCVhJo zSWVe$T1P+-&^{b=x~`XPqe%~QC%J|SmNC-bd~TS zeW!`31~kw%iE9E<+J;)$)6^9cndBxq+CelKX6d^D`M-ik% z#v;-ZAH+#1kia`HS7=#OMGVa`VHAiY6mYLu`d-7fzmRs_Nq1yK3_>BC@~PBw#;#iQ z$EoY_>9fgg=qF3Q6S+V_&t;c?oFBmS@G4lfN@0bn!iZT4u~OEcVkpHeRIw6;jTKa=9`>ur zNho5)RgqO9hyo%E7z~2IV8x3h7mCT|2opmHp&+5=gCGf}L6w7zPtsfU?0+VuHa~$qkMO_qJkxcjWQDb^IXwT^0dC zMJ8|K+R`H(+L8+tB{7JgvPC2|(3HFil54QrNpXo)DTEYNkP(nmfQ1f8DFfa!lWHO` zMjDAxiba9L@v6$3h^M)Uv|@Fv^O2TEH~CKcCxM(xxgA zcsE(HUD_xk;9u|zNQk4aDQ8_6lZXQd%s|{BoX+vt@8j(=u`$z(J~ofFlgGwGjDsGws$aB&Y)s2}SUfA9ilBpVnW$-+k`$>x zDCPnb0Fyw8a`d#+iE!53!Q$BEP_Xk|p@b)~^pyKH2w%0TOhFQ}TQaS}ELUzzj~8P!5MwnRX7O(}B8ueTu*oDX!8JZUaV;BW{B z)Vd6#aToVHH$2Dim@~Afy(nPT9J5(&+LJ>rB{3W?*=U5*hHZ>tmV+jWAHY7DWET2% z*2;O?Rv&ymJd(}S6c*0jBmnIzjnZcU9Dh>!A9O5~IQD4KP?Sz8B|eO!s?uzl#~R$Z zS96<~+$1m^H2Rmqe9)zBjfx+G)a72gx=(o3~L!ni~8edqb>`;#qSg>4K-n!_Sp z9|sOYi*S>IF%>_VT+;tS_H_3?@j2dyM^{k^JXwQ54+k#xT!&#@>7*b5I&s7hFvQFb z(*y~ca4ZxI@D~wlA)J+2*Cc(ai$+9OVg=d3x=!gH*R+_>$Vu)(3C(Ae0`BcoPIJ(OM> z#Rgl@nWIz$+gV*-b&4MeAUHxa8k8mneGEq3(7& zow<#_>%RuwuOC7*5ig;jjWlrkevC*(tVbWLtdN%+R1UeYh;r$0a30i65dl!ij)QT= zkXEtR%~X-xvS#KCyBu$=eEL3g_g&}jd>@Nm_s#jX+_zzJRImAPx@;EH4(-;oEQhRX zVGqWR=?*g=RDv3Oc#wEhx)lsX)_%01duVqH9m!m6F zJ7{BL+CU1Sb8t3M04igvMM&%z-jm1C#q&2e+jpVkFQwYN9T;@#A>tj=yeD`eOvFq? zD+iDXDjHQzx9grtX}E05q^b(tl^x;Fo#JmQ^bPMVY@r+_Lp?y0Q=p03{@t&$<;X@_A?sXF7THk+Q_ZUzW9+#S4TZb z!%v#;I6pQ(QP;R`qxH>Yr`69-h>E*tpxcl6oZHT6y)MsPop%`gg55>MGvZL7-O06f zgb9kU?8Oe4ORAMTUl!HHgu?~6y?RNA7@f(28A(WC?BLw&xL@vj$h&`yJ-%O;6ex<4 z@aUxK6;*O^|C1deAMSjYQ{DGHPUQoV+@lDhTF4E zN%2uSp(tunD3IDEJS5DXsfR}@;Xq{3ao5}V`7iccc$c@f9)_D4+ac&1fQdPrY0BPk zMxgzSoIT_PH~MXU2a14j!;2~eg~Yu)d3Q5-b+fe$wYapI`Z!lMY_xiQRQxqVvlR<6 z)@qo6j%+lvnF*-&dT$%#%<{_<%J27D(88pgm~6E6_t)9{t=o=QLWl^lK0e!>F#=_w zhN{LfX6oy@oNpg=ygGDB>EI`Ti=xV6yL}=Om}RkvqrlPOobE)L31UQ12_MdPX&{F^ zEbX-pn|_KhGZu%WX5EZP4C^dTk4Z^NroE2U&2L)zBTt5!9ckrleI`qBJ8mX9)*$UP znZH1|epZb6clpHr9Dc06jh88_T}n^ao$7P1NI2<@h`J60)lID7i6c>jY(ywjAksFC z{+m%R&b@0V;orGD6VTQRQtXY)+YWLLyu#?HIZJD$TthPZS;&e$ol+F5mX?yWMjbEuW%9)}zygoq%gkrhW zQ0VfS`*gK9s%0s(Wm4s$TSGi;Hb*76RZ6>ELsa9I%4t(%we9HPoKr|m9Rd6MC?2MZ zuQ=fXnn8On0b$EDONzkhDXYk}1W1P`g5K8+tPA7$ahYi2Z@tsB3%u4BR|`0eYLe95 z{yt0&RI{V!Y)7*L6yBZga7Wc|WuVc-sm-|SLNc#y*>)|7E@)Pn3(8%hZlBn4%vI|{ zuvN=@r7$%sp@g>IG@&%m)i=UyGT?a}bSqs9B8x@1&!a)nz>=!&)AHYN)7W2GvYgCx zRBrA)d8zMR)!FZ8)s+iAcfq@~Yfg)dxD4~8lv+oaH(zewU#mSCdD*X}^fqp2vs_~E zJvVo&S=v?3Ug?`+YlxvVTi7qfu$DwnZ9#mox$OGQnZN7d*Yee8E@sr>Y*aM`Rzqw^ zOuLA#@zM0v-?+#^F793UX0tid zWYy&zaqq(nWDScKf=+I1_mHHlm1Gs+=3Q7pXUL?+>aiv%b>hT3lmC;XO;Cyglz{n9dqRYWVCn3F z&il7Lh9!W;{O5bN;OSIsKcoKnJ3qTe(Ebpblba}Mfx}`H7*!BXL9%AoQaw))E8@}p zU7xS#SZbJfvH~#;AdJSK0vG~q25S&vkpO43AA21fiv6vp3-5jUxmOjYzd#GNl>OV~ z`tV8ACt@Jk4I~6ll;eu3pk>U}k=h#F0sMJ;AE_7pc*5_0;>^D|VaJj!Ymy1@hlCFV}8jrLR#tv6f}3_(DLi zz9`d|qYT!4olOAH!=nu|F44M_q8J#)D;*QVO)LnJ+s&ouCBY6y>504dAp6?Q_3UTN z8I=STL=zw-cFXXsR;@E}8SGztBqYH2a9P2(g0hTed8+>A|1guW#f zW-aQ%^A_Wpgv_%w0u&Nhk~YQWA;Dqj1pRMu;jiwZntu!0G+o1_m~FK!umne5-5pJF zW@G}vX^c$yv|Ii!F2u4?NE>j3R(IYZ~7+3UsMG^QUZjiP*GJ1s)7_!n+Eu0;+`!f z17j(MZTa`;m@xvvJ2dq#LGXuO{AIZUQ zZ@?`Z7aNzo4a8zU-sVx$?0fDsZ)$%rnd+TGBQr-qd@=^SFj`t1&t%~lV<_N1!=BLe z0YM0f2phCXRJ~NuX7GCUbeA!mH+Hj{x;8O*IFjK8?%b@hVF4&0h7j6kcj=7F*Yff+ zgRnKgy8(KdxEW?9`(BZovixb;H{Sc1aZ^5yopMV7W4kZ(t!YD!Cr;lInxxt5$5J8c z{G)30%rm&d63++Q`TksXV6rwimbX=0Pos9?uQL6U0n4U2@I};4DclU>7cLdoxoS9* z7%0^%m4TXu1d>fWAJHVesQO4nm`zPJut__-U#SE1B?fls*{huT+*ike%94_5%c7ju z+F-pVO!0i%nCv((n$YfE*VC}eaKkSAou0148x1#j6I-*7J&abSCvz<6OG<9%2&3mm zg7n6FVlvYKQA`6F-Hu{A7_337!+$3WgoRF?o-CWK*lP$pVQ}%Zaf2tmD_QaxnDRu; z(h!l-5HZJCwuV5koZHFzt)6D2 zW1rKDPB+J~wPN+AMID@YiK($gn19XvQQUMltlWb=G*R#D!)Jwk(%p%&TAmE|$Q!Fk z*pzNdW$lYr)eI4YOxg6<mdk#ykstSsEjDdP> z$0v2yIORI-z>U2QU@Q*&d!8TL^}iSoe5PVXBy~~;)cTKxA%o~=pUxO5thF(;&p*Z|@6xF4}>uj@7n`)@sR29#(tHTq=E)P#}nugtz%xMs+}% zHouk}{;vW+JG4-WNU}v1eM=-eGTFFgOZM!N5@UL zb9b~5X@yf))(lA1hNhLTgUn)maZssH_lBDf_hw;6<<6f23+lvy{H|O5wl|jajF>-s zUdFB>=}dtWiP-mT?m0pRb=A_tQl|g+p98sLJB;IE@X1mLJ9gPILRQ)xuO5^}@8)$}d=-);K3TRDp0 zI-)02zPW!rCDy$L}86a(ncQYIonNU;3&yDFOj zxEMpAU_)-!XQl=}_GwGX&h0z>PG1|+-ZZ)&GXK}<@gSo6j2CbrIMjJ zJr1`Uq3BMPNGJF#wYV~VV}ctczwsehx%Rw{qr-9TS9j;-h);H!8%HEQ&sj}$Rut-t zqzI9Gu@9nB&rlB{8N?AV6g>l#7UvqxVBB-zK z+dlKHvD=$&wIoADQC(J|phKIegQzxk8%VC)GUBPoU3qP@C;Tf5eTKm4mg~}rMo+`j z_Z6D7IHhNRbCjlhLhEdpP$E?xoiGj*zz&-TNjRS!1>hO6oX&WT^~&bmpA@MAnE^#4 zSsK@pkE^%A0^se}z+K=U`Y^Zm~~xy{Al@XH*3 zX`-|Pyz%hFlGniB2B*%+zMFIUGDr;adG&*bNy5BQ3ef6@qq=t)Ns8L|qwA9?;P!(2G z#~t(|WKKii`E=wy?un<-|=hLS2dOIISwPxJ&}i)jShe2T5Nw7ZEI+Cg;f_%;{6Es z|EPJoT93CYDE51ze%<8Zl0H@kqN`N`>aEvzUJOemu}+n}MM7J}rgjDrgqSL>n5@Iw zw8&lp{O7ynV?mUTH2NNv-ke$y)L0cOU&!n!DDrQY7pujB8m0#B6WHsqVP&)$*yVFc z{7R$vuBvJH0H`S$AApq4z`iiHf;otEEd@Fu-QVkcQT08NELYoyE>**U*mj)c}lfLkBNGI$&{ijdQP{Ya8r22xaDfVQ! zVE$Wdhu*~pChMm6eFkqsQ$e$ucVT45t7{82)sv#Hm9n*O1-eC1JO$Pw=ayj|?Xxg* zI4C{5R7?KahT?jGnE@WPBmXGxkkS;OGNh5 zYvOk`lJ7VIO)S!}Ram6jMO7Qrh5Cq)B!f-+N^ba;vW5j?TxmqPpIhZ3i@GtrxLs4H ze`L~2Oc|5zwD+qS{FHBO)4zrPn={+HLNAj}tgi54@Gc`0MiiuWx{r{Xv0zSm-Jd(=qOOHrp>Ra|RqMZu)@a;Tfj^GN&~45C&CoUN6@ zxiPpKf-Ww;AI!}KC^sCse+Afmwl8J5!R+#NmSj~+U8S@NblbV^r#+uHkk^`6j$~es`HvQQ&9c`G*tpf%UM-e;iOX z==BD!Hn0_Q%e)QJJ=znx4W{PEFOwDa%SLsaw?0F}L<=szR3K8449(Ak5FekZ~; zL!*xP>m~}JAbv3J&N=kgNk%&0t2c&EhEJIW?-xTq3i@s;bM={GzkQ5k=}rf$RfxrI z#><%O8`&C|Chm;#s{-?fV;elKFAw}7bLJ)kHR-5Os({E^G#IBXTEBPo#^@qdm1e^d zc`Iw0Ev9DP%ev+HJ23vQ+U2(u2I_8%eeDGdc{>K(PN~C=%uxGWt!ik%(zN8}an}61 z_<_VZn1B>370gzKTGc?sEmXF!!v|%V1kFzX+J+Bw-vU!+RkzHkp?O0KQHT>F-mc)T z9TH}lqtR9h3EX;N{mT*?SFmAuNWe~FVBuY*rWjQ{JGCvEse&j9 zivhDy5fvCJcC||iOe{%V@)d<(B>@#9g7ckBtwK#C>#~Opnj>(}s4(grsz@oTi zccX_{qww?KlFZ}#f7%WCaS;?2c0FRWXYB4bmW;T({Y%+B0IQ zjc%R(;*i0o1xP6rWJNG;qooohythYzp~>w+e0my0c(__>Ac_F8EQ(JblktA&KfU9J z$^@N|n+YPtj7;voE@%sH782wFg__@P)JU+aNaN5K5n3s1yTehf3 z;;jSlhH^L!Xf&>2wVSUavOL<@trUbtinj1QaRit{m)8U^@R#H|1WJZX0UaB86 z>)PI7z?6qOEZf!e_?Mfb(sg(|rVNWEQj|d#2j;Y^JN6DWfnU z#T*+ScrXpB$he4cy)5ee_00EOu5sA)PTTS7wat++eFW_9ZtbYGV!_s(#_3=7o0`*} z*xwU`$gx0K79v8{+&O)R*7Uiyb8+{U+vRorpSsXX6!YRc`m08tGZ>QzL&f%G&zRJ= zweHJx+`DIxU0D%CK_dnzsKtURs}cMhJPfx`P)D3R4)=f)`#T#HhMwI+B;YW_O#0Qv zPrmEH$m{)-7Ha42jgHn-ar+$#@DSMc@Q7`;ZeW4vo`w5iw>cP+D(UN)!_}&D*+K}( zZkMmzZxEKIkl7`5#Y(8?uKfTU8;VE2ix0+#Gu88qv)M|FHoWvB}jzUUSLoaU}m6k zE$QTpUOzUVn0ZlSr_jntB0i@c`kFmO6=Q~6npxCUGcXe!xYRQiGZKAp*9phlj%vEC zPM15)H4surG_6Zr>lCGcvW#GALkuk1kr5&H^Xwt^J-MgeX%mv6i4fF1J~x8VAt4nh ztfh32ipugD=-$LFuEp$~cl>z&3B`BgUCuu05S&My-7G%l59^O@{|1K!gCBcpC6Ww4 zRb}JBUXVv)b_BLMH7T&lFY%!pxURt>$V`Zn43`MoEjI}qq6G25FpvB8Uq-sq zW}^p@T#g5>BZo>$)FWn!PVb{dQz5L^5O=xz>32Bv&B8Q^Y^2c(g@2hsh90_llA&r| zx@1M_e`g{NLMROYt-VB~%LPE- zY`3pWqA8NqU?6$s8q^go6xFFEF^!JBz-{&Hx{9*U(A3{T|7Ty{`_wh0x>O`y!bRV? z;=56x-|qB@>{aG^4Bzl95=CtkrZ~8R#^`AvpoKX_M?2+v{)d~O;XnPaG2=M4&H}Ff z?FNIm`-QLf=Mt?&Q5KjCxmr>!mU%`Luv#ycZ+h;cU!_Awr~iLesR~siAac#2({^p9 zS9oj}+1j||32M&}QWEGpwmzJO4ea)OZI-{S9Ee;_R7-J9E@XAo5-kgw&KUsGmo&s} zWNizF+xk~nJeeVObNM$HXGEHDtT3Ik_ph*_M3=hLxb02t9?y6j`#LzaSQvWZz+#=H zR14$$D?sWn2{2$&F*K5fkPV%S?V1;&pf%w;EPa*sd|t=m(h1pJ_;Ou2i@k4GVAjcxINa6xj3y> zG#Dd$1@1|RA=q|RxYN?AmYb<-1d^nPvh4_@kOfgyfn*VaF`|SSNuM{=X;Wf%-@L3N zsSxEr)4EX@}xq z+goV+T*(l+TH-NX%rm1-D6?oxL|{Oo5aVIpHK@9U>6CRDUzWtD__nw!g}_Nbl5mTt z^%`w$reQXpWA1sa0xvvyw3BWnx{jxr@K-t1lYtV3jb+XsTIap2ku_ z4Z?`QLf@vdx7oz&?Yo;xZ9&!|Bz^UgZb|t$1-)@dBAOjQlPdDA=Zd<=?yq6Ku|h}L zZ})xNAxnFzIJ(q1v~i30b)aKZLM1@+MM5P$9?KtW9>R%-9U5MKOTze&1dDRzpw8%M z%pQ_0W6(BI5mzp(QY2$9vQ5yB_%x zCWpI0wCnb51N-TFPv!s)b&g`CRh!~dxY1YiX;Tk1(tvr{$G z{AfvQeh4+F1d}bD{=OZ2yb6sp8HMRGj`z{L@}}Wh)DZA|i4}E`AxdJ@it-9u)!{+o z$ntj)D)UT-#NeN)%zU#ZoJ2yUxod5&&(l(E|7ZzKM}0rW#-xUuiaea&tWHu2n#KT^ ztKV&P>|+0$XGbQ(|3Skx+d)M z>2A%E6Uv$NEnPvxekhS~rI2Rz8&H!>=Hr2v6MyP--WZTVFho^VB_0_(MisX!yRcG= z5LbwF^UWYWmyhZCUZ;fiCl@|wiqJYTo^`XUI{E-l*{Uk6Fq1W9SDUh#l)96$4F>}) zkxBc>O!nMaZ8C~bBUCe5ZI}ChA2Yqn^*J=EuK*4b5oHi2|FCrl`q*V%Eo%$BcRAw{ z8NgqlsZP34q6{i<#vs&54jepj4aB6cP?#6%xrO$%_J;QP`1LSb^Dhb7h<3&u2r2y0 zOdZE`4wF)JLlx0Y0{bsC+s~DH(9h)(%ylE31y_IyhSZ+A%f; z+2NEQR0j-ch-_SFAuY#k0YwwK>>AFL^fWs;OhQ~8u&jY&soP}x?|X;3O6Q*mw!qKH zLtzUD@2V9OX{>gvSV2rugjF!Arf;gTykSyQS7#jxt~*iXdK5)!B{&l~q;@X@y$HP7 z$;x%YDj%20_g|CHUE3+YS`ZrO4Do|%VU!=-oH!@M_&&nUM`5;VU^;HXkH!VK`yicwQA6-#-3osoX&ftj7y@vcD-9&ALN zKGZifL&)9;!{GRyEvBOY)EWJ+V?BxU{O`HUWKGm49p(ipu#X?r^rpDqm9W0J6br4@ zDeMo6rqh4w7(WP#)p4m*-==rx&a1?=G+Cfc;d-6PI`gcE_#Q2;x-kdnY3S;GB4$ED zNCq-25m+d(L&QywK_t>WX0@l_;83inBQ3?mL-1;=6F~xr%kf#YImH1Ah114B%~2z1&FGMBO)M*q9BR~R(IUK)BN23Mc81cn01AX zqCm~mUC1EdAFv-x*dRp40tPhBiV(C*x7aU@Ib_{>!;JL!`zRlZUqyAROpIhYox4&W z$IAJVesnk@7y>&LC>!8E)={S$n3j?L|2qj>SyV5(+w`D0SwW|Fb zpJN>B@q?z`_Q#mLs|Pq=OIg`eEdv#hJo>>BaT|@%=;%;^`0%LzFZalvp848(9|YY9 zYf5|h-W^2^16rkY7n9&`8^LvEOo1eALOIdG&5k1+*z|`^)A;e6IBspv#5f5xor?F_ znMLp67wOcq>{QfAru?qn_n1&aa`KPkbDQoGbt?v7mP}riv)DWS)AFaCtmM~gcMk0$C632zx#nz@*`5{tW;0K~z&P(P zv)|MO>{b59qLo`*OfiNbzh?&|?uAc={~ESl`}!l5dxFr*w%L+6*DB+Gek8XDQ?X0N zRMRkoQRhTO5Gr9adsL9Jk3z;OB#G^;rx+7O9CYCsEGpdX=1dWHfho-aUnfIb|+Ga1!Ra|P)J{^A_`TY&Ya{k5gOI4JOKIgb#^W}LBf-KErAkB8tdC3!hBavm< z>=9Z&fBzjaeAvC!yRuGcqRuMNFGA8>q0nkw$shetQ>PLBhEhW;l1!0lF_k?om#EN^ z7$y7L+X$REFHnDvT>4L$9L9D>l-{!5w|OlFVricg^_>k;?nyVRHX+Td-jWg%v5P8u zL%4i)JmcWIl6wmU50&!z94TYf#C?`Gmd`0$w$oVT{ZFbQa<#WJz#J)MaPwo^L0&BE zj8;H=nKmNImW}Q_oGwuQH_GYj%%!^I3F{xUakKD^WvA%} z-P^y#;5fAm@hn3M%aNa5N-b?Q=QU8 zLV-Y1mXqi1IX^$x-^%z{XHkuvm5OVv_5iI=2VqA}b_EA!f!AcJTm|dzX@DK>7$9O; zdF4d)8k9lFzmcrg{27A`J3{Nx=-vC=X5_f8zj(dBU*6#C`)yxf{}-vmi%n{9OCzx> z&C$j?1F$B*Noa!ZR1smqgH^(xLE1e{8&@93!_>a&DuVaAJ+AJG$W6`@E(HXF`dyoI z&4BoR*YrZ4v(@-(Q!5)zlX z-B0ngg){K%b=D|xs(FJBB3Nd=xYUda5L02LNGP#Z0>~n^8X88L0UC=KP$4OS%iZ-* zJ`u?fFd87@qk`RM9-eBmz-C?3O1Td)$Mgmy-pB4CJ0xt%I|h_1kF4^42KUR4NfMcq z?4TX%Be?pjukax1*$mOPSVe`@cto@j4OO8ylA!1_4VQD!V>MaN_?&$MeEsbA6Z>qh zjtvavXPY!tG?adlB~y^LYw?nc{im_in(JKSTc|jsBfFZ^C+?aa*(C%%Nv9 zr&g;?bLLJ(k00(OkKPyVs^?X3t`PhX`Ve&K?UGB&6JWyLlUV5KtpWK8h(1VqYY;HM zUgpjkF377D;cNhB)AKsL$QdQkqYJE}$bgs0QDe4ptp zo0Wq`hdfuvN9 zvw_u2D7$9cmX{4)2~v`6m+^8M?9@;op>Q%Pke$*tVQZ=g`!Tmlfg>{O(=<{Tp&TBib7&4lni1GS&8^`o>v1? z4BWjFzE2m&Ijr!n+T>e0_W|HO8;)&cy~gf@m&={rm#TD@VB5+P#ZSk!-)1)Ed6Ks_ z%Bg;`*ZRGB6WWI1J3oLu8vO{j&HMF5YW@Ej>G&X-Zpnfhtz~St zO9Y2@fJlE4dsr*}mvEhGAX(mvP~PIx-}IK>fzp-Vudq&r&6p0`UG^yF);SQo%~~PL z&F{t|1!}0z9B|UTO<+|@Bj8c`R$yp_GS>Gn&OmG9T`^{z2RQOvij*Urkd$GtG;@vQ8s=7vzEusW*06;y{OzAV>EsB;6^+tXU_9gNhJS|z32O~C`ze4{MEjsJ>wfl!SJhzq)2=s0SFN&n0I}DGw6K( z`1oEQWpBv%zOUo&?dt709B&49VK$BM-w5AL6=H zg%~ik@rAUgF$9)yNAo<%2_^zbeDfS|h3->klE^HU6Af(EKvH7{N?K}=%J<=7s>;bE zfgvCkaP0%3oELh;L75*vtH<;4#-@i)z02*;iz_OU}wlx+e+9{zu=X=Hh+) z&Fm~s2DV2&`Vwq%};dY@zdd`|-3{QiHl;^p&a6Y14_C#TNq z(>R``JWAzC;gT3NMGxI8VfoHo=-q1{?DI32Q@(xFIFuP3Q;}BJW=)}!r}VlFE$7X| z-)XfXdmrb*@q54S_eYq=i974>DzH0vU*XAE{oPh_o`KrSE4@Cpy5B#njlJ<}yN$o% zbEUrSXzHU|<+bJ&9gdSI=V`g~V1>T?m0X;8U!Qd^&+a!~_w+TI{e7$+k9(&(NYi|I z>+V-QvGeNvO^;2Z#qwl7SXTXBUw?#oh+&VOFs+x>M1E17TD?e8t}tG3bVaxBfR?v$;@Vq)}lh*3al@y*9s zD{bg$hA^++Exx$Cy}WrFvlKwSu{baVB(c1ZT`?!tZauYvYL!trK+KYquj`af3-!ulI2|LN;?UZ(4b zZQW+(fteZpL^2Ww^->o7@jf`K1uPN8%bUGeu~m*5Za(P&!{}y_mT)dQY<@6;#D!5gKZm zP(_SHL{$(`V#XjMh$y1OVlhxih%6$(`#Pw_NWH*&GHU(G>}v-;5w&gb4|sR0H3>0* zrUr;;kgpkT$vbcxP-J{swUbcV8U>MHA`E0z37MuK`@34ou!4}XQ?CDF)W4_trLxBW zP*nu+of}vwoA&elkKCL1yj^$y-Pi1@p9kFfEVE{+LV6O!i zj5JqW>sPNW+swaq?3cG0k4r~1c3#9(6&S%)insDlp~cOnLj-mY?Pq!y>(ToK<@oFkMQR-AP9sf6ytBIN=n~VqL6sxTy>XRdWzD| zA4XSjH~nW-$z#*uhm6U^DYA@;C^2o+Mhc3kD-{_)@}nX#s;y!y-oR%y-Zulv>nkB% zG7Grz4qY!NCrwYG>@^WL*6PYd8*O%i$Let`QL*0ZODr2P#TCtNMJ=zs^{evjY3Gr? zeDh7X|JL}{?5Tr|0L?r4cv{qRZilk+dzzF#(m zw_20(ofqZa#b+E_Ttme;qZ4g-BLo!e5WZdc=u`X2lc_I z1SlXWe}Xwmf>J0j%SQ~}=w6w&?inG@oYJ~q{z!5)zT0BdUSwT` zarqt1I_?S?m2Ob-v`~81mImgowKRQfvkqgYI&XaZ(FQ!Ij3zAPXVr@jmqz5~?sArE z9-5ASI?UEZmdjhS?XU50XI{UJf6qY7^)9MbvjY*$cBr_Mg?$7`tq5OVOUvuAwsZM3 zk;&Zvn*btMGfR!Hkz1hA718hvf@Vj17f(YuOGxQ0z82&<23`FYBJQh?xZ>xNTOSi&2YzvPWm^|4(bv1# z;<3WK*=e_nB^p*pG3?;9PwHwFShWs4C$jT<-TnSWJMso+h?*jeM+Juj*Ca{ zj?hs4+X+U)EjM4sniUN78PE>}P!m<^+prT>huB%t RcFX_b?ntK!5&g~(!sBU={D4(r}2fM;d?t_A86j&PiP2mDNFw^!WSm%@wP*xR55&!@I z_y7}M&XM8+3k!bn>!4moKvdZ-zGLC^mqhRHu8UETlEv zb{&*{fdJ+|$eew*`+>_19UYp^+fb@|2snPv)hx*8fdg(e2hV#t20?vYIAj~!3ytg~ zP4YX%j^eJIgQ(!WFV`GzC#Md<9|l3S`Yxu?vzYJ#$VTeoaukGt0kg&(0o~mz_nT*d+P)Xl;6|6z&D3V5_0PGE57&F5^P0E!>m|rb``<)X zy>?Jx!ec8gZG+7mS7QbJ&0k<5{nKx9{gM006<<5f=WJGr%OlZ@s7gS{A47UR&BlJ)@^p zyp)Z{0Q>p`@_-$vw|l>vcexGn#%(n7#ih0D5Hsd989aLt-23>a;neUtvbOJ%viEwo zb&dbAQKrExD4`#KbRb{omm5CuL`0vGns?}>vrKWjjREFSC1-|o(7?d3MseXa7@*(l z_;GnpEWiB$06>@*o8xm2?*0=fM)!KPEe^eGCGEaP9$n9a;3fq?A%RtZpiEbiOO8;| zIlGqLtyk_&EZ=+q-5b)*(&oTWz0S<#-Q}V}M+jja+^-!15Ac&eSyVv9ttxNihV>P| zMKu7Xe%gKW9dDsXdHu9XwN2_8K*G>39Zj$e7FBb zG?cS{p03_3sQ)J5;SzF=G&c|gtrIrt)p9F{5xJxuZ&b#`2?g-CDt3yP18kIV#RnF3 z2Rqh%dSVfv0IZc`Mp|Q^P`Bs>ej}kL%PJgX*StQDK0ZwEFNVwu*q?ohF%X9$)MPH+ za$vMt!HCgWKGQl8^C&cGqQ?vENdVLc7wdUiuSrk-k58j^bI^r-d(q1N(#g!th8Fj=2(7+XVx1;W=|XT@I7kUG0cg@gLUThf>c z-~n*o^*z_F`x*%oFlsI=gC8{w2z|V_%Ua*_Gc!`Y6oq>Df?ao4@$Nx9GLXkxA2U#Y zQeD2239L6sLMwASsMA^edMPRQ#OKMzjI-YRZO_Y>3O+ZK3UlSGwOSTjpI2MJB?dCH zZ0pd9LGEVvOkoa-PODkDIGL=wC0C-tPZw&#EJ`2cDzFS?%gWI4a18^leIKTZfGD75 zVg#1tM)}>7n?{n(o$Fceh5J3wL!e*h(A~p2mq<~!smCt771|HWI+he(?Cb9q3o_~3 zorQOTIumvKaC(Av2lTd`LP1GEer&z2;q)g|*CV=Zck7(s9&)|0d)f!fiha}yd}{};Y?QU`*hS!+q$&hYsBQLCb% ztIuDouiP=C39GfNMoKt`8VQudl+}C0h1+D2M+<_LgP_weE8k3ujJ=QWPRLt-P%tbX z);SxcX$x>(qTU_6j&><>lb<&U3i2}mJJpnR&u+Q8n?Xt zqpn_Y6_gXI`eCKppvUMoKd>+Vx!R^jr){lMN8q`75o&n4>0?+uHj**ws;yRJ#%etP z>~v88-A+S6YshplWK69XYXx@*@^8iMbU(p6JGw2F19ze6kOsFPAgu4YkFXyk4t>0P zf%U%x6-oqsYlp7oHUa+fG_7{t)3Qk28Quvixv6?vfEg$D;l^s%pjJ104t;V$jR!F#@W)<)FiYa6qO zg@WbZ>Q8kvZheQ3(zSC*HVfUT>#Oa9k{auuK)O&z0ITa0t}#Y*ec*kC>08emtoOmV zzL;sgd-#H>cQ-Vx2jzeMO*ARmm8)6uYa&{!ep3Aa739T9LQqOEJUc|f;PLXq-&5Os)U`mW(grO8MXm%j6{jeVEdQ?5|aux)W(tNpp>*3w0jt8*{M z%uW#8j{gqUIlxM9q@mjx216JVRo8{SEQvuOr=mfd0iCnQJ9|NdS8pDw_hJIP^9Fma zC1`i2{Wf}wPt2%=6X z_pNiLpKsOsHlo*)g8JdZu;5S{2^gp+Sj626M&lRg3!V0c8hYVixS7m@?xDn&7yX-l zp+vO4MBeor@Y?zxmCOB;(Eh%GcKAtkbViZ-2Mp@*d4#haPuHNn4$gb2*F3sq`o$&z0BmP3u7jYc!10Dq003cf z0WkUr*r8L|y+af=-ujI_VajJ`Q*8zdCaEbkoKKS%EypnyDx^b!ngSh`+XNuBB1}HQ zQUS=%cA8HBfC@rB!YPr0W>J4A)e9Gbda;R%{EANQ0ke9WLtg2N1S!yaiTEFXw2y0E0nJC#YN~tw3%xDPjPiuT854gC;AsuA+@j zck>*Cuoo2Un*_oI^e@&f>G5h~i5`buFN#Rgjgi!Q<9pOV3A!CKOhP`Ac zfDV8M0ED6g5Y3SR0OSD``3Q{S;tE2>u!?X?oUOdOc^L#UMr}U(>{NLzf8@pUnt-CpRCNaHf+SUK)SM($zLmQIx)nb36j?j~I)D$5 zgBm$l#D@{e$cX<#j8TgBlYAl{Ph~q7-zUZdj8avE3RR}!vIlab!~+v$X}xu&;P(RzdW0ZS@qq{Cw zBs|%W5Ko2wBex`-V##I6){vPz;bY^VBEbGc8ps|V8dI2sOiHNoY4>Zo7D}9dVsFCx zo8N|sXhl5$S*ptmF>F2t+Ym1iBj%z@m-x>c)@#R z%lK1#K459UqhY2rl1N){V(TR%1ee56E9ZLzhAOg9p|p4<}Za$5x}c^j<3tv ze(V%q7sC?iV+=Qk(OSiulh2rJtWftCV?xsXNjv?Fz8<*z*1+HYuZxygwG+3-^myjH z){X7Nz_JowMjcVJJZPK1#de2Ih61MEeSY$W!ybT`o9mAyY;OF_G>voCaq#)D}|8trv zEms-VSmkniO%qD~XMXN{0PmXcn?SGuS|I6JIglj2xl07%}bG?-9@mbRU$y%#cb`^WfeO^cX(PGbNXY{FIUSm!fy@=(>H=S|GB*~^@uRM?rm`Hr%o+-+V;j&UmkEK* z^4Q&WfRfC5%X!+d=9i%!1w~dpg3FKA`lzj07xbym#-rX9K>w_UHQT)Gp!V#axx)6N z!OoXC%M=yhdpk#kvU5xZMDEh+&*{wC7V1Wg!x3iM((N&pcR9z+z-)Bp@2V1FYgom> zc?B&>{uaTi^KKu_a@AGmwDbPyET3}(F~=^-vQu5V9EVNB1PU=BN>$8FdMhlQ?NNI@Lwh?5xSs^9~o3Gx8)o}TTz=%`*7v-&XJ6q`DfBFd{ zGGGI^Y=AZ|-fZLKn2l{vGtLccE!gBpcVcXH%&Baq&tw?PYj6W+T4g3mDjr&$ns;MU zqy4VG0=;_lb1+iw``9A`?lalFmE>Wjr{77-&hB-NwgY+Kml65B(B|%x9~HNpxAkvv zgrY~U;x>N`shbwredJ^%mOdXV3>+aKj*>bjdF>R=D8H+*f#3b5O&#Buo<}NanfMj2 zB}jV6D*^@Zy81$|tmeC$J&T>bar`I5H9YkxA%zL`5-`JMkIJ#|D1Tt6hsBSe{&nFB z%#oV`bt%~pW{)iK46Jy(_~z&ysc8Ekz+?NAR&ESzi{duI<<}_rd2Y!?4oX;n+Bn`; z8@`gKJMGDy=UL)Ruf7<7L^>_P5js7PIc#zzw`S5MPhY)0ZoU1}YQLkW-ptNT+)UpZ zoCbq=tuta`YzyqNqJCxuZ;R1gcF@h(<7k_Bz{F4MnC8v>NTpmBQlJ}H;djRmM>(kN zsk{oi+=Te}l!4%mM&^IQO0V1IO!=0dF8Q9@VM`%Mtv1l?ri1%){Qh3~|GuaKhr7vV z<|`?q?j4o>D;U3)_{yjCYu0eR7(dG>c%s#BN$*|xNND2KB%bXA zB}Mo1vxU0a-uAt5bJVB;zq1(R69cQnhwn@jpIIv6eH>wq7ptZj4KCRkoAcZ*wXQa< zS4%aDELT%C7iB3b|JjEqRNjcYF^tyCsIa77rCX9`806Fyr=?u9)UF!}uyp`AXSNPG z@uu2r9c-Ohpm#GXc76%;4m@)P*}&{<$JuYuzQ7TK+jLZ->&JwVO$!5~^UeItUqGOa z0LS1|?GM}8hH=Im=_}v3C>xwv%o-?kqNb({>~FG}-Jh+Kg@vt*>gUs1&0}`b8jVcM z5|AmN$GYg=U~D)d(i-wT^M1#*WfjM;LJ0XC$4%(c;4;LfUkptA=@0xg zD%IYK(0uEeOD0C`M`GR9j<@#)uemA2(jVp8hsbcr*Th%94< zj4UTw%FRDvRuRi${*a3+ll>u$NsKv~9@Eqft_NH81b-691~2;Q<5@Vn6oU<&T@X;w z5qarKL4R*+<)15uIm#gaG>5E=Z!a?sH0-SG6f?C0*m~YbAK){}7A2MFzQGR6;A|#5 z;$7aEpsv~q^V14_-TSYuSn}qHcN?wI#A%6_rs7C;xTKO^{QZILBbSGsmzBb6S59XY zJ-&XIuy)MYY>ld=Wys2g$e72uOPYiK+Nv-)8yg5C@jQ8h-}0~YXQ-kf8UYO_n>U+b zB~9?;-}D2*Wu$lp65r9~TI;GkzEei1g!-rWgZYj~lR#dZzpg3Usc9@K+4A%&R1s2P z>{bLl#<`s%-oh>UmX?`9CSD3zbEuSzDMZQ3IUXEJ@h-b6Nl#rzzWBPdAVC>&5kB1Fx+ziB@|!Q}{7Y1^rjC1Z|y2Lv71hhW86J9}IOK ztQpd-wcm`w+2ahX;-|Qz=@@deYbNnSPsCDdv3?jlMIu{-~sySEC zv%RSAP>^2kUK~evK$djQmKWO=c!uQS*BX*3wg>9S_$p4e>paK-@Eg6M12>N5+*KQN zBK<`x`Ag9%re9|(E7{<`g?Y=6TT3C|APBDd{jZt988y9B(wsdxCfwrk&rTlAYS=v@ zM!`9ey^mng*GJf1tU>$pkb1c5zVe1=r=?mHdLt*VBvGCrXt~$ctgmn|Ro=yz9*7+# z$jcRh`{}VgZ6J*qi;p0F4w4XKR4eLL4_Yx zhKa1P|BEdk&D@lIcFIs2xTUj!ENiU?sc{%Hccw%16$Nb(mnWp zCN#*A!aT^kC>m8#c52Y8WUNDO%7m05Ec4iK`r_-2qE7?n2noqKl94&Oc$fo-wG3!~ z2B|X(%QX7wqsHiK_))$gtZbHDBv&bZJe@6OG8Q?&W=#547)X8QA*i^DG0s9|lbmy` zj>z6}^Fb_VDYhydWu1O=MRi+AQw}ZEX}51=dW7uV$JFlMp5EWpM)w6kMVcf64=-Ca z8GgEx%;0$yp6s*Ve~tB?RYD~!I71ACx~Nik-J#=J4I(+cZpt&kx3|46G7h) z*esbgMI1nz;cE^omc)}c9kh+wdUwhds{nIo8MU11M3f8P@)f;3B2<$>cp%Rv53f0w zd%s6H#jzv`!3GnkOL>s#uh~$8Dq@;MYTHr+W@Y4=+b=AcQ~&U}+*O~Iv6qvF{VV_2 zn4Evf*!~tBT?;0Q=$y)V9W#-F(|?%9#kMIB4&!1Y;v2_?sz;y>Li(Y7VRNM081@q+ zg(!PYu1!k$FjGnepE*;i2lWIAGAF@e&}q8e8@oiOZ%9ilI5x>vmoTN}&cdfD{4-Fy z&Okp*)prqnu^w2WCVw;cOpCgLUZod?)P zrOt3MM>P6MZ1lZ@LwvboB&Y*mVM&R)eb^>nMxk=BgwGw9uxv3I?BH?y4VRLU;Y36! zigk!;iKE(fhBUf_D&vIQjhnh@&dbDnw5d?Ub@?fi7p*!4_WGQ!*E%g(}4dPX(#V2R?ntCO_oK$*(zFZ z|9m?bs_eQcIs9rutSN9s+b{O@xrn*+0CG+{^p;*e+qo?X8NHx^S9E8%4^EtYV;mpw zfpp3-wJ&~FRt9(f?Oz7^>%pHSX3r$%0GT~pHVu7>wf1@^`i@q^wf1_%HJfyDn+yXD zo+=#{Vr)h}5poxrOzoQG3x2}8T!|!uCFRuxkLO+!Kl-^DgT%AxcndIv<^+}I1i6Jg zZz-RUjHED95jCKfDy)nuY?S11KudKE_H{gXOnvRGvRKtrT-^8yEtjd+{ZS(D<~Q0G zC%lJpV`VA)5ANBk&4I(cKTkj4wZLW75>lS#zefAC_g9$oHB1dl8x~{f+va%Z_{6eD zDXH8{3=XCQL_|b{gW0%-KX8pIRJrxIKjeY0yo5AS(I$1sN+PwYbWX};!0QSYygHg> zEVxrAug7?Z+09vZx0UHj#T;)R$Vh>#3%|~@utaLHrkf55kgHgdM{1uBSJuWYKsNBX zJNrn{EzVv}tho4wx*oqT^f6AFSz7(aRHn4J7=)Z0!%=ts79^X*AJ>*{Ek)aWF{QgT zbZR1l-zGe$3qmgaD&m3W?{M@#K?C=<#mwJgE~AmD0Q-V&!~P)%1}J!+kukLx)GY`m z^wXv;%dM|h%supr=UI;j4Q{U82H*xNdV0bU7iPucjHVHM1X>r5uG5_iv%Y3K95 z>L0^co_hG!6<>`v53`ZSvJjH~xw(D(-PnoyzU-Q9P0~reRQf5K7&&A#bEz1M(qbr2 zATtkw+G(%Lvh`@^&i^a)Z-u~KL2GKtrn7vIO2-beZBEU^dryl@T zpH)O&#r#^~5bT&yDoxG(i$t9`YwTn@xjiq7FaV#r+5E#D7vE#t;w2R#y@w=HOuZxm zJL!oo19ARB;6O)_!QUt>LoBrJnu+$oyVju>=&e?U#kaHP+hLB0NwPYyu}|Un5pVOhG-ImDX!7{Bkk?Lz2WlfIU~#hQ zT&LYw_NSN+d_>&Tc0W+|H1s&^cvQ@b9 zH~}hB8vF4AKiCOY4%_{ib?=9)mrWSXPJ(8;app{erUt$#n(96*z`~+Us^|4lkv?$p z8q`vABjA%K8{X8&*B8;f_R`d%F|M|Ud99|yQ)?Igf8!#;FdYk3>XUCa@quQEC_GLj$+NhD|?Opm@X1>iU zf>vf(IZOp%hig3d*Np*FEfM5mf|VxX(>Ekb+yY z`eZu)04m&nhvgcs;9uA4g@)tozZR%W^D9rKY{*n5z>Iux=mY@%Rw-cKR+2m~+(gEC z6%1xwH);E~(yUc*obvGa$qj`yTLCoyXOl>9jwShgYlOTyfzsl0Q>bvfN9>S5hPwj2 zP`M_)&;+9pLjqcNz(xmdG9v5gz=L;9!w~UoL1&opKkK1FODTJAPX9rQU0+25s|k`R zA@75(ur8c$d*iG*2c0qFf`S^XHA#C;Q?8SBt0zgMZsqtxr)Xsw7wk5yrk@Bmb#p%< zhP5AEY@fA`-9C$gmz@w8^-YlRB>uWH($V2JUWZztC0P3;(w(&VQPIyz?0?zP>uKmO z*9#Y3E0{Qv#vWhNKAdw2C|zIOzWMnt!1tMYcm8MRnWo{)!66<#zzH(#IABJyigD9Y zplr;5%iWRg))znNIS<53QACJDR7n1L1ClyrRMw27(L8g63N^(g;{wBwC{+b8Yhn_J zNSKGHh|7=Ny&mP5^93eb`C8~tXS-|lYFlUS5$}k$CG(0Ug8aV5#i!B>#uv7lvs%uegrAFN{ewdg3lJp;q@neJC61bGfHhI30LzyQU0bPZu3HX-p0n!LeJh<3OvAx+7a1a})Y>lEHtde+a>^O>-#)DF zV3HPTCU7U}czfl&m)Z?eCw``^t~k3 zojsvcxFxoyDu%5J135g%`?#%DhFE!TPU~Q7?K6w56`GWPZ@XB4^p?jFht*bUGvF(E z!4S=3CY&#fRT_iOy81Og7iOWclZWM%5XU6aG`MePVjy4pYfqnOje zVWp$9>%+A2c2v?eG;Cd1yA*g=HB?t%EuDK(*d*nT z{JHa8WmVGH%g@Sr1kD`#j-uo`dd{dE+fKn8z}hy>w4S%WZVgWrRlU~Kcn-_gorg8| z3BJs;6vfBt=n5|jO;K$0HBjm=xwn= ziD+N0tzB56O({f^Oq$y4>(t5LMG!IKyLwaNB&^B4AfOZv+0sZP0doxr=2c2&gB~K!o5+w`ovqR`pAO(Jt0b3AP{>c+a=>~|Y|pKYH`R@RjhJe@b=O`RKiT@9z; zjTUG^m&2&$*jhp7A;?71GlrIb@=QZM`Nn4)5}LGtuBN;9J0(xq?qbN+j8AZ&l_ zQ*YxzYic)QwNOM|YaHiMHS~Z(m$>M->;z{D6k7JIyG|t%<6rqtY=Vi8xYpeRfpPfd*;t`!Z>zb2>To6I?D}>_A$oAw5gG1DQ znqh|$La6z&^Qjm|kU=RmQD6PH0>5Er&~GPC_o`-d`j6z*YRDfn<5(~;(PK)giDdDB zK+BTxP9t~wy#UkJ#ZF3RX8JnIQH2B|Vr2YyB7K%Y{W|@!j+!4f=0$b#tfz{yadqZp zxh*5ImL=Rk^Eyi|O=Ms=w*s3i$}bH3f!6Re0L`%_M?XMqv%JEjv4ebk%rkMi&umKyYgxE5|H z4Nd&K+&lhMEY;*GLvm$&gAGIy8|FcJ1}WkXGfI1mgw6tF?H6u2OMU_&M@Mdagp!=( z@gFR%aNASj0$13}V__5tKq;~O=r75D&8gT#|JOw%$Al#?+kcnAPtLYGI>{EUlax5= z1z48mXL8Y-+qJtv;2*g1gT*_d^+;<xv}OH}EmfkQndu5QB$+1jyjUaal`MeB?ny_;EiQ1nQyS^W1+;(8Fidd}imBNA8J^bBacTg>PlbM0U z2}Jt%$z-GQtVFUTZ1VI8`ghKnmdPehTR!>syF=p4ZoR^uaco;JnJh7N(x>7M#QHb2 zN<~fP%wNv0PqPoiL@s~lc3G%MCK3rV(Q{kY;hv?DIKit)Is9g`G_{#@ZdhK~<&uHA zbjP2S#l#ZCu4dyA-j(l2OoGi@(Eo}Q+ZyP7sdcFPSLpa*=aATbGFDQm0>CjSMMtWm zB`Wg!H*outZC{-1?LPOVyKd`x7j4nb&URtW-sMmK4oz9S5j#QgeBzkqxFXDXZ}@x8 z<$6Hm8T`7^lSw+K(?|lV$E7~v5weQKcUxDb5Co_i@k;+tWQ5(}C&#@sS&Oq{Q;pOYmA~}TD}t6x$bnaTA8vV z_=mpA<6CAtYI&p>@7mGwwfz=-NzK5GKEc4HGEst#6NSlDWEHclohA$YadF9_RLm!o zAKPWuTh4)-DoGg|C2^zM8C3af%o!_tyR#pQ4PSc23a)(__v74oMj<&z`*2&Z@a~IV z^7_KEH{ZTEvsI)=k51*dVS78{zK{mC zE$h-Kxj|>Ih5Hrf7m()icqqZLicRDE5a;_EJip)kukr>@V!$5yNPNbofbV6E)X*9U z&Y<%vffTZ)q<#&q!Xj~aRaN+eaMQI~=bqT2&+2W%x@_@@oDZI0c>%i#tDfO*?IxnTy*p+8ra)}3v&r4*CR!zo99 z6enMmj0#fVFI~ErQEBI;G9o7T6&W>(C|>GB_Mq*tNF)(G{9lq6#3)qORgJmhpd-Gx z{Lm#DP7)b<9`VPuZYms#AHO=OS;1oMJ*^#N*NL}MRVe^E0u4OO4}!5^LiP=tLu21Q zbPJD=Q$p0>>@Ye4jTfK&ISl5|ZOjSCXa^7CpN3v5yTi6S!YF2{=)R+m^%{x;$CVvMV1m~EPPq*YG?jSTPZvrC1x(kY5J689sQX5u9PpHlmD>UkGN^xzVtE7 z%dK%O3(gr#=lzhU`?zQJ5#k4@K@vKM^%cX_Gd~v`;nw$b!qZGP^J3RtxFq&Zujq3V zlwI0UBx~X>85%29vECT3#M|ILwKdBl#o_Jz6`r=(1xAnen8|g>=(0seCo39NgOO73 zP;<;)zPkPwUFpyb$Ri|G|&+`T4 zBN2T}JbhIhmwpX;RkM`!>5bYv{=BKlvxdRe3J^g`2TyGqu};d)Z4SEFs6Gsi5K2-# z{T%{(;EzHzwi)Kw#cCPyL>-p!_Zja@MQt`ltnoZ&H_ zA=7joyH6&;6Stl4!w?QG1NLMK5k@oZpK&GFl}ddm6! zKYUXf2qBGGRzwjLY4a5@6Xt-U`srkpO=W^dk@v`vzt?&;!a^(d+o-#dpxXGhXR|!*XEuWo|b5<9X?`7?^6?1tw zj>D*TzcmwaaW^)mU)0n73F?Cl&A`3>Ty|;HM3O_Q_V}X6F$1fYd6rR7 z%dt%*C3~+U3Ellc@p5V=Rv0Ir^sd$N+vDTK!AwYtN%($0GhFdJ1$27)*|;z`qlDC+ zJMdT#_mQJ30?(=4O+4`ZKisjW;R#}L++#Ygf7~cx$02uypT@-;USFB)eTgo}c2vgdmN&j{J^$HR1pMTi}Ez+tB7d zF0DV??1LZR7~)IHXg$ihP@CBgyDYo*nff`RmBp?<=(qi}dZuH+#scuK?T?H9RRt8z zBvgH!f3?r-&yn_~bGxQ9gVBAzF4CJ_#A)9?^0@J{`t-}cYjd1>g!i_w{rUV+%UR1N z>gYM;67h-G>(u40SW%V_XqJ)Js3{0A{Tb_$q2+sa_Ai_ELgsIp z=#SQSg}g}GlBB1P^Y2wTe`RG+U^IfiswRmheD1cbFIc5F>dSpao6N#tn<|YB>5t3n zw*Pnx-w>mrOqpiS%AooC;^nVz3w$CtgNQ<5JAP1>i(Yv@P9*9dA8hkHoRDWD-p=2@ zNKC0~-u$cPIB$x5b9i^)Jd;>5eNU@dPH}K#9rPvL-#&Y9B)89#S0Gews>R`@ud+dV zUa`N1plnFcC0+scbYIM}^$ErS$jVtfdJ}>FxQ`du;fhaGXD) zg13Gu9=v|DgzR0&smrnTKNd&_`LliT-NPv3cMNnHmY)M(~odD_e zT*uB{*EhZO!6KZ%t5q3qt$?M+ayO&hk`?(zTkyZ7-%r`}l-mC-t*IY|dU0!CGW{d4 z`gdX6{qNuBI$IIs<&`{T=!kj$Xu}HMb**9h_kY@~U*8G#E;4KXPU`97ZmI7oo?jIu zL77I%5dL+AZD1P_`VKZm3=JGe{^~9JZ5AQUv3%G|q54IS_ITU+AEuo;T-nF&?f3eO zi&S%FRp6CPr#%W zcT>;}+csC&9=l4G#c9|G>tBPf_NTvw0xoZi z0CXifuYJW~bgs&`KzEav`r@+E_Z@|b>4j}R+zf0#pVEI9*LY1cGc~0@4(aIyE@Cz( z?UUegCc7v6S+UXQ>Dl_6+-2Y1^YRwQd3nW_xmS4;>C+}_O+ZsxVN`gs@iQG|9e(~UNzB{d3BvV?AUIx^?q&6XO^-Z{V8J$zTI#rAm`TMaEH zT#-bYSu4i2|5Dq$?PTN(tQOYNEEj1nNi2<7pl~+o_!U+jgcP|rY`PTw>_ZJ z#Ugxwuj6wxGz-Zwc-k&?5-$0A z%Raho%923R8)q@LPOTRkBa)s3 z0WwW@G3SnX;`*tZHC2>nCb%baG`cgCv=RM+HCp(mZnBIOp#z!&U^xovet<3$U5@SX z(?i**Yv2W7(2-oBrS@Ub;Cwz$R3i9d!P0*e;}_zNNc3jX*Qh4uFGhG@$J}uGd05a9 zW6bvlF~SfL<%o%y!*Ag7kUBbg3KLY@Urk|^Xg({4qda_xCxhL@YK`yKm2c%`+3seK zDd@Db2!r^X;fSHl3h$3&)MuUwF2mWDa|9#Dj#vNIe@yEcSxg?cBOjziH-!F1d-g@; zdUkec%H2=E9y@S1U~i7v&9&~jI%-n*?=LC6BuGdo#)Ck?>2JHvD;G9rvvTwgIY*6P z7Z!YtgKYPZNFTaC74nE*J}`66rCrV+@pwha_Os*6p^DSu4*+RRCh@2--Oxi1{S}GF z-<~d$hZ-bd6G-qNjX_+(?Y|5dylf&EBrS@FAFFcky=yg4uZAQTh}>q0Pc6-fMiay3 z>28T9a6q@;0!)y!RaXMygB!3bdus=11LuuL$+MXJvp?T#qQPp=qzOndOwVlX0zPT@ z`-{QHppNdgNa$n5S!Pmi5Nnx}bm~?!oAm6Xc zX77pr{{R9&{l9)-2ma{wSmh#OASL`g5VXk8A`|4EhT`JFLyk=aa%as!Wigjvj*7X?kD`R?WS<; zE14GmF#oW5PfXVZY}~82!sB1^>s?u!T$T~jw``qsoGYAGyqBfT@Kc8jV)#~otyPX( zA=@=LoaqK;4iKhB8tB36fpD~7pk_iBg4gfNDxsHQVgPsrP~czX~=bg&@cKeyAE8uU}lzcO!=dJc;|=*&s}CW@d>0l z(#?l+l#wBO0N<BtA#TwLAOc zDBRyO;<(B_S19F3uRA!GIp@A}FJK??>NXSzxmY+YV==P7k2Cggv1a~jr zzdYB)?++xt9?!Y=7#IMQ#D*f5E?lpFqfSEXtUv)=G9WI52$xb=!j&)3yjQ6I+W)}O z-{~46(4L^l#i`|kg#&FG2kzYfrbQ|>^H%wq9))O^nNN?}qvl&N?OgjfJ$^-RkK(%i zIu%AwgX8Zl_zM@JU{ljg%FG@Xy14G+WoB#JkTGE5!or@yoIQJOY}(rhgT>xg;&IT+ zuDXr422t+N+=MfGWrV^^j3C^(&8dsu9MEtcOgRKQk^+QKIxzof3>WaM7yF-fr@(CT zkGd(22qF#fz9Da!zSMi;|8qEJ534$7FgrZ)=*a=U>i#o$Mh4u-5QsnlrgZw@G8Ox` zZQ|nM-|-@#Nu?;K-m2gg0b?D!){WM{hwSwlEh9&V!eDSa1 z##N(R<2p5lUQd*)M&VG%ElgWGtB9y2MK$bv;v(hgOgavmbI&}@LZXX1`M*#<6JOR& z!Crr?)t3KC`PfQcj0)(&Uj<$ABhP+m37H58bpdyD@ud6wvmI#4$OenWrC_FoH87~s zPFyltNR`R}*Pp2fi6m&aWI|LOm7Y#|HFB=`7T)S9ESDKv3S+1~0_Y@=U6a*`M7A8R zyBrUkjf$~Sp=A>)0b58wZsMk!%CeizQn#26Bekw_sK(ee%{B?!giuFj%r~GI;G+~c zjgOYSQCV-BM!uQ_w!Py4AH`_YidL)1Mc(+0cZ~pBSP*j84niFXAT=t?A5yt+^PM=J`oB)1Z#z3%@J*0AHsEGj)EeG!8Q)HUfdp%{ zdX(E|)`i4XwB}0aAgLn!Ew8I(X%MD@n6vRjs;<^~x4-G4(QkLE`^LFC>PC%PM2vw? zD1ELBaP5=vi5r^Kg15pKd@ZmrES{N8VXBG-&zpwr5M%>@DlsSpzCNqq>fLr*x=Cg= zXZJ#~`_wN_!ADioW)m=DY5ouZizTqyX7MskW?^@AxFUq zs1+6A0Ykn8Y7(l`Xj+!Gxph~L1Zus`LYf4Oe3m?8#HK$LEkrVzOF9o;{>I&j=6QAe zUT=#3f~Mex`&;ffdVggckhXtMysBaLax>MvBIr8@J$CF5*&1T#+Y z@L#(`mFxkro4fS>pT!})@XT0XkGN#{NKcfAh9Rh!g8OgWIEehAly_=Bk3ndvnnJV9 zy~jy@cG;$&u+j?@F;PlhGd~M$%^Q-RKVILv_k8_a<_Dz9^Xoyz7I=RL>^C>n-*z8G zm%8p_(UmSzjv6S4%w|s)d~ZlEZ>9JgP7qxTWL>@{V)@Gu)+!zdQ(*L_M z*!DTF!(eSrBZPLAaN>$4S1|AWpD(IF>5N>R0Y)1kvZ`qf@Rh4n2XiPHwZWx) z{YHYe=M4A>bE%lAsi_q;B6fD-;^Rv_B@rZ<`;IbAKPB!*i&F^89+S{&$D4OFz#G8^ zBENH~)L&Cyx#kk{p;Ked_;WU@(L^tv2#Ff_A{xd9usvhe2VnZ`b5_2+?QzlW`e7Uy z45tx5k_`;3eDq984nf71ki=P}tdTSf=avd%gJAomU(kIh1Rn9;{J@@~Px3ZN2bQv5_=`*7(3@a`vdISo$f0_14}QYqB80YSYw1gfBo z^dW3P$WXb)Ur1;BHSxb`IcDa1rki+94ak34S!$&F9h@2OSSqflKJLOEpo zPKqWKa-bWqA;N(k+)*Sezl4ipQVjkdXRY=-ax-)69t=BijnEOjVB2G1Qvw_{=Vb|u zUx=R_Q^h_rem+>p9zxl=7{cYIe1DJe%CuiX`WyNgBfM8&f-HoU%olF*Feud8aNyOj z^8Uw%Wj%~ITdHJ1)78_==6RjI+iGxNq<-A0W5J}lRD#DTe^>NEdz<}!ukw zJ8(c9^`sWe~-e2hk;ap>;9H?Bg-%>7Dn>sg<2f}9YgV3 zSy@>Q($dm?QRE0v5vqQK!T~U2p)i3E4&B$+*W*`nC3h&6u4*0Ae!J9*!MhNZ9 z)VD6O$O5XU_ctVmPT-$5X(?SQ8q*LW$&)5Lg1Yi#88U3_&td7fb=8X)9uc8!hO*{W zng`6b?*IzR)zzy@`D&DR5zRpJb9iH4(%2%jY8#06-bKYE=YHkmFhGYV-w`M)_S5&_ zO?HNa5rQ%@2i71c4IYgGooiX0Zxexoi054NQyQuYp9B2H@M!C9`Z&@*OY46A%FmUl zo8R)gzJLJY6eq9WD(S;`>^bYQUp8M|dyX4XRiDng06-!Qwlza5R}78nf+8>)UqgL` zV2iXSf>?F4zv~=ofY-#u{*?;puJn7Dq zTy-_u5El=;DQ|e+GktJyVyibEhReTz5G?46Iu9S0@)TUB*G1hCw8kWI+hxyMkR4x3VS63*HrmcbbaNPaiOg@P?0bd)jma) zY7I|)Z2IpNnf(O2IM}Y-0e|7d(Ritdmqz{CB?(j8$8(#!n+d!-%Lz%gHn0mL18Zg$ z$&hxI*ZW6IMjo$Vas1;t8;hv5r<@LwPhSpC!4M+CRtt}R*yrSq zC04Er#L^sMSE18oU3 z_`B>6yn#uFS5G3Bv-x?|y|3;i{RkQW+p1wwkrX#kJ7^Y6Fm#yYQrW*0E@AKQf~-=o zFepDN#KZv+ZRFO|)9KSe3CsfGj8LW6)3^A|7~wC3b3FLSfSjyp1W<IS)NQp>(A7ds#ktNhbhR zLa%XP)JRe>3YwG>l5i2HPE$ z^B;|enO-WTikvC6_xS&#R$wQvTA!Eofn zl)RD3B20+TEk)hrEn?titvY&8vzt^J!BMhCIbrZ*HdF7D{VNpRwDg{2fMsoH;x2J3TE}eV2YQZ#3Qw)eQC9^R{TudnCyi6OZ%EO(v$ zy;T7LiNs{`aMdZZ0)$Wsx++}i|eMs2egE$&#*~Gdfekdc+)dcB8woH@n)6&d+#IkszI?}+&7vxp!=FZ+2(zLa zC&L}wNz02d1bs%Z>eN++$x~!8F&roznVAZc!jm$aK4whb)QG`kQB+Xc*o<2*Ww^7J zSWPlbA+Uy%W@!{SOW2pKIK#r2%x1Y#cRZC1|JAa2TtGZ*oW=(<=#!YQUX~n&MUr($ zRwyaShB0|E{2FY)4Y#)oB|?tO78sF!E>oIsl*Gq&X*;cwR#u>lL`E!8Mk^GH6i^l@ zD4?ShNW_Sui3T8{5m+dQvM4MTBCt{@uu({e3a}Jdsw@@=io_H~C@hL9s)B&9SgNB1 zNXA9+r2Rr0vTpC)anOO`24W~Z-TNAKK;eb-(s&TrQneNb!B8f(Ef!D z2^2RrqVeIoJ8fs>hlYkClS~DM&Y4pf<dW~?{c zY}`3hjw}^wLzS^sV9JGZS_WGyzl&HbRh-k;aNMA>SKMr7e!-?86s+Zi7DEv3@zZ7- z2&aK4&C*sy?_gl4;^Et)6GAESfUjD@yOQ&ch2B`Is#noN8NeYz~$d!<0Cz^e4LRpC-;3}%q2<+Pb;h;5Yr4X@}M zUcNeP&UVF`K-tsD4%D8iX_3kYa&kl1ciO{T?AL6h=EuooqH|0`gwt5`XdZ4|I&ZPq zhnI`3JhBt9ow-A16SWG4Zgt330?BfPLg1Fh9T|^XLu}>Fnwv9|*y2U6I0%Uq$z-W3 zF0%uK?d3_s!#(@#JiRtinDxh&au8UdJwK+s9X*WBT(DiKUtQZY?G?SY7@D$zj@FLH zON?2JEJ(BQQR-%GYMdtMVk{Yy^$^BM$&_@HYTR|I1|~45V<2vuUNdBywF74s!Q^WR z3z^I0@;vPUcyG+~uw*Z0X^}~rm}YECLLg@cW$3}aXuMt#p;>og4L?a z1Egm?i`lR%5n0)5{lyEhXVM$&-=uqANYAD3K9PX{H&dnPX?k7dbX_eupdheL>Uu~P zQ&*JR@;l5M6Q(1~D^9xk7D6K-#hse}v$M169TwDaI-!RCA1^FO!oeS1CKe*^KVwtc1XFN(?}5N-T8`~JSK7wUJ{{8*1)mScnH^>zM3 zK@-t6|Cf?zPaay~oqrM%$7()gwDEsOD_}MXpMG6zU%0yq_+`0VUlxx=>J-Ti{LerC z-Rp`cUO^;srXsk6=92dOB}Tw?8k9e{kK^<_&uTGAQl>TPAQ&TcxG7H&(; z!tjelc$fK4qx#c-n4%SfLX}{kFLd4V=LHbqnG!iXoCEpeRMEP(aT!vJ;_?62s|DnISB({ zOTfd*la{$WePBG0Xi+*yL?LjVZ2WetnBhNXu?tCr$p>=(Wkbm%PbTQu&sg!illys^ zc>ng%+)-18*OoBaQ-iSTAVf3yZ1kce^8G7_h=KQy^F_#^Kb*2RJOg_yQ!VWEOE(vY zH{AWY9-{?C-209{a(nr9TLmq@oX{pxgV4{y60n&HCeDEI7jd7qbZ)<iHF8#*BeA_NQOmGV7u^RgX8=3W$EQ z0bRaiJ4%wqQX(+&V+P&~H(6Dps3sPAvM{q(H_MSyVxk)M$sgPnL*KGZo!D|hx?r%< zdr71*Szesd7fJQ0DguF6e$k#CcmCJJ8*$ImfGEI*e0D2@yM^PVG|%7Gc-M|TU;?O# zO{qG>X}6 z^K~>7$WXNjuioVRmEQcDc@TB{6T$8M3E&%ah6|{M9o-pb@5-g|%n;5iuReQojQPXk4usBNXFidD zVD?P5Hqyl)0!X3PP^OFqD3B;3Dc+@7FtGv<;eSBub|Q$cbdjR62a5;YpHM?E zC&c=6hQBLd$RB%#D243QKU&r(9r?JX;-x=a-h8is z20UXJ$B!7sG2^ReXJ(;4@(Me_yRqqmYa$iPF1EI{(SUCv7Rbbco_UAiYT~AX1RhEv zQcy|>Nkv2`Qh}or1hm6s6kL)Aq+k?W4uvJ}oc~SRa=Y1SpE7Q-remCq-$!eo6SIx= zOaZ7e0yNCcQk6$k%T~%5OWGiz0Wup;O*nBpC#Qt;;bb5kcfWv>Xhf#f&9pskh&R3>YB9cg#y90pj$}Xrx-V(X+-)!~4kxvb*gGbGv8;#+Ajm*iHi*(A zP;e~q1OqNx{9IgALlnT{+LzXK7%JlA+JX>?0)X8x^|398g>oARipw^!4WYBLHgIeW zZBYtp^&ZZ33j#4-VUGM>$!mr2b;H>}khe|(g_$)Y)D_#CyPJ&lyN~Of)9O`3vz1)O zX@HCf3~LX?PzIr3r=Wp%B}vM`Q1ajc2Q3Ux1P-nO zfcj_%C5%Ekvte%c8;!=@o1bhvSnwX!i-UkJC^x+;p@!JT zf(C@yym@Y&xeKqaEg2V+tb!z8ojdHVTkf!~tmGZU7zcMn$!O13fnmT z=!gmXWep}4yN^M88*m1^J_x)mP&*@2<2*7*ZzJ6A;~F(rL$>hUJ*!~SEqZDMx*T5F zGh0FL218fGTxSOL>Y#@_6KahK7=x*hOKGF(1&mpmcWvJf8do8T``#$*Om;p+yVscy zhSibjkc$us_Va|K9g^v^l!`C|mX=z;APvD+r@FWDW1jWqW!aJQoCm8@Sp?%00(Gx! z&jO^A`LAc2c41XssSyNRD}RQjK5r(Ijoz++jw6woKN3#Ph*3FTHKk zUbKikIMF?;q64JSLKJ)|7F%nkLUrEfU5uqg)@BFEVn`3e*S$bscS2aN~W#1uW01Hpobo=i|* z*N7?yBdge0fEcW9G-GigOlZc8W;M1?CzEa}42YaHWt?U`Y;o{RWgKjhgRm9740p~E z%bXobbs+K>k%_2i%b20+!K$@Zt19v(tyY$nX|X$YAugq)y6vEcXhD&~16>_-B$h)R zdyT}cz1r;duy?GJ}+hD6=u95*HH(F`hwW%w&94&$`1@hFr?(=>^kH zOpEBLqmL*{{8M`>soz$+gV{UgTkCl~uf(5M)uyN_sLgJ2jzxb+-TdYsY_G|NHg~cfZjp z0QWT>=Bo!&jQOxx_D`-m@1kmFo~Re6=$QdC9+fnzQti|L6!!$bcyL^f4)cI;c|K2* z%M{DMiNx(MePmQn_weV=r)gyv%usO(!c|xX0x(vUs=CQ^`isIB)oVp}nybbD9*KYf zNgWT~V3X#0wPon;6aick+_)}SC!XY^9lbv8Y!i2;3OF#U1_%d&{2;y>}muJ&`; z$a%X7(Ga^cEzP6=f$ePU?CkMzUf_->lh8m#9P(@p>86_CpO24oj7{hmpb<~&D~3M4 z^zuN?6%#^A8Wdn*Qmm}2kgL84ypwLI11)0ty@+#?$5pnuR8+07I6#X4}V{?-}!Gt-CMvL9l?ZS)FMSVUr@6ciYYgCc@&_4ipjstluc zZ|}sq@z>u|m4=jPHrs8ro0zSBIFoLZ6BPud3B=|M+v$w8cV8Pv`z2XB;>}U#vBqETT+($XtK#vZ-e3X-MlOgM*u&qSZk7eAkWRL-V&aM zjiaIr3D&MlDbzxNM+k`CDx^lX#XoyS14AdoRn{SSz#L+<66^E9=U6wcm!UG%IuAN zn^gkZVT3BqURUO4#5UvP9Ca=mlU)6Y%<5g9|BBIW2UY^hdHt82sWB2W6w?R8O$=tp zu}iJ~srQ>jHHNOG{s>&+{Bxceesc^u*2O7<{5}-ZRz-msTbo}E`dfDFxL(;W<{lZ1 zr2!<6K?DdR5(=u2!ZF+ViZOn}*er=>Y6vK8igS$QPJ#^tIHo5Tv9%O?Yp~PElc4MM z>WsKPyHkzZP4_Ew9&UjoIA#mNFnCggkVwA1#9c*_T#7yh1{5{G4Vz$K3-03rFQ;wW zZ+|n9({aI^=+AOz716~F#JWnN7hM)kP)QOQs#rfZ?1wIQ9p7Mg;Inl4)CzN5>C&N_OiFuMHMF4@du10bMI!(O-kBHLm}@TqabT>beVw1)jrZX36{90W zvE!odA&R_Mg}3)NBa>dsOwQaE8I7F{Q2Zc4-mma>oACS@L0z+BV`DHIRoUEEP&#Hr zGFFDUPX#4=uN?7f0bG}Z0Tz&BNYX9Sq%%$JI!4RQL4*I@-L???Paz_UfnCcx-m|sa zgNMW1n{w|B)2nRca%5O- zb3M=a{Qnc_530~P01piIm>>I-p80RP?jMhb>Lu>VYRwTxcj6#}(x3<=;cOB@p$Wpu zXIRAYxJSF2qS!X>w%JWXe^Y zA2#>ic=+RO-Tg$qZGxF?FI4VxL+5g3=a({uwW7bHtzui?|Fc-=Z4OynMvzPvc`?t?Op3Too zMCQ_^TUS#fS;n?d;G%`Wm33`#8ni|D^<2o2)kS!ykR1aMszTVM`vZQDGIPEUbqOld zt(C= z+YCk^ClQFHzNW-0jl^SSCStssp_f=Jq3Kf{RT3DlOLj+6Q^NI%FHr1=9nQ+8KV%ZN z38=RBU4A8&&RLN%suPmPvaReV8|rNlOV;fW(f#H?3nTHhhZcz5FLuBKmZ1Q zQNIS+_(Smh56$^I9?S+KYS)Dw#5nPm98H%I-GRIBmjmiC5c3_5Wgv^1INlF=DyuX0 z{BGkh+)j7HF;C<+?705uNn3*e3flReonVu1F6P$GIz&gY>4pNr!5J4Ila5|KIr#R4 zJslktcJ-;S0~DL_axg5F$wDCdy0*1vCurG%1r)?!aZ*STfd&xZy;9wTkhF7yBYCN|Iv%>Sf zD{F6iv;RNlUU|0J;bpx4IQBTfulv5eZ+zGll!nzR3QpAoGL%z-y1KhZ2ERt&&?iLj z8L*irBu?pFR67--mbS9SuE%|5_0#w-2t0KpeNJAcT(MslLj0kGc3LNG1G7v4WKViH z$Uoc;@HwO2ptuNJJh_33$}HKiW(&f4k5C{2jpk-%qstl)7=X|12`aOCh-8Us&vz-$ zMAZ8`dv#k`gh6cJKVHZd4bIPFWzVdo`As5#7S`3*;Ml9VeS#BNB8ilu;RU2#(lP1N zr#69`Z*FlaYt(#nevups9>AA^8>Rk@ro9ApGMDXgAm88b_unB)4FUnmCHy_G<{CNa zpAZobU6l(djJZmc45KK@GKGPy>2=55Ih|PbXfGo^ikyCxFth3@Ax;X#!JnRxw5Tb` zg$jTIJc+7v2C0~1>|^esf()L(y{n+nm|hrZ^*O1+U1wsO z%fYMO+x31y`!l{{Ub8Wf*ZXSsCNY`*Do7_Ch{k0k7hsiEs9D9S66h8 zT|yIn0T;O@AUMGwgfXl%l+cVpl10~N1q*7$6SCRKrm0pBW3Jk08NBc+Aa8S3WXUb>na*Tt zcuG+;BTH1msnkM(387S8o90DPGWYF6Nu(?)w(-yO`|s0%OTC7# z8L}N87WX+)IKW6Cr@J6rFk9z!Tm!iCRkCMC;@I+U?SWYcJXd*42ik9xzu$UIp&tJ znW+S6nazt;hTf&rs)dbtwv^6DKtVWx);@|v&D-0g;oT-YFN0|f6jUrAT;pLI8a$p) z6RM7DGctQ!M+L{!0si}xv8`BC1i<_Ho)9%09DPMfr7Sr9qw&8th~b4uUSWW zb9+Xw4h}UL@sWCJxkF+d$iJ{wy;wHoPe&{p>|aJ89v5LNhsOr6l3ZodWdu@;3w_S+mL2U4}3k zt0vMu{G%R1m}&)XQAkZ^ju#jJ!p-}YkEB!VpYZGvH7}K#1@C&hM}7oR>dSdw=il4n zCN}Y7M~Hxzqy>$AcZbp8_VgF%>2h`@5soppN{qbo)ZT&3I&jwnDWWS}rA8;~kPvUv0w(iR(?x(C78vE$=oB;2y3oJ>J7T7|Y|*qjZB-VB=poJtgA zKu|!!RT!dsqlpIUqlk%5Ui>qoAdul)kBE02g)z-k`e&uoIl$cIsT~={7{v7O-&9j` znV}a#1$9FK>&iY#3GwwWF-WS64Gsh`bag!n(SvL)uFQdT-d|}NeC0u}F|@M;s+?43 zwQwy}7}!|0>n_3uP_`H8=4!lVHNzsE+trN{GhiIyD+bPsk4!f6Bn|{%Q&tO4O>R-k z!?#tl1C{!UYbkOD%}uTA?^Vh<%z{R`yEzIWTUxHRW>2G5uNt5N$6?!ouD$!5T&ChZ ziPM=v(M^>;(1|uW8e*!ps;4OqNAWVp2f7J_VPXaZ z1tf(alul$EuFgdW7~ZO{!kOVf+J)Nc_H-36VxdwGQBA;sW*+gP%TGSreA{B86wy3@5re42D#nO0 z8JZ==asu&(FOB04e;cF5SByN)|IEZvX}e;#tjNo$nef6*FJZt)vnY^hI7~cT^*q@3 zPiXhMOF4z{u|-cA5Mr^PV_KJIF zRtf|g8ap;Xr9`cODMNcuwX6(6+ZCVU9z%KPA%V@>fl+xeURo|3$}C(?7JdY35~D#5 z!(Q%cB*vk=Y(~SDs(7!IM%*{Z7%t2MMstjN`q#zIm z(viG|@S;`P{d@qCwTJ4m-a8OTn}j@%Bf?wNSzST{zsWrZev%DDn22z2AmAavyTDuw zE&=vjH@j!s?ZWX2h0M3D-f03Vsh(a=PDo+NlV@upF%Q$RJyH&a&I){Di*bx~9anogs8+biWkTLuZNGx-R#u?;wvf=++@~Z9RcEt`rn>`FeKk%<9CV z=&K@7)jZPmtSSS-E4R0|x3{7V#qI^=eqP{UMh@WXncu4R3sm6y_ZAlH9sTwBrqgrp zDda$C!yZcTki&xg&lAM%r-~_(MaHC3DLlq8bElr~A)36(NEJFs1zJpu!XT{%eL7Go z;q4yLjiUoS%tvz`RUw&+sERbR0$ub0rqa|K162_M24q5wot>SMk{72lO-ms*Iec0W z+@$j0a|Ldx)zS+f$&)5bmvUqp`ug_;;8oZxI&WUJYeuQofYo^}MxMWrr^a@)gWk3q z;IC_IYh!E15%M?&PWN;$y)|NI1%}QQZ+6PAq-RF()!w3xh)NQwh)4pEjR(b>MH@w5 z6mpADc^CxdHbm$MNP%OzrWmXcOK)r*Bcu5 zHdLE?yKW2yj@(79#(_#i0T>tAXIHvw(5zZTZP9Y)M@8$`xBGkZP<8}Bbt=BXFdGbk zEfUlLLTYnR#2tLa288sHQ`>Nr4#?_MmG|kRKcwioJ;65?ZuX{B8Yhhsqs%&s`HL1E zMsguA!^S#HMJfgt-2(y;dvYgIihUxjsiL_k0ivQs<(2SsgqL73L|_;v?(PCDaC-XW z2Dz;jfHPlTU)YU+&FrVKz3v!$=+heKbdA@ajV%f4>V~ldYlT|gm(6dhw(Cn%XtCVZ z)2wK|a2LY;``&ESnqEbet_7i7>meKhAL%L;ziO-H%m$k!ic=?wfT>6)CS6n&i_>NEtv854!Arc7m?dw9|s|1pitXlgnACC zSZ0D3TQYXLfp@};N@^)ZsmMD)QtBhTtEQ>*zkzWhZ7}1yUN{hC1Txs1qb_A~`~GfW z&CKv|boM#AeKuV%U-|loMT<^uWGlS#X6um~cq^}7HlE@QxDvsFblX*{{4!1p5LD`7 z53@-WJK0&LKq!P1AS{p~n>^>|u$as;cY$Gr5M(j9fgsqZ`1;=mQaovE9Q8IcO3p}5De7%quk9mSuFZO+^IncY%lDE8y(rSsp8S&S>UKPR}a#ml|p{V+ey0|0T)#P~S_>C7q!0=v7(U1XJ} zgeWTz5}_6s5r@O!)EF*Y;EWuGL9iyRC@1G@WXE zfPAPwU5NHNI`)$gXXa*ax8Dz1?cVADSVkDI;lnNQHom^RV!6e00+u|PGCVSOdiM+x z#&HVn_g+2HREjB^p%p;^;6zxlc@cz{LUL|0=hAx^4O9g!+x(ro)~j+nTU7XyePWnN zKQoW@{MbtkCC7`Vps%R16;e-;M^EL$AuB5-Sg>j=fN^PN9l6K_SR(|rV34v}TD(9q z8Zlgx83O_WL?q-w=rUyuGth{u>+9>Q`hyo!r`qjyu3+TrK zQNryL)MwTH^*R1$$KWhqW^cgIr~wcZ*a#s@H9;#`h7BU+la#(aCp7S~5a7o!B_ zKg-F>_f%hnHxQqO zLMQzt0QWwMptf9^t;;Bz_wU(Zv{Mx|*Lvt1#~}!!dgaEGuRH|i3#x*J8JIYJJXHG{ zs+yzpdWej~h~S$w-nCJwkwHHHjkWq3^Seo`MlSyk@i&{z=EqC#)chY;`SK_JzNNVi zg9WX{#l`FW27=(=;M>~Ti)3t#o=EamQup095E(|2QF~6$iFkr#p z9!G?vEoO$s*wBW+$q=w$E8>(q1jU{K`oO`pFpP}Ic|Ar&5Ft%A?p$F2c{=8S65qS~ zyiNsn?K)5Cac<-lvn5>n>J?<_3%Edp&lYD zND!FqD{Wx3t?n)^=ifM+2r~@3lp$p>P{4!tOuN6Mo~^wbdXIAIIgCs1FDnoYlGkuB zV9%3Xcpn&t2g!&Z8_MC#-D52GbBRV)HXh#^4QL~3(vzv@S{hJpZVIVkwEdG*omBN@ zBMf|&Mc>AA>*`(pFKJILsSuw)euJb|ZZx%!l&>c^rr!pvw^Llwz-%a!_ zfub1Bw^qtrQC5}S`SAzAXcU*bzLB!Ja_9M>zSir&9C#5-9Ps@tw`$WJ_P#S0TD0Z8 zvwmg}$02GIrnCFQpvI?tvBHB_I}Lx5GuhbNl<_v)fYEfK=?z+~92B&@$H&3cj?=XiWOms|zQd!X}DIgY%4r8nQ-pw2YH zaqM&Y&0kMou3fvGTmvn= z7A#n?3|NL7STXQMLKq#79wva6KzSKvLfK@NK>?EmFl(?{>`UP^Ajb9_N*xF$;vy|g zEI4twaN*3%$~&2x5bts*GN5?pck$?=dI1Bzo~PyYJkF=S=p5ROhEX6n9nuI*PQik( zrdWz~dD%(X*;!F2HEc(SVcb_Ag7W@50q>yEp(LvHZgP#`)+ z0HnyIiVM!v*MJvH5(28BR5eu{LQ98T#zc%4=xAtYnw>VDcSktABwlB?pY3r{S`CA$ zA)sy;0E8j~xDOwV>HRUBM#)sU?#;JUf$Qv%&1?8(vVJGU)cM`#jp}AQ>+Y+l*u1al zxz#jsc}d0yPfpa-)Z`jt#xODoqh_>$wIG|MqNJ>>tHsxrASLtEKGF`YggvFG2W*fK zA_Z+U)4|avW3L}#s!~!NiJLGWF;1AV4TEBCS^4IE;-{exLvgXV=$&GJEF`#Hy=G6@8I+_QJTaiyJiYA|qZe0yTF6{A+6qfpg%R-vm^ zVmpB9F;&o^eHvSdNe|O8y+r!9HRgwJhpUWo;bWe4XUELX+2S$!;s#cBo^!?htxb^h z3Urn*Vw;qwg1>6#NkSFhKQ3t^5u(Jq1-IBE1i;~*j(0I9tKfagSr8yKL8 zfr^T6U@8V}jKcg^TOS0$LiFyb)Wz2tUE7H=f`kEVeYj<0d#%49&ryF-J1pV(%I_gp+<;LI3;9I3JA zd3InOxtwxM+ayedEI^06BDUYyv|o#lNIS;GBdluY8ahA72(t8mr4d{16~SbL>;RXU09C1L}V8D zj$A_wbWZjt!`2r#D#EVPzLSUj!>6yeRO|Kc?bQR&R{=T4pn&vpP22?K_gHLmqel#a*SHEm(W@hX<)jTR zTRA52Ye_4|fr$u?bf5DMXhqow5;mAmnFu&+5$nI?WF*1u(BuaS*hM5#tZ^N~)a>AJ zc}SKE>2o2v(HKQABhPtVK(`EhU~#UBX;Aky77^&<^^u0SJKZ1v2Y~syr-g(t1EAQ* zd(SDc@BQWY-lh6J_k$<4kSEOh-_aV=8<^t7tUMOXsI--pzVhOxJ0z|$+bdBml`9O) zz+e>#+8}yMK0Z%)e`I!9==NVfmpLlMl^z7d>Fe8byJ4q&#>NL>1$qKE@&-wD-yIG2u6KS4zEw=Lk9L@Hly49^r8&Vp0Eo~}v<%q={ND2=r1r?&| zRXpBWccCN^laEhb6OAbN{Yk#uLfZfc5FiSUoEH5#N*gcKqgDZxF~b}TqAAHUiJ=)C zmz?588QUeG)EZD>U;&)Ogd5h4KlA1i+A&21AM@#3Y>FZaBE^r$|H*L!@E9ARh%DKK z-jJyc)7)W<}65qJOqVoqn)cl*AAw z6e2wgOQ<8(yE2rh$y}f+q@wH882^*>kfbG<5iUax88`kyr?_{x2F-ruU0tCkRi zz1YoFRAcGrSRG=hA~PXFMBr(LcS?`QZA$I6jM({9vJRbXF^2g1@$biT<0zM*9%ZtG zz7!0EdeiJcBBpGXV6|vs0+7VS6>{?FGj7k3#<_4US8)S(BYQ3j#|baapzLT92p?|i1R z6c4r4{Q57v+?_=*AuRD)Y!azOkuI);n|UG^-9cqwzLwNBtuGf#BOfCXiNgs3?o5R& zLL4SRMST4NRy-*HG?^3(qt=mfQzM+`InHo^7*h7geO*luxB$~FN-d7}zn$BL8{cI4 znKoL{A(1|)i*ZVfV;eNuHaM_ZP6nGu+DycY#!uz-2vTW{Z9uEjqT0DK6Zoj z84iL2@H?LAuj*j41Q9z_3n%lx!c5|OqPzJv}$e{j>9*ilRAsa<@&MpmY$A^Y>c zj<^2#+z;!^>VNw+ldb(ckwMpWTPnVbqv-bEuj`%m{BigCU$*RTd`vb2e#;}QPt%zG ze0yJ8-0pg;SA*JUV2u~nCcgNsosSXck^1^wKezeoKM$o0hKqk4zd_0Cyw6^T$n7vW z{dO-s{mkI@(IS4lW5siK9fy-Cyb{tlm?OE=gWvFZo4N1PlmC73=XX6QA{zdaE8n0S zgroyOpv=@H4dTL(qGtX_CsM*-f?q!l1b`=`9#)G*oV6TI_LL8Q?`U2u0-&Hsi2pni z(-vhy8iaAf^3p#O_asf&>~2s-dOt5j$tTQ$Ln%@|pWywS3^heSVSHTVKp%%u?Iee~ zL>5j8-H#DCc0@D3aQ_vNv_ettpqz-Z2m&HGj=TyfZsJI<_n<%-^Mn742|OfQo?rfE z=riwN)6~qlOf$`CBl56E>{PcHUh)b8L6PP)?wS#A_CgRPkMVPjd4Y4RXbY}zBVgTR zVEo;g!Q4k-9D4VrD>$GH={4ZL$yA*QDkNZ}`K&7Cr4pb0TFiV1WBdkIAM5E#G8o!< zutOw(Uu}C_)``-57R?zoGX1IvhIO&BICWNKyMmT-*KWOs7QjeKDJOw zE?tDcxuEqf%$ZDv6F2HvIM7EFK;cCs<4$rVqR0faCgGqKvx3@ft3fu_Y}n>=hc(y1^sUN^jCHT=xFM*dn4?9vNc zbj587Ia66Ob2Vg;RCh6npxsBV(dn%;bT<~pH;c9=L8C$%)|uN=N38eDo0|>(D?~EK zev$$bkd}fPNP?SDhK0FMAR(Ul?PzPj>Jp(5M-aG0d{js;cYfIZjc{2$#__rLP+ zu9itJjnr5r8^VEZtt$8^KmLVe?8mXH90~8*B^sg9M-CU{(Dppu-CEUG1J4)_6e3v( z`q?Pbcq-DVf-X;iTax}&o zZZu%Q&x(=DSz9>7N&*2E6kEnHqsk`+gJ=dBf*L<32pA)%+%Ob1I=6{Ry4IL+jIp5B z(0H-h*5k(vj44N2@Q&Bus|3-35n{kuF$I&;#d8)1Hp{pg+@fi z>dJkCC(UBjPHkq)EAv@ZXIMvj0{L+i<_MA`id|eC&pTr9Bn=9u4N!@n@947^e+>&( z4C)WMN!&}w^EZC+t;_regO9uME3Qr4EBj}p$akKy7dZ4y{Ttu zMDlJTjU`(E{6(z@|&JV16rjzvVM?xYVhng!SnXlO1Jt2D5EpU+xxw347BgGRX{jn1?{B<9B>#* zKY~>z|Cnc__dQmJ@X;#xLxZ~@!qL+;nZ?H-%C>bSzP=FNyHL`4B;{);!y_&Q;0feLc)a=mRniRYssi120apc=4eep#uZ;@mF*ow_d6(cPZ0Us8M+5o zaSh!f%7#8>2d$w|1B6~#622$tN);tqj$j8kotX;N0ZYT@%b283^g%5{b9cxj- znwDrpLr(gT*HTwT^9=0G-QB=Vz}{(HTbh3g3;`!)T_T1!&wxC|AaNufm^L6U8_gR6s4CH~Y#O*`|4pLIH()>t=KcMUfW zv)_*pl2|DQDqB=L|2NA1^(jL|Sg~VZm(v*m2b9oCz7plDv@F6vH047N?kyfUqZgWX6v~yj7(=JgJy~!3)$)!K4IPv6dOUvfHj&jf^HW9!V&}t+77`-rYamL z3uG0`<})U|V+vn7)L~e)+w0Tykdz`NIW|fz7<9T}kW~taNyml|o2o0#MjTt|z^5Tn zkoqSUMd8#g#Z!$mE*vWgJ7D&-y&xqML^X~o9y0prkgrBJ&GXLu!B)BJb>+64`w=tL z1klzr&A5{~I3@GB+HXO}IW>sc93i%J*k&@%V|7`>b0%5xikOTA&V_Z7@WPdMDtR2Y8W2t@u_XqAG+mCsJv%F|oZ7|mSm*oL5B15eq`hn&un)J@E<+ICynba%6^ z8+OuYU}^xqMsh@OhifW!hhInSH4QR8gx@!oy;TzqrW!l!Ho~2c>QL`BL-butuysJY z(7N$nQ4YtqMld=wik)LIN{~dCAml;F;sh1h$uuUYYZ;uE5a&xQa2?5K#xaLlFb)t7 z+bGmNsD*$9C@QbgL>xY>X|2YfqJiC$Cw(kAlrtQmLH&iPVB*>V8hCX}$@6XIy|m9Y znvN+~5_QuHRhDM0R1OBeEjZ(Sr0Xk=w3lL`Qy2~zz?63zM4>U}hfr}KEP*J*>`iw$ z?o7PUGSM(V0fL{&ae| zdT}RqS?$%4EP5=E=%u+?ldY>@D_3!AKypxbrTV5+nzIrE%r6<}hv%N3i1OfRXNiE1 zL@GHsX3WWorAz&9ki(FNj{^>~falV*0K|bT?Rfwc>$9X*Y&Qmr0JGE`6jfgqyXjdc z&32!^@*uDIk9#B5k7bja5mru@*eUCNMxo1U8W8UpV+!R3S+T-tByj96!8z7!-c1!5 ztqQVpMxr7(CMA+(5^l`019=+Yu=N>u_#Dy$zW~UD!ZQwp)~29*f~x979r1`+a2C|_ zvgg}2BBF5;3X1yRC(T*Wgex;}-*oD7Xd#kfH5en&TZKN|$KKHG$|i=NfN%BOP@mbuXrD>uVwj*xZ&TU^C48n4g>+uV@P zG;B~e81g~08Ye!Y+eo4g9>k3nHnH^VL@X7=Humm3iC(dgZ{9Mv8yO&xEL-e(M?>q_ zUjrzQ#XUYeH#|3geMvjErw-3UMKDWZFL0*>Fa(YVrq5kBXS??^=8f=OpbJ}|DS@QC zei|D)z}jmA!0jiBn`E<#G8tH7p}0|DCaQzs)z%_1V>1mH6VjSw_{^JEpzu(1K#3?{>z+lYc11hE66=ubQlkq%_&xm$~XgjEZP z1t=LwC^hBg`LL-0YYACUL_IH~ER#JfctK!5rqT;qID0*GNa%S{Im3xa(`Our5#-?f zu=eyxq$KP%rogj((=sn*0PGXMFy{JCcF1UAB<6(o4}*6@@R>Jf9C`57tMlAVAZ)3s zQW0VIFRjI#G9&bpH+y;Suu2FH(5f9%lT2ZXo0z|EsjOn6Eh#v=E;xxOlZv`QzWTEA zF;lQ2`w6Fg(9AHhvAMBagB}IHiq8yDgW2%ru;mfhy_}1!6Y0A=Kut5C@4c}ncRCmd z3`fX4{f4!r(W97Id|=T~!59^NB6XUzwAfMEu|sG$Nw>==maBA}D2M~dONB~bvhhiy zs$x(N-|SDu%}1Bw3LviAQw2gxV;J6=fTHcK{fRD*y}o4h(aP#$&$M$6UlE*`&bK!? zpDFm+tPe=mc~~N==WnSH0)*6L-8V31Mqnt&iyM9+tGJ7kmz9uc(V__SPdo6%ab&oU z&L7u>QjaW&kfO6GG894rH--qIiiR+~u|^3HPlbF<*BDe)?%hFFVn-pOsfDo>4c!YlE5Vxx&X@!`Kp~7*QmH zgiG1`KO!yjc2z0F?7!iy@G8CIwAEgh)MQ$ zTG3`Sl4#X)?JzQIpS!q70`lLCkkQm`PYDuvRiJ8vfR$jf&8>OoUru z7Al-AW4Mge*gZd%TO-o2bdyfNd0H192b$Q9>T$*tU?LEzqo}A5n(2 zMEd&=!$V080!1PANeNLBM+@-M1ja>BKqKc{0fs~$J>A@?Z-=>%X3E};CP5O@bikkh zq*!*DL18G6#3C|uJ!H6^ArBvQu&t1^mJ>q&4iZ9y-D3t zK{%;l(jiMiJo8+}mSaJMHD%Eot*;Z#;-@+TQ>>Q?`hjGMZ;*o?Pslv3fdm2(R#%aC zz#QxXhT(6j(#`;uVGRsG*twD|kr86Z-CTmfVV1#RQtxB{>Vf$1I5W?{v;%(vM(wRB zP*W!}6{n3rcd_f84f@qI=df}&ga!C8W(Tl3pPqO~@j4f`bZ2qdb=E>1+XDW42fxpN z-a8xMV)k>4ge8<}8Btv&Ex9RDWQw7a91s``N&)1B0(hO5;Ja@-Z`9-Lw|+kd1|BmP zVij5L9zbdGUs819Mz+(gCD@d{<_{3lT)<93BQWv zXFK`DBTnegEyb&}AP1{pyy!e5?TW3Wl)ZbOt$<|U4Pnp@O|AuRtxC%J5l{h-A3e6( zX}f$|lilU9>Uxo~pr@?NrNJ?U0)autGhq8~A&K#{VJe!3l7*KVJhkhFd5wvcwtB?&aakC``+dX@X|VUYGYJnGd8{N26j1(8Oq_;IZd|si-nu)Rpun_U?{;dS?J99zkm2|=};&n zl%W)&x%8cUl8%Utt5fSc%tONJfTLf3RTd5iUby;#i$`Sui{S%p!LCTa@pQs&sNuC5 zY+R}Vh?RH)ji82=-N_qStP&_in*mXaM)L#^d?uByFH++1i@5O=JWNQSZv6?cHO`_k z-u)EWoCY|AcB>@LjmR0P&m$w=Me?8 zAwf1(@(*a#fg}yIb!s}@l!K{8^W;j!6(WEK>a`W$fleZoK149UYk6u2poU-r*R>XB zwvW!2@nnNzmpnQ-d|Et@BXfD>Z1sGMb;abaHsk%&eRlZDI{h}*tA(J{P;YLwb=rQr(^0+S)BF28_1=Gdjyp4V1ZET*GQ^mvT zGnirWsT{b+#O2Q0GBwuxNjlm<-Cjq&#T#3k@CR&53`p8SaA0f;=SIvmmxOXOkO3fB z)ECl5L{?IR?AE!2QI8ej6)2$;0l#HKm#$}hTp-2i#YERkW6d7`TqEg-r7;^%{P1Ou0d9ik<*530f0Rj#h`Bs>L1z{fzHC}kOlu~j{V-`#`;}~u^+v@Bws@q={ zRzbM{xd3VvR77HdG1|jFtEL1sax1nvHa;NdpEbDmrjxrA%_sui`z^6d7c#Tk{mOoGPg^(|BB|)4d(cRNje|x|)0F z*E5$SxhcX($r$ z$GU2cencV~dRme}lxZowmZHL;^{#xu@&}V#WPN>+K;sxj<;zeXdr!?F1n}~{C~HMZ z&TVKC8}9Y$EWg4yslXaGvuxeG3kKd54Jco2J>9`+O%0eP%~(#YyJ;*1K$g77BNU_$ zP=fZP@imDM4i)n{O>~~cn4`;<9!(O6hk7C_ffTwn^1>+BjO(B%oRk7=0S|5n!KbL; zbCer6g$0?iv`l2dfg^CyQq{Dxf##98$^wWZ31J7{{zTBCJWfr#E!oVD>Z!qBiPPs7 zH&r-UOV7{wh zvx473RMS>6czNHnNu!IhW_0oU-Ce6Xgf)inoLOjb)H#%CLen2 z!}6~h{JpeE2bolWgd{hT_KBTZrmUof8q}&wt~}-=6|I9^h14c_ z3^#iaJMmUbhoRChS9;Rkal5SW!>8}VW00w`?KI4j{JJfDUx(o?Yrk(r7e$j3>Ig&K z8WyTaj!4m;2n1La=Y(9JyKs?(4!R; zQ|wx(BRma4AAt!3o*#6A!}X{d4K5SkaE-|zn>lrm-H`+~;lmE6X(f1f-pL(F4Aq55 z7a^4 z;im31%Cw5MzC^?@DXc{`XeEQgE|C~(WPv*;*;AKX;zaJYV>-StIMD(R+yp=gL2&#v0qPm5TtLQ~Go>tZzZl7r+T6wxejJ^Oyey&U*|Adz!8$!Ze1m_qj5~G5R+joH?j3z}SEOQ{V$SxDKPS|pi6cO5?$2Mj{0}PzN zjwLWz|AbMTNRh&=trRw*qF)!d#l_4H%~=tq?ShcukE!|2jFd>AVAd~9v~3ew*1B}w zPw=0{e~N%rNBGpEANnk*bS{XR!aFF6(uf^|X-I(UK@kfHM9q9t3fQ;oN}HIb=W0%n zMDt}UNLMyA>WCGPP4vz);?}s7AzPr!B?*PEtSkr{H4WAM+iYo~ii4(iX3%sY4;T}h z02WAyND^M6uz3->3X=DIZE8-{b+Rks+t>CKwK8?VI5LS8hKZe4AsOIOZlWfDnBV~- zpxPipMkx??9ES(+W*l55Iu;EvL?HAzBW>WwSUwwBJIOh)2%sv!EFnCnO}1$ukUt_R z!C_*NQ|YoJCD^JjwS|eoOiU=-9M~rWu~{;pdKpsC1oQk(KRf@qzTEqtY=8Idd7qil zW+J*oLr$n>`j(=S5(fGX_9MQEV1v7hjKK}iSS*|jmM~D25Bop<|83~sZX5q!{7>#$ z?5;2WYELPp1&_`8 z-|fo$4pd$75ZS;gNU}W40*Is}fSe9ag{X;9EdtiQtfinI&DnfD$F}n?$I<0>zK@Tm zKU=)b{;lf$oSctOo#lF%`OowI5Wlx8^v!X6Me2mD?*G+(FI}$h+RRRIJJ+~9 zm;Qm<$@dcS-==wg^nc!xw*ODlSH9EsdA_^86xgmSk3aMskL&(Jj;@m#>-zak=cPxy zpVr;#G;NQ6;?H$`B(^gd@9+KIem>0ozT=(U{keX0uiF#c86WkDjVmu{{=FYhyqA0A zYMp!ey-~)e-H?>^JD%yH z)kEd$9B{Pbot3F>(Jg%|#~p6&eDa#TzS_Z?A7+`--Gkd6#u`0kn9OYbUfYg6uGhf+ z;ubSS=Q(umIgOOgO1PQpZRXRNourbV_jVcHQ#W>6Tz*$c;p!-UKAU%j==7AIZSSf5 zbbBA){x|J^tsi$AZ2jkRo?lV;{GD&Lk>z`P>(95<+V}>2nl+y!Wf12i{mgcLIK%oCUaFg?HzE})*FINoq^*tN_+R74^sJ}<81{TVH+RT=@=aBcn>D>=Q6HQj8NZ&`KHQ`CB`1q zUhA&uU3W14{(Fh;XKRzz<`>O(bf4R=+Ao8(xcMwO{ykUQ`qliMm3F6^dG3c#=;{0X zW@YC)1;=f1f$Yu3lbzh){9M&Kue8UBo|josOwU+<&svO1nTU;VJC6g~Uenx*hmkt7C0HUkH0O(e1iNjS31NeI1A{@sws zxBq|WzW=6S{Z>n>qxQEU)<=hTyX`kRYMT#rs-YqWFVenpb98D>dZNMYaO<>efYTZ+ zS{BJ;B2gLM#KpSBkl1$%BdZ~v)@zin%y8sC?IYzBnXef~_OxdVfbD0Ks^j`8<2Yf2 z|CdMBuL-+aq$-6~d2*p@6CP*`AaE$OU4M|S8F5t%Z@Rzvx(B+x`YS=fm^E!jNsp*& z>oTlI)V(k{p7nzG7_031D1A{a`kD!2j4t}RdB|v*p)Ug9HJuV3eg5a zNdRe7{>)~P&2F&ecv%1z!lZ{l!2)7I87e$O3fVwGr6s9c{R^Z7V+s5cYN}mQIuXja zICx_PBb}Jr;4~1#60)PF_}{5me9Vt?ES4^F4j|7=e|Rt54-tGk8cRMf5qv{ah}V|C zuY!ig?g_zZDX%evtaU%EX9>D!xpUxeMJ-`dENy~mjAt%e1h%dI4ztwI#bS$-L1abU zlU2QUDYPeApR?}4WZ3R0G}H}{)3I$pwt~X55Q_sDB9bhSo$MxzFxq7#8VN+2&6}*l zL^!;>f!NRWuN*;x1`Zp6+`@N#@AW*J`budzF*!Rs-F@EITIjulDa>E9?NI3{D_FGh ztvcm6dJcoWxmNEnh39NKeqF{Nkkd5E2Rn_|Ctu_Lk6psNCm^chP$yA2D~^8PtCcUG z-#WPU4(_j(t9lEqU($&_$qn|i97=2>tonu+Z=u#*lSp7~Ez>cDc_*csIUsRwc97TA z8Vy6gXaJi-1P}zOfpQo@NNj)5l&k=%(3F4|vn&-YGa88iQ^S5EvS(lBjo-OSJItXrR ziD|Zs%}SQGly{_<+DObh06@kB0KVwky_?*^%vRoL_%Z;4&AWk&Cf}yvFx*f;9k;+S zG!0Iy*@wx^7*s2)GXlPM4la+SPrP6qS<8w`?9!Cl1p7h-b!TijCCB=Bs-2Qz?SbN& zZBeT*d2rt=bSfBq@&I};x<#H8s^QE0I%(;)=AwUHvFk(;o z&s5i}{jaok6%ngnuXFYDJq%s@R4jjGi5@o(LQvCJ8~1&F`H>RBj;IMC2`C9d9hn4j z{5eMm2NgkxprE3Q2#AO(AjJiYNJ24L3Q!Nb(eu7_$hWv52uULpMHED62akGv&)(R4 z2kzg5^0s~03cnHoYb+Ee?_nf>bVSh5MRRZ~-25xWJct2@#wh`korQg^U6cOnR~qRD zp4GO-74!B5kv07-JJ^JYp|d?*y>mrFk5XA70X`GLEDAG~yx)dDK{eLSIcnuWxMO|G zZ7SPpTTrC3!8^UNB~NP|36Q6n!~ZZhFg<{S**|X1f8k1A)#4juv1Ib)joeoaqR+S) z>^#Z@tZX2wD2z~=;KshbzUHeJu+wXpa2afvd>Re!h*q4WN7(RPKCa$$^tGF&%uDHP z)J4n3?zQlG9lYkM`>o`{@~Q7S;8o-Dj4ssN@go&i_O!3XVemK*mkl(0?*cU0Q`k0O z8&2Ltffle_(~VORYpm$tRs$4se~Qz>X|jV1Cyl&vQ@6U8uxPD;sL!0v)L+5N2foNo zlf?4zDRduA{Weoc+?9*SNKc*#_pDe)_Lfu>F$3u`2d;tGmL^|oLDlf<@u6LnA<)Z1 z7oaQIM@LGR1SDV5!$3KpfnALAm!xb>B@*QHJVmiuXP2OXTUgsTTDnco|8JtMx#QEoowuP;Eovy z4I)v*4v;JCkmyc^pYKnB3UVSED!I%qN4-I_H{DCv9Zu=(?Gjwn9BCM*X9qVKyv0 zDLh@pqG+}sKiNQD{4@lmWbw$ViYh3Dg-gYvq&{mS86@*YLRpTPnX1B>#aMDou3@+& zPQHnrHUQl;kc)$l1=wyRS+7MVHIg95qX??c>XcQne9ezf?yZ`{(`H63Tf6ceIuz69 zO_P?Jb#$x+cYNNB7?9t=_1%l=bJ2s`9y~$fW%u50LyKHs*a%91P|GruNIf0>x%@PZ zYmGyhT7|af8=5@l2~rwqHJ4Wac03sWscQgV9ITMui-P1bDI}>kGH&^Ylj&)SqQ;V6 zkDiOJ`Z+i2P7is9URTstZ&NhlnM-R+J(FxB%htg~6y~xE0aivJp4k^DEeSonEU{<@ z&~A4Q6c}MM*C`BndFL2$#-A3wb1uQEg{z#C@%8CYq%x2D`xpwRE-6fx05J}V&J;Wh zB^qejm!*OV6jok=@?eHec@Yc)KV)PA?ed+fDY_>it`NACvfMbT)n$Z;aV%aK0~_bwWa5_9g*Z7&9OR zexOb?7|}a{LR7*6i?_v_QBlQ%x9EB@L3ci3WEg2@He?kZWH`lPDlX-)#qUjGQm@_&*(Y0=0_6AUbZ%1Y(<&m zoxogE&H+jjsdyN|iSYB)-_LPuy9N1Ysi_NYInx~WHBNOW3?5HYk7~o5%_~(kLPPuotg_uDmKXf`ZflOF$G3 z(f|o)00;5K1j~YjqKMxR6saIo1uL{EN!gTwGq3T?$c)*S;FdzFK25OgkH&0vZq{L} zz|haf6SMHBaFJl77?N|ga!(6hzLccG8t&hIv?rXfiA z2bs$#;^8zGfWsZ0Lx(9O0kbtsNKCgqH!8(>Gi1~4G0p0PAT8BLXV%J7TOxqv#wB){ zEutt?Af8GsAM085xEkMi*5#X1_>6*kenoVIToh$ws~{zQtwi9Uca=cn$C0c@a_adj zA=Jtzmp0$3tVsDc%m16FW>*cEa=6(ui|6UH#4z@GJ~1bC(deZ$Dp5R7pXA*>tLJ7j z%j-56!1BIS(jFO<>XnbF+mPk?Kd+YvX;Qt6AXZJ;Mi*$pM6QAcgKh0{c|6Q?#LV+s zHA!LP$3a#ZBNMw+G{a02!+$4hHRSi%iZS*nd$zs}5cnR8IAOB|@FncB#QTx&xjq)Z zeu08_+b8yn3+-57W$gB>C^wc37PAf+M7XvN3DEY@>U+WG>USiZnz= zYi7LZWkQoub|#kMZ>v)6J$+{m$`{oFx{!9sqYe)SRkBR=EF{#SsImxmgiYMk%vkH0 zKCZIK6GkDDvS^W`?0>NrOsMzab;q5Q z)TOXop=mKD(5Dh2Q38M~`HPz^YmFLKoAl>Rev{VA$LY5_vonqD{W40K%*z%s44uu; zgC;;Lcnl6iy0DzrX$(>F=cv1ZUw#zIkEQE@2SDh+T)Y@5$mr<#Gnh<82gYrj#;#%2 z03+fTOCYks5UAljWGQ9tdO{#iW~~aV>DFm)9}P8n9=o5_^}Sxkh+xN?^PFR4GC@-T z8N#Vmt(Ji|Q-=c<(^YnI6mqmb@2#aDeA#7-)mj{p>^}$M`|(-TgH;eTFmAOQSRS?x zjK6Eib|uTHx;cnH65*(KeL`F8WhW;SIw({C+f@V2b=gqnVJxcIZBXTPLJ|-IcpkSn zp+Gm7S$So+&VIM3z<>C2#Al6L0tip9#T17871Ni&HZ(~NFu7GlbPYtxm1Av z4pag?s{|ZD)YaJ$2^~{g*79phWj%IpLsWnZn%fwQkg8f#%*lH2>cGO}%xyL{bqp$Mj6hh>3%JFI zG_m4G&MWCyHFyoh!$_&C-#Lj*sVq<~I5n}ufI+kzZ*4Aj53~}M__Llywh8DrpH_B=t`HwfNUD( z^b#>n4$Y)zoV>#7$Tv(`_RmQ^Mn0nQ00Kb$zx_hs!7-DM1?A$udn76#fwGCk%goR< zwTNJFL_IobKqMkYKw?Bl0R;%L5(p6hia{aZTbzaPQb;Hd$?U*{-P?(MYCs#H21p%q z<#$a%akMd#G40zVky`xtRn{F5BBtB2a!MSS2SUPln0QajvP$~Mcc_|3R9V{XyIXkA zt&Ea7Pk#hF;C|Yr3Zfv7dk~v7UXB9?3a*Z#F}Mb2z(UV6v*jmiUgHE;Q5A#HoCqhq z$HlEtu?Xt&zjvTdWP`%PF(bxnH+nni5^sZwm|pFg6P$srhk*rA*le=HK5TZ>sG;0! zgLh}#=_eA`=2mo7HgOM+?`(wdus@jmRQK%gqQOs9Dhbk%4i9+?&CdvI-MX7>(tt}P zkP~81S=MmnxjB^{_vQZv-Qj$h5l(*8F4wnxorG-%#|;V}Q)`V|u}eY4pK+TsQ8Q*1 zp<|nAtT8D;9VH1VGtv+I+@Gj)6F9EB2m`EpEGEz|ZpB7sW@+Zfl{!v+Nwd~bYw+Mg z>BdK&CHHonK6Uy2J`Lw1pV8;h6h(-lqQzBFMT*4~RbG6yE3IFe@?@LutO>dzF;Y*2 zbJ+QZGlvteFB|G+qWs>Np|=Huz(c+Db>~8Nf9ve{d7>Q?v&s_a*1PS@aUq%ddv&bL z%Wm7WHbqd<0q>YFKz`;Fdx)>7f>@FR2*M}DmX?BM$6I^W*mmChit}M${m3RXBnx8< z3zGiB0*wK1LW5JkL@U?|6HB^u7-jl|73h&>fv20LyQ;*D&fEOwHc%b*Fe>3P2EY;8J_z_jft1D8^ArN-q0%O6R{wso-PRS)-Ey>0MiR1ugd zv>qQgWlV)apNZ^Vq9xVLtV1%7UK$6-`fpF(56}w5zsLXNe#8kMj1ocqDu*sr)!L@E zyJlMRw?aEpEzPw{c(*RuvcYt0iWtERK=?5bAS@_WWh$zq7A+FBnUL_)AAAg3@udr+ zu>^fM+6IGas-7*5o88(8J@O>fAbh|9@D|YUOwIs;wUqjYqlFaag>7cqa>>3{EWBR& zhcLiBeVL+Z-i`-$vuY|-hYFw%M2YWc8(WNM9Cti?lIvJNZJi-N(I~Mp=`N#~nn>e)!}9Ugr>NMK zU1;Sozc|;^-B9WtibUB;%muJ^6a^q&yNs?eC5rNnxlZ`W)|}qHEnRWG0u$TqgW8o& zSngmvSg5tFvn8?smiOdCw|T>jLhLT+634{NfqUbDcn+Ln9-M4IWqc27hdHyTo{X$9 z=;mgad6i+F&Npfy%TW(aAG9&&@>O{B?l6n;1VbRphA~_-?pJKu=x~&dSv1fs{oilP=G!}vYWYp zQ0M||LcUM6yCghz=kTt1?N)KU?Mz*Hv)?^>7lw+ONo$tdfSR$YhS~3vm%o6+lT^;1 zf1}&UACZ|E2;bjrL7ir#GB7{C)T~00a?SX)+W^!u5W-HvwOMD&wo*!{1*IA@%IN2O zk+eFO#*Igxql1q$R<0ujUe3RFx{zoNn}Vqfftae>VU*;}Yrd)gBo1<^=4%mDVal7# zai7r3G1B2->GJ!DhUqY1MQCz^O`|aPs&Rv^1r){v0wk>Cge6dY2-1;bg&gZ_9~k2w zs;W`S0mY{y-l&L|0)uJ9iEyi_SM2Wp@NJz7ir9kNl|UNHlYvrEjxP8<*--}7?{oGq z+or>WUyEb_!nuY`*(j?bg_+IzFvD}$h6Et}(dM6Ap2Xgt6`D!2$%dKZ)jLos3*~B# z$@`WQ25$KxE?+<2rl+XwB7-^cXQAZxJEteN!I=$mykZu0b0|K}SAAT#S$-;4Pq}j? zN~}s*Vhm_Buam`1YKXK@ibyuZ79xl~3n-(@el?^-J_;Nga3u^7LRQmRT%u=>WscY4 zM6!B@?yqH6vKA_kvm}|Na6;Rn#9&MekH)}lMFj>S;1i&kMZTC+k~l8D#K~sVMRiB8 zNdpey%LsL2pIJOkr}>Fy!jSMd`v*(eAM_(YyUMV!xBf!HMGl|6wp@o_Z8^-g!Y0-B zapa6u=UKtOG4S#YzIDx(PC-p!kI}nM$X{#hkI>rMJ**W%pHhd=?9udfrNWcp{aKIN zey=v3UUvkda*!Y4T@Gu`)J$!nZ@-f8=f0%N^=TzBlV{)Xa{sQPm?1@YV5>1vcAuSs ztKMOg@8m--ejibJB;)hRF8}}cE5h;1<^F~9%4@W^LHH~yJ3vDCfdB)s(yIna=-MUn z^6W!#bG*@KpZAKob^=1b0e`1d3x~4?Neykji(iw!sTdN`-0$a%37c8!>t`#h(s){NxK!PHKZwI4YzFsWb zaChEuTZ~>5e>~E9s=fF+GyBY6?t#GP@}bcF87I4z_T@1*c3JjnQk)E77J?dHK-h&( z&$2+WK-e-)*ReWT#>TVFTYp{k>&I44-hJWyJUEvQExJZeusfxW+Gw5Z1ON&!LCR zPHbB!E#AY^w|3biye{uxs!V1@wRdV2$;~C}q`dr74TbAuml)U_Ta`ZC_idH|RB|v+ zl~`gH%KqLtGzs6i{pYb=+?oxkVgd$c$%4|tyEa)^%*t={?{T)i9-mWA(*|c}!@F`i zUYZ-#5>2Q>R zvygh?<}FI;v8Tz)tnZPckhz6hae`nWFow~lk6e4?zFS>&d%{x{-w=C)7RTmDxR@IFi_jJ_)gyA3d@ zpw+IR>eoewU0n{7ld>$|V&>)j3ug%mslSEHo$mpSL6gX-17}~M$j2%1QT`XLwxrlc zHW=bsCTEpZ3rEG7M9;@b#i~B7XxYiruhP)OWF~%B(1DKXB8%%B0=89p=o*cFJd~my z`VqxE?)l2rCHR${+Ts)JM@==jVAy9}o^Ja*(rG$9e8%?Io`^3iH zNc={T_B8#jKBK2SeY%WD#y<(6l?TBxzk}fqxVV)Sfv!AHI1Q=eoX;s-HxSfkF|CL( zM$&GjsH`e|CuhdzqE2ih&*$+s2LgCQBeVn|Xr!n?SVBNVF&1q8_i-}w==Xlb^78L; zF?D>8%GzTwPcG9Y((bgq&a(av2*wM*@0q9VW!VbdGTe`8NtppYZF#hN{@_Bs2q=I+ zFxxRN8LP%=TpwJ}5M|Gvhs>_R@I)Ehx@KzZa}qLFnhR=4jJ8FtV?(9xHszyQZUNC9 zto6O{o$|TsdhX?=PGwOce=pm63&4}gco%-%o8(BHSof_`k+Z<;di!cB z+l%LXieu4*ft^h(@5+K+eB73t>-q2;=$7uGpsU0bI!a{dEo)YS z8T9qrb)$NCo!zoiA*lJ|tw8cQQ^3;Yq8$Dl`^$&T|_YV;8B~Ou;!GBb37Z!u_r$rrX zSy2aLvN!fUCzju>$W-5Z?yc24o(-6XjCtWlyO3PVUs7?->c?>@asr+pg5N!Q0?6GDDBPf5#bR#_D7NxYi~H)DmDmlPI3YUP^-t8n3(CiXJD zCXPEUPQk6V9V;fQiX_OS54*!E;t+4_AqRHJv}fa23Rj-3D+YW6Yz{x4VZOxZ?bD%s0Ym4*D}3mO18W!A#}{z zd&W(Ltr%sG4e;966mO)ECjrB{wF(Rk8IY$x4DY!KLtKlhHfqkLOBYMDboxCl5r>(+kF{v+9)9FA@;Ti zN3YW25?xj}+8W}#yNo&KDu#TQ3Q?s7lLG?=>*t;}Tb@-}JP73>%1Imu<0#A)8B?6t z_ReHjvZ_r5*aj%~#aIiJ->*7I@3f#AI)U^GBa}}E1qlQa27wZU1hqM4QVAkR7}hj% zBe>j$0u?;xTR`wdMVYEt8m*yLF?Dv5&#UpdJVLLX|Fl8$26=l=Pj}@B+uGIsXV_d# zC1pr@96?1Bh;>RkC@5Fjp-{@7W@Hot#{Hv9^FiYcC%kcnnAe%$ik=*= zt*w0^kKR!Vo{f%y{_>4EJv8>^_YlipcRl*=D%Cp=sI8;edf8yQD;n`hBxmf;ZcN_7 zZPB7SSFclK^*QURV|^jthepLOEwJuicYo>Q)aaGTuh@ImNxS_-wPyo)jygCsjs*F$ zF{heXCme-B2+hKyBPdbwK6?R)I){csQan3V$Pf`U>$Cl&AV9z&3ugCDx25^rAXi3d zUx0qq)`daBf)2tDPQpX&f^q*qe1TT+i?>LwcH z!kh>U-pxj`7>O`3H1;%MA7e!g)KPsx2O&s4A;$jtx*pk04F}cz!jCVW6B6W(Vv0vy zd!J|NWg*zC|)qfr6*$6J$0}7Z?DAFg!r8CIt-*?8>SQcVwGrXdtj35#Z zD-6uc+g}y9z#fs^dAEvj$ALo_;}0#!=}hOh`1)!SyMcF7Id0ZwscJzefy`Bp{w*o95h2PvFew>AybE3fPBxVjwo zTcm7D`MfzKF;3Q%GT3jl^Xw#x1dChscGd@Qxi?`F1Qiy4($xH;DJEHXBB$ zwvs1Mp(0XHR>fgtKMh<{IgMWN(KqU?AAOU-b+;$`-ZHXMxYtUq-;QZSO6b1;1d6gv74P%at?zM6qH9 z)6|X@bPcX-6;jw021Jg)kv0=!V3@~`A)7EVp^NtBa0`m%M#L2fhXJMDyqliWnZWJe zaX#WWytI&zmP{-(aEo)0L@I2WlGE;V$xEe?ANe1MT6|L)0d)t(zDw?W zj`t?kKHqSe#$fTFR?M4li3Tu@jrRRn$8z|A{08m*wLYgfur1sVu23wj<`arA4iJRK z!!vmZMVE!EiI8(foFqLB)}xrlhbxxG_2R&HdT%WD8zO)mq^YoJ_$aZ8itXjJd2u7 zCl}MbV4nAlyh?ulWe2vfPTW_#oprysa66)|erAoWDFun@G$wFC=Vd1PpL5TBXBKxxTJP_U(ss_xCqdx3wnT_T`$QJ4$t@i+-D3AvcV`n#ZQx$!i;f z)Sg(_>Xxh*GHm16Z;d~|w|kRKqn5p~o$bU8C8o6)I{uWO}8oP?+Fm~kQ# zWVf4ewpr3rpG}4)$DqEpTKE6n(e4^V*WpuyIu5eQ_tFGLRKPvCV@aI7^D+xFOA#qN z6ojC&^e$fhNd#MFniG3ux#o=w=>Qc2Ieur>tHZDCI^b#Vwav9h^qKCEgm7*(kq zLl(43Ik<$2dkdzmzz*D9XD%yV-?|eiMY|&kVcoM;pMnZoI1|cTm?+R0X@rL!Y9wCf zz3r^Sz3z2wHb=H3&P9NDJ@)2q){NLerhPxs*8dwzx}&Yr@~~ zc;BG-YmZhy$<*|g^j*21AYX-pI`_OBG3|1V;SE{mvrg|eUWPkUr}&8Au02*lnOVD zRlQW;_^#aF&#kpUE=tRIt=EfK_NclF0|~7}Igaji5O^6F0N-}9%ByKO!|)~kM~dpk z?tGn1t~Ctdr)`mxcUTw4p6J~{v(Fbd@+_3?z?rYb3ZS<5ar zweu|J>JF}&2Ou%CvA=XlsX+O5=%C;Ah8yGNIxd$y7_E6-#$oSye zxcx=3h3kgqC5mt;b(f1g_zp>q7DLc)O|8_sZ8`bcr$>V(y!bQ0toF8A&sIt?C322w zNJ*`=R5){2g7ys!CXi78JRZkrRR0SOV{Rn;+(}I@(C0<%->&h*_GPx z`u*JQlmzY+uDiB!Q{s3{?#YnuR?hu)#zij0TW4|!>i0E*`vB=Sh=oyXYh1@fyw#4I&=Lz*I zZwQ+d`#Pg~KNh&oZPvXC9!DXv1aRkkV%S~=!Lz+iEYg4)vvELf{#I#-GofRrB)TDR zg67R4XcEacIc0IwaMbe&PYxXy*A_hPxoZ^1v?;IVeIj+-OM9DjlTm|LDGEEd|yI#LBgHp8LYpLCowO0lrnjHSOEdFzRF3#|DktEMUcD{SfRH zi>=vYSod%9>dUg)XDwV=NmFae2q-FI)30%p^YUN2&0dZ)>}MUY$-yJhHS=;(V$-*H9Av9AuZ0-g^liPy=iM>VjkMfi0b zT{x#4Vhz2(d~2h1+wX`ucrs72-Ntd~!?g5ugtQ`HgIM-2J2BtXH-rHV;ha1c1oUs+ z&5KR4=r}b$#alM_d8@++-nb;`jllSK5R*V>Q6$&T)H-FeXC5$Er@Mm^pL(17QA4e- z$hck7Js7v6t+v#g7QiP?3|$-+!8b{oxNmOs_y#^K!xe@>P~dw8<1N*6N6&%;-}dN^OyE|#aBhS>$_D`x56>GQGiPK~WQ z`39Ofx8MJ{jLiqlO{f(=-1T#;#_UcmX01fyu2B)wc0S2&lY@Oq~)}7z#`nztUE9XPfdIq zlJl@(5Nk_d7XhA6^E$(&NCZ#BjzX~xXH9!<>ME^sk^c>>dT7m^Xk0xc}5PAiyr0N01Egsz;W~QYeWq3L?UXoGINLrFzHwz zATXZQ-hfZh&64f@IzzB)fLTmhz=kbVXeZ#g#lTz|Fl^S`&pQM(Y-OG)iVCtjJ^q$! zMN2^mU8gwUzMT3nbZl<(#_-Xorq|;sGxBk4X9G|M0ctJm(?(p#SxanlxRt{WtrlO8 zmp;Z`imr67&aRNz>AlD{Ai#paFXG^oVBWVfs@>Pg(!GM0k0aquTTB4ZMmNEY z(;S%*k_~YJw8O-(k0(AI7uFTizcJ@yHgxZ2WSreAuvvIoD6(3V$tJT#((;ydx!Mv*X0^Wt?1zsHa z*bwtKM*e#(TIHS^WGH%Zh;})!#v+-jbL_6I4ObhUtA0$}H)H8yy){@zAgr%1Ubkby z$K%*s+Lw!Fpx+ngnxHDPPjVl14ridn$T?ar(GcsJqQ6Ki#O zIOyNg7FYD{XbuA8_wZuX4e2B3hofpN`W#V+IvHZHjM6I1?Aq3K(9w@Y64k95CqEj3 z_ge}&tyEW;{MwR%k?t+++_TCr!?($SNdb(E&KIc_x4L^-2Q7kA63KMTZf4_l5a{|i zv)mg>QlxT1>Kn1txlb=mus)OfqZkiZ5BNyd6pPim_2uWdhz7 zz+61%ekY!W{mi$nhx%5{%sL@#mxb{a^GR-Q*^%()#L$NIAAsAfPaXAdO|&xY>d(gre*HY$ybOD0U4g1e zbL5hprU5Y5zpJYJc$gTh)O4xSrz<#MP2}l3l+c$o&;SN7MapvU>?nW{7UTEsG<3S0 zp_+CEH6|u;r4L`aHaBaw#V(H8t^2@|g!oPJUW(YU;y_7~r%w zUwWA?a@#*sFD*M7@H*&0qPYh&F}d1LlWUEEAL8DB7EWrJ#yT0Y?J^`S9!BJ zoaMQR$k{&idJ-9PUbYZGfS`6?5k3>R3nD$KOO_P& z9bn3SODZscK>~bgG8B=Iq9T2)Qp81);|{iFzOAFV5)d?ZDt8^MGmqML(_P1XX_7lq zNDo4OddbCLt6Uz%t5VT3yr*#ZN9_(5jM_~=n`!(?2*KWrTnbk+7DUd88?J-!esT-EGGM4 zo_0)YUMDol$Sqk+p+p=7Rspe=0%0rDUB_(YTL&qYVA8z;l}rQ{0|KO#0!0ZW83@lWTFP5! zd>gEx5aX31O@-;sym;nRFOuNj!RYt*OD92e+}(i#O#J3RGv$x4esfg9JoCdIy#x44 z^%NXt$Z^Wt;^ADSUvCNR-fF)3!?{j4k$sl1|o!hLu4LU!1yzAr@n#H@B!% zC#A&KiyCZ&74be2kJ+0DREaE)`IGpPQ6WrL|F4?M%wV6zc7(sUM5>_WH*uE{WtgmN zhRtSMGOe`YCh4P(TyB1AKg6DjalGF#IQe$!)Qj_6ZGn7}2 z@#n!9i3+o|*YcthI>>pc+N{p|y>E@0VOj%SelvA!-}^f0d(c$_bI9ED0EFbM@N|~) zl|fvHuBfw%d&kjA8_uRos1BR_>; zSj7YS``8?vcq}WY9>m6JiV95isU|T;E%4Qw34%dFC{|a^c5*}!+J#hhEGd>TCA(dQ8*9=X^zWLp+N&m zqfjANECQ;IG!wmcD7^uOkQ_;(8J~rlrN#;dV3Ue!2#Ms6Vfp>nE;n5LU3W3Xwkdxb z0HT(FoU8!?q98~B1w{nPil}emrOC;|QYngcgnu?z$KOirQkNT-c-2-sB#DyGgSeO; zpuRDO7g8(P-sNR;#jk5%rkwXFz~RQ=Owu7DoM;Bh4;BH+km+(t?BMmS^x866HTl<} z2*ByUWDhzJrtoi+OAO_##Wp+zvXg9VMT3Ts-)8I*raiZVK!TY_jGLz94~JITAGST5 z)zDxkV+G?^3B`kCDQ0rh3ym>JO7BE45^Vy&@kPP8E8nX;A58Jg^Hrwz?ia31z1T6NI=7wemL?A954(NU>-%dKJhCs zP7c+<0$iX05Rtfm0@qA+<(_;yzfG2v95)R!(`l(Lj6>dn-G9)2>?h7A_BSa z6>111h!O&ff{1IG&EOYJvnXE@6Nuf~UAd7919Q)fBQ1 zEC`^5bw?rWEYw5Fbd{=g_C$wN7qu5TIuB-gvPl~>G8tL4tQnVr7)g9MI zMy>7E^g)#1Izq6c2IW_1U=kE!37dU1(8wb;(}IY z!iPf^x+Up;p`F}BO>-G?TSNp9Ooe5T^@qA;MMBUy)2#Vhh!r;wgV1Xz1&N5tU%UO3C$+V5mi-(&TB*w8&yU5%<$*uCU~r)t6#-r z`i?KpYMY>Uc3Iu6y!qlbDnq~CVc<$Gf!ir(y(eG+q1R~lTXZ*#2*Izy{R6Nt?^rx5j!Tv~EawE=O|!|iTyL2uZylv8yu;owesp>Rk6p#Fg0{7qD`SJu>*ywLYHd=c95G?*Gy@1qDuH7 zBzF~Hq|gYF)y_hxFh$NK!jTOH^TXCli^$^ZPQeJRq$Qhai~Wr2o;N(P73I|p@dAtK zcwrTUL^ybBFINR++=6wLLW#bDxN;|r&g0TBJD8gY^*Hq`;#IE5QE*|@%7Mdn+p|RM~2Or(s6fiwi;>zeL5I}l%iQg zyJ46sJ*sc5c-_r_hQz`X3o4$LjfN2hhK-pKWJOysDMZtLCY*sAog4A%TcJk~o&eja zPiU%94$G)C2wJQ|WDO*PKU%{kmac@$vD*z2V`6pJvgWhqdxu=_C{EVsR#HVB6(Rwe zkeLx%t7>>T9saL_<>To5--Y9PY*`J)erG#dtJK?Ud@X9YMR!r@;D)SGv`1ucPI-7! z*9gMT6e~FHwa79@sj7fzM``#024MCUgjjQ8cjO>;$H zAdthw%!5_MoH(;y%7NYVSo!bX>`vahC#<(4zCe+wL)v3FNW5w${xquDB zX8j|@8AFc_y=v^w4BeaCS5KL2`w4Fr(A6iwKKol0Fx=5=msU7YcE=@e3j>TWN)$?c z5v8V4h#40#f!T6l6KLVL(vY^=t9=$VHVubM5H=Lw!&l%kUnL5{r`9G%=Ndmm^J);- zNU*GcE`($w0c``%;|&ht=hbClutQRpGkI4+LT$>E7%W}WZnijP`*s}V;8g2N>ayi5 z*kw~!m)G^qj5DVhHbG@ZuIF7ET{nhGJ&xMCO(ktUni|nqZyx3yuT8MZ+ja|o0mK&u zY{Tkiv%JdP!}sa-D^}*)^5@!Sjb3rht}7HqVY+>jp^ANbRZYaA!{S@|^r)xa+AlWG zO{gA)7*v`D2#_@CNdbf6!Tbk_75p2uW~S2yWTYZPGZa_|k7X*KgMT5$c3%O8>Go{w zcH;1yp96@qEJ#2sHLzeS(7aBmuNJ_$zf)TmFdT#BDvLBZTJQArtx4c}-n&!By*m?! z9LgBVo)_C;&uL}8IUrx(eDk>R@U!n3Z5w_Ss<~3iuaUYRt@XuC08snbd7u~J;{LHm z4rmrXSUUyyC0YttqZMK)?b^N%)vE2SLI%&(x$QSKMIs!3`S~5R#K!2tQRRN&>eDyirh))FyR9iy{UM_|8F3bOEcoHZzp5Ncfmvq@*9U73{uoXxE(U)REkVLva9yYnEZd;q zt!E1-$gOv^Z<)<-YS?0 zZGm_*XQu9jI+1t9Gcno-;&HOE9p7}*?+9ET`UW#rAxZexbet=#t^%-P4%TM=M-i*s z+zlqusAxGETZ7H)#{SMXZM~0|*;>4PX_7VSWYK(+E1 z=PB0P2FNh>cQoK|ow}vg7XsRRAtXFZKe+ra*x-J}qld)}eVL3cfnw3hZ}VotOL`e# ztXKxeF_D^w1JAtMpK|SYXg)Nb${rA%DVJ_NcI6T5C_w4s5`Hk*2=zyxdV97RXg+YI z62wYZ&1Z9ENzuJB3t$*ZNfvVbmkZhKhLgO~mBd8ILXDS&g&}ZBLBtyHyY;qPm#k|- z`JC>1VdOVZVMau6kyejqn=ay?O% zGQdlMS>?p$;hv~{OkpMjTtxvKYtP(a?lB!XtqvWKOBw~41Iml?J#vR$Rk%u!K*r$ga1_$3(u$&4lK)tHM zM@=0Ym5pHAlL-V2Ds(MVq?tk`6p}?CfLfn?(AEK}KBR z)o}nS+A}?r0uEykchIw|3fL@qun3OAf#v8NhG*!)!VA`Dm-T zPxLjLZW;KM{u>S^>Zh3sD3E||vvVzcOUMdHAzC$)6z%wU?ayiM_g5-+{zlyCV0h!@ zb9z}E&rQEK+&TC81gD|iZz|^0ZrP<=A%7DR1+vjic}lT{`GS!7j1HBH`x-FX-(7-O zdcI$5&28t`JRpcu0TEp6@<@vay494r0zOR!Ul(=5ms^xS6j*FAb=^0iIa2-3b#7962&_&l-2gta9JO1U6XJjDJ zaKJVJ>Am4F-MRa!BpaFW>dDsf{Oh~W+$=1z=s|`QHv|KOj+Kc>$yW+$d-+KhCIC># zP8cE}D2#|WW_it$sA$+G$ZQ`mtFnQqUrjd)r{?C+P^@a!(yNlUI{_?7h`^l6|3l5IhXWF^bcd81H`)TQGEN z;kmVYR2elUth^li`d;XsO`UB2VHHEA3)y-S?l!)<#P8hL#Pn0jHGPj*THIe@B`|5L zoTw61BF%@aFtWV6aQPZJcVIO1oigQDl88D+NMfQl1MV%jr$ht13g{s9j5Ry2iRcH? z;*^HnVkewegT^PFn0RhUHW#GzbBxw}d^NR36hn5z(@@xUaWSdFB2wP6PEcA~WiT?v z3`{HYbig zs|d%_*ndt~JTCJ7i_n3A2 z?VXa$V1gHWQ^W<+Ow~nA+xaY^9^}8PX07}D7HG4QZa!U|x-V(Na$Wg5{VCI59z@vQ zf1_)oIzs!>uT}jTF59`y%b;%P)s1{`$0BIhf1kg2aC5njVXn28K;n=#p z$Lf3*-rG4WqnYJ*xbD}=*x3#w7oyX7=5XRfi3pN1B<23d;p#l$jXTKLY3zIsCFB51 z(c4!4LN7R^7>LxRqKpSE8UsuQC!nwgcr(6GNdk|<5qD*od!vd9MD)Jrug7?IXBL{n z-)9(Js-1F~(+eo_<6W#4jBMED9+3KZvC3v+064)ujytTlBc+aG$rSrPryb4P`D^XC za^u$3S_LHyx=8ot5WBL_e20gDK*RO!HzS9knm8-iZ)!8}dN;Rr?3biRukUg>2b)vS zO_^AMiP33FF6)u$S8PpsR1bi1)YU8_-YNePaH^Q%4Mh8Y28CL&RlRLftq?YfmfoU--*YEmEM!Id`SODQ#=KOYf5W{@Q-OY6s9~fd|~MAs2RLt7zKL1y{OMv;(4dd*Z=3l32}!)J3wLg+_k84k!C zKX9>0r{PkPY^!BKNbqGC$eI#DkSL*{*erev;{^%@6R5l4jKFj-s@J>vtih96$ch4; zrG-G|TNXt>u-vfCtSTNhOllra-0hH1Q2yN_hfFNsKxooaA64oXf zLrqPqAqOsNchI?QAa9OztP}d-MlU6tgHu$OL+?buEm== zlUgPL`PvY=$;G`Cgi1p%l)mZL+D-{W9tEkD!m4nuySA{( zUmnK2f`)9|2$(r1K;%ThP_$w(k%i|u>0>Ne*LI`KEHBRJ^hAm1U+H_!-#fykXfwT6 z;_tGQyyo}=r8y`v4Z^O$FmHMKzZGDzU1Vui&ajaNSUQ8ftd$QRVYy$ow{)2!w8cKU zMuV&G9{B0%v0b@mginfV@R(v&QRCj(CvRoh=}90RG(*@x=U~o01FhD*PgOEgU{rQm zJp3+BpHCf!BEs=n-nCftn18`yzyj1OgsX|p)OYPwTn4(=#$Pp4BKU7j zKs!#`&_dU#68MCK=L*4fcAX0KuqN}hyv*{jhf{SOaBD?KXIO6-Qr0~KT1z@kS}0T2 zVbwZ3_t6oVV?rx6Zpi^Y`S9i_yl4@nYT~9senMfm$>6bMVyDgpu{ z64&9Xz-0l)uM_)KI5}K^DFVmQZf&;r5S*z)6^HWj6M3(+k14*q5xdR)wjWQ=WDVjZ z`u@-1e!jQ1_frZyniHIoHXfoy%y`LT0U*3gP{2x|-y^3s6R+ z1fGV?esXm>>#JtEsy0EdM+Vo6p(5)C81$dX@ZGO`2mM0B5Q~tx%@=!6>EJq>8uE*TM!uA zZ+~Iq)K^Y#?H62fQi3m=qdgngW67c7r-QV+EKa<>_ChCM;?N05G%w{cvmBbWV1SH0 z=a4IXYzT%V;+!9~n%sIC_@zN!#w^6^3o`Ld+i!2S{kJhkYQ(Uo=4{~6skY%wOz09y zCC(hsQG1}T5?PI2siUnappZBOP%)vJ&_S{+Y=Z$tul7ydp;RgudOn`_A1RzyVHS2L z6sXP^5(y}%WjzU0O~oQ`z6e+azXZhfh~1eb-OnE2-cA&~GH+uX{~C@3cMob)%!&r9 z`d6`R{W%2vx*~VT6r08;hk84YW=8lGm8PmZA1?KYx9#nk`E{j?Bm|O?W7nL0MIsWL zE%h`aSEeZx)HO&WHv*>$5j=TpZw0={U%KA5+eB0pth=Y)x2Nyia8y$%2<^f1cBZmZPgvHd~_X*1a6v7GPre9KTVe1 ziqGF`z2U%h5o;f83WirBEX5k$M{*qL4xAgF+^}?!)oB<$gh`ly`J)(+VxmN7*Z4qi zRKjL5MG`KCB0}?L7QG`1XEYSS9%W>htgwKNK9F+!&pa3gY&?MgpU<>?23bjKa_R}9 zaZOItJOt55^pC{&>`u02&`$IgmbH2_XonGrQT1r0zpW`AiSuDJ#E7! z!?J@AoGKXY#2t;Y;0YhhR6V#_CFT|vBrAy!0E(-S`BauFB979yEUoud0gO=&P3E6> z{zuAv(?T+g7QWBW!%cm1%Qap&G*t0#MYbfA?4smTW05dK1b;7z-(bW$%+gL?BpwBo zvi-&hnR+qIVo{dU{SA&&8r5Wh^fuYxF9JkfIlj5lC1Y9q;%ASf*B^b`h)e?JGDIoo zF(tpcBd&-f97tGK2?GU4p`0duK_3H29y5$5IL8GI7{YD^36B2Bz^m` zkw{jtL?7|i)#;q2RRr@e1`GlNIKiN^ii|$vJ_%vPr`Ytg=c2t_cJq#>2H5|^MZz5d zq`WoQDwxicg^^FMN||^9qZSo~;9AZ4JsR!ZOh$r=VjR2uz$#=8N?8^;toE8XI9@4I z(=&lQk{BRS;p03?fD`xQC*axpHgt&&3XX=2iBNCUiOO;CZ0)L#AMvrT`46vc>(Q}k zOHIp$ZA;~b?SIaO{p8fde+%1|4YmLA{$KLH_kZX5=Q@-BiK=W>wg2a(%C=?w|1f`2rbNny z#H-}c$}7Gf)rV$l$HcP1w5$EaD#HD{o$1VAoi<{^l;^>$WvCWpoiO7$d!u}ZD2;x} zVSkjMJH<)6La|7=3;xHsj2P~`?RPh+Q*A0WH%JqPx*Bb(1-H(kI(xQz>{Ni zicXl$kT)YeH$gcR=YnmMz-6F%MN{dMI2TY>SJ-Lo#iT%K5O09w7>S~(DroK=Fu5KPu zhp&2W9dg-C+(gRS_&($#MTQDcUm8|&OPhYu`lq>J+>owc) zoBPes>GIAk3*(=Ad;)mXnqKmLGFHAFvMD$*;DC*`R<6A}d;sx*TPfW^lRNp>T z2eA(8Y3*n4W$Vkv^A^nHS&&Zpl>Or7S5Fg!1gFRTUOr3=#%_61Y>|H&n2?%eC#?6X zJ}dxu8tp-kfRi|2WYZ!*bEgn)l&9~;kUlrk0bWENxdN*6*LG-0V5}%L1^in!hi2G4G+r*Vy@#D+0o-l#~?hM3m&y3&EYKCm*%)wRh;bL7>9`=E!>o2e24tW z!O9b#;zM*_JyDAObuDcyouN6IrU0_z=+BUsOye3Bs-;pX{MVZlhwHovrcVxI&^+SH zT_ZmBiMd%iKl`4qwg|FZvt8%c7eCFXr{P}^aV8)}=@x5bp&DYf@fCTPozSie*9#ix z%Y62NXp4_?@OIuS*i)+iB4W1CR}XeD&ybO{0|sW}(2>Hs`51&}`6)#Zg?>%Q-`PLY z+z8gLrsem8)>Fq)KDN_VaHunrxVK61dgiO*R~)iMGyQasYEdObMO|%?r5<{fZ>Y8B zR|8AV;Xm9fIBGGCw=hfH;z)0^*H23TaUZkhs2RMP&)fn8YEBIvI8DDz^d(88zJxXVHrEF*$b_Uk9Sj?w z&N%z!TbEin&vX3|Nh~$FiQkS+5q^Mc{biVhE7-UJoILhk56JC+JXdjy)*~asUl16) zTGp##12J_2nC|JhEP;q+UqXHsoba-Z={*KwL(q4*S^iR6{Tj!wByJ0^l*X8XEON@z40cfkV7u{*w)k?+ z@2BW9@e>kqIKUg+^C>lt#xO1yMQ>?nO3a1I(u~Wvz{hJ-qkw{@mJAA1kcAfc)8cNS z(@7-lA01Uy8ZF@fwuO02%RTO7@XCP7mx>$)>eP4=oT0E8R=dMmw7i!Lg^>xEP_gGJ z>guMUVF=03k>IGw73I@5vqn_l%iIfE<{}m9z>tv;@~ZZWj~WWF>-hOcAhT?N#{~vF zUJxSxXZ7)cw-Tx_%5t<=qorKDtdYD9u4p6(FSc9@)=K>L!v}BZRoxGipZ~G1^R>(iF1tqfuef)FoCi z(k-%vv*ejr9$7VXVo}mhc+h0#4OMYpYaMZ3bP5mo@^p8k%7Rr0vV$1nEx61NL*PkX zLkp|)uS@rj7`=rp6_w?e7g?y^lB^Om^$*VYq8d`m`4G!OEAkqDN=^)zx}Ws1_IYKD zNBzPEwLueviXoKZb%-FZ-ETA019+qBgcLuQ-AoyjBOm$JL(=G$#c&YJ^Uonj;3!Er zb+gHfgClc&WyfVy3^Qw1GIHYRE4F8)*5P3!^UkjMeeYIwdY%*HQfVJJ`&a9v_a&O& zSfDQ|M4SaN;Om$MYpL&>8zm`VK<7s{MNZeTPuf*xJETkuVb*DBZzZa3`0=*}ImDxH zM^W)U;f-KnrF2%+&wWMDnxXE(Cl7t7@xfhBc+f^uchmwJL|Mi=FKCk`G zrfe~V*CfkUC2>U|6IC?k3J9%$b;H`zK(svPh(fXe-2?SIn-zi zX|lkn6Uk@8@0ykBQQ#}!6j2?9&tkc^=Fu{TLt;kgM^zx~RVyGW@NAZyG=#-h_V1I0 zGP8``^npl)T0kNqNZYC^(V}+|J{^=`Auy&%LJgd3^>^mJvm^!8oow`skB^uvfQT(n zwWXGzYj2wGdSnle{S}CM;X|KcuUesC==o1#3e*}WE)%vST5g0GT^sWxrMHqI3SpG1 z7tjV~gZ`>v$NR~VxvXDIwfwp!36#qmsb>KvAwUa2S#gccR^sUX6t5Uzr%a=M$uR|lF;W@PaG{RTZW$Vc$Nx}i+fD8 zG|~mZa5_XNDHGjHnp2vVj0|N89U%k?hWnlP@<<33M7zk~`el!rBb~xW#S+U2`iyWg zbsZN|27vh&TRAuBhpbsitcGg%k*{8_tGi~^E(hV&QIKu9QPlGKm2b;8FPaySPhWMp zIf;>kH=LfLB*Z$;AWa$x#fHXhQo%w8YEr?dY-A!*H~-t~bq_8FyE96J%qxf|OW1w(W5 z(RjNC$+y&7Z9*anCa`-TE-Yqtw?hQ98`7RA71YCLEc_1!7)C@t{GK9_^Z_!DFx$01 zMg1)0hN!!SVoOJ|18Ww?KrZ#XVSK~Doawh8CHHdDDoR$AcEMQoVC*!*0k3D8A}j{o z<{!d9dZjMe;5CSITpKAInVeHyh(`Vd8n7wUN|Gm;PPb1~IiSwVds)3rQ z5ZC>r3cI&)V#`^6#%br{_?*S(zdw#v8qg&KTi%j@{dG7~=93`-V1x zGFbvL-dYs6C&tE9CIP9H@!mQN=yDsZd1hU4e}nUJ-$qD#D&saBYN!doZoPUK5yK=s zer*<$CPw`tcUx#RLrjKL<=8)*^fBt8NFgSjpFwrZgMngPRJvW*ytZdn(LNU?(k`q% z(Da?*bYoxmeN;GR4NO_^j!SWo33QjrKy7B1`)IK{Ejm_M3r)yP6WR(*sA4Qk;h|D> z(sw?oIbuQsD$lbNdVfZn6*9I^QZ%m9xN{eMdUOT6)B+j+ME3R~c_$IJ|B5d)ioLX$ zT+Dli_n(;IXbB+HC-cA6mZV>GOxGZs&NfZOC zf?4eXXQZcSeP4VK3Q&2lNt=ANNYo$(PL0F1m7K(U@Xbqx&}@y+(qV8_!UmN55EwEY z3mc*NZBq+RbE~=E%&C|a$`WRdqZsfDlxNrd0-a?sY9UE|BX-ZJy-dc=7L1Q=r1X@q zpY{TPp?Qad$3t){)K;KatD%1_5ml;6V!U}pJ<@GkVSb~e){Y9GEurrB+oqjHC3F)>GT5lKc_>2y??!Eh?))7)<2f+G&jN`Ai@!vlPct?TF<#-ifHt)QUpz zy)$yX&&RZ%n=}>JN%~ji^{=VMLf~ESMQ(kRUiU^&H1==u+AzWUID~*#zzolAH9@kX z`=7n$!82dEd7rP|+Xs8E1(4l0=0wdJ1cS^8iepQ+D5x5L7`8HI+BU+US+@%FGZ8q3 zm+o`xT9Y5p%JS)jw-3J_^P&q+>;zwP*&<54o~FMSr}tO>XIem%_RYaI#;mcIz|w{D zRrhzmd5tR3#lVH?D^PwT;uCwhu8w2v1-LCQ$kOrXt1#H`b3zPnzw68D>t}oDiH`J3 zQQhQZprmzA33g*rWgwjZ=X40?z-q#wj|u;mGI6Kqb7WxVp9Q2j%Gvh_Iz;ky>bVo7 z?%cwOLsdhgWcfc0FrgGX&jBIK!>|f?=#p(sCwn)y%AXYxq(tYO?kae_Q;D9V(Ui6Giz`qW{bkDK(v^h#l3{3XK1U?O0W(Rs zed_8wv8fBKQkaT`qYn;n-x=!2LkG{jW&+dTAmEl3qG%Mvx&%(A7VtgCeajj+=6a5a zr4agPuuaIAjareChPQ?W%BVl2WqZDRkgVvtb^oIO`A%-l!y}Amjb{_g4$rl8KUoY? zKVL~!5l}v*x7#0W!21uYAWH3waYss$#2Y`xV+b5UA7nY#WCD$`3g~gt@8|^@2j0W4 zcAX*Q{>mP#isUtcf8TL|^t%L!G}om}1jP?o_vyUP!=RrCY}Q=I6aVwK>K$#yFuq#?0Bu zJcYrD7R7%MVDKIaehVPMH(<2Nq+v9zc6K%LZH1T)rVPl4fig^AylT_Kds5rPB)=Gi zO~NrDrrIG#bEi>&0E{oabj%pe%kR84D`rdTjTzh!Yw7fu*iR|%z;}!FYflDCCz7_2+50+ z>1%Isqd=C)0jIn9Z2if!f)~mgoAo)nIeN|xDlcuj7tFn%t~7H)!gYc6jo7`D!8J=x zZziVi?@fEzvu8P0G|V9r-kaI9jcJ=5eZLJ{1+}J>;-}wDOp#NYfSF~jGcQ5Ejfci> zd8#_gOYPU*i{uUty`8*D=T#d z4^|BDHwqdIbTy^eC=xdgi^VYFg72Foj;kxCv@8`>&m_GtisCw&hjE(y)V8bV4a}O^ zH)D%;^RpyV@VFev45zPB-|El1KeaGz;0p3Lr6H8el_0O@-_19}y5=bI+y@~pE3wU` zV$6)<{>mY$^>&s@*x5vu%WF(v9V?o1t~)yULa5Mt&a@D)i?jXVnmK%+ZMVHz@eGt)`@ku$=f6_QqF;;Y1Sr z`ZEZ}({^~@p3U%$Uba7qhmCig>MyqhbqH!7o)3M{Nj*00EPncu8-#xL&d8bD83Gq5zP(+GGaSH~k+{4iR<(uf3-a%~Y z?0fls{Mrdcy-@4R7wo?0u*zJ+5Orx1RclhAz0Z@Vbh3Glw$;IQr=Ll{y>Qm|Ff&Z@ z6ADoe$~Gp;RaX`D@@CNAdUeyTNN=a_N08vH)^yaxd9!ym%BMpBtWi2FP@DaFZ?m29 zxL_rf@gy=^|I>0KDPbjR_<&7r*b|rCx`smz^YOB~bYEQT;Vi{5k~2b7n1hX{voML3 zZAbe`#3ASkH#oU`w=27{wDNDWNkg-WTcxH@y{1Gg{;G1Du2W5>k8&x-xOxQauUeLl zv&?ci%_Ydhr;Y4%o=oQ#W`-u_5Vap4ibHo8gk#Toouo?O7V^T%Ih1IX zlVxpK>A1Q1kiIjypKIfPN$cd_mXS`jx>%F>`wuhub`G^jp~9Cq4&qTFdt$a4E4VQn zV+54g+8hy3B7v3GIfBv?K;c;F0FYF6vxuD?4A4UD!pd(p=N{nSzVmwsx!Ued2~Emb8omQo64E^^`W8pI)Paq=_gdx z_(w0LF#ht$i@iZoS-;!dclM@hI+IY1H>bX-*S|eUw(s2Q_WNc^9oYKD<0NugHk6!* zp^&~^yXWTboQy8*WMsHJNp_}3NP+;m*eo~V<5Og3bakd#s!Wvl8!Sy_%M(1mm#6*A zgUZ%a?7HWwq;Kv_Z<)IXYt))sU)at!?mT!1>$69rx~kk;=Lc(=ayQ%FJl^kh+Ixti zH+ym_X<99hGQQ;%z!+?w?bm8ni=ZtW?49Aebl#XW=~hAs)f`>gU);Ev&AYqU8tzuh zGnH1ma{+4>(>?WJoy zPkY@{-Kjv&0w5*G-} zmO-S<&R%DiW#YDb5$IetpQVPhJ&I+?#m)J)VMd=;92Cm%dea$2IitgSyB+b(FwV>2 zapC5x7*(7AG)fQ zY;C1Dx67HX?XurKyI!j*f?`nrtCOq4cM+?uyFKnj4QO!f2rB(Tb7{EMTv|)h?Pkby zJkZxqQp~E&TCMHcE+baz{7vrJ{vy_~@v%~?fc15im8HStk|T!0eHTkuUX;k~s5-39 z^PbJ+*71Se&J8ly_;_!07?fo#p4DKZ+QepT|2vCOc=6(Pqe#EV%RLlz9C6k2xng=@ z=R5|vQZ6ea;Qa7pGSn{AY_dwbV~tVc#!4xWbB+d+{#sZ26h_or5Bp2IaR}j5K2diy z`X0JJ+E}?1p0X{*ElZMBbp6oGoi?Y6`Pqa}h2?BN4Yxx6A!53qBP=IR9;VxErL@tt zep75mm?msF+_Zl(%#W~q&^522!CkO2Sr^aPsJ~2Yds-^yB_+i3dga>*!bk#Fr~*R} zZk7c)KmbO*!KI>4SP;F?twLDb?MxODRWrDwIXU0#O@(wLhY~}y%Na|S z67liwWP79zzk=9jxMuO*v(2+B4u76WV#YUTj@W!i$rgT_5bM&jmE$itw+J8W>hFHR8d@JX7qTyvZf)mq zZ@#))q(GS+e^aJ_&(9Or>Jh9hK;K@x%l4 zgbE#9T)t~9O;VHDupi=%;Ik(l)pW=cj-6W_F8g-UIe_wn;9D$%Y3t8i9bGil7lw|ur_~?{=0<6ymNY#VtBAvJugC%8Hd1zG?8v}H)ssL(8MW@ zc~<`OuRmo|Gqq08sJL{Bb;__|(dMb^7`gq_FV+wMA~fY+Ho0tQBBad#drd|Y5UJ#C z%P7j3HZ?2Zli>Sovuj?34!T&pG+DYG{IkTLe_?x>L?@XxGu{qNpRv$ykM3lH{U}#u z&%ksv+f)`PPt{Pt>rYyD&*p^DO79~%?1!O*$G$BheKN|`GlR%s*Fq#jBno9uO)1eO ziY>IO#qs$2Xk*tqhc}}8wTW`28K`Y z={&&(Hi5saTZh-kK<*44wxqT_$^LoVVNZD>KhrcM4sMAyuip6^eyu4?AmX)6O(h_! zV73vasN&k%bf_gwJep{@b9ViYNG1V?RbcD8JTtF|Ufh1bP^njeBa{o%@CK)$*kgyT7{ z_QfwN_O?S)bkG9Od3QTB=;1rD)fv~dNLl{#K6AB}iX2*mCj&-X5s=?M-erRJP9n}X{%=;aj z}2?VZxA%qWoa5`l#5Ll) zV>{iS5Y?Zj7lll`nH@w}9$~Zp$OAuTzNk~;_VqOc^7m@dOWyqZ*^j{||3SlDvbNHD zA*09EAG_WC=$$*M4Y3lvX3_#KsE(-&Ltb?gjDtBSC}x~UVkqb|wjKvcSsrA)HwlO0 zeDG*EM)_kYCso5vuxKoz2vcZHN|qf~ulYza zMWv??hlpoWP?q*5Sd9$n00c;GK1E>#s|gh5Yg!lpJ9SzX^Aj8ljWS=V3Jr6m2ze?< z5yeyT?%UUU7V{eEbRcY^wZpDuF-WHff&QW9qI11!)uJkZhFv40^@L^C5Zys^*0A3q z_Yx1bpf0GZsrOFodot36HXknkPC(QzD)dvjYbZJr!6AzdCqLC^qYx<_6mR+s~EXVr8cFqTb z7cyx0upAO1#@zKECKbtdl+2jNd`{q}$pLf5;I|=xDB-+JQ)zF4Rw?Q*g%{y{F9+NI z$Q+5@>$-kYhbpQ4q8dWN7jF5gzedd;s_2`6$l=KYqL9yl4p2~WaSfp7Ym@{h#r?(( z&J=|7XA0i_v8*tpg#0hPYdOL^gUR)NWh|p_Kabs$z=`$}~Q$m0V-88a`>kl*T*gB90)HnPP+nwCPBY`n*0 z(>E2qHTX8&o>^$nz~=pRc@X0vA*2DXVz+xNbS{M;teZ~lzN`WZIG3>Zs@L;_N>Wgi zYH6!^K&&tvB|j2$NNyW0~_jhSBk9b5I)XTpGIBGa$5rK*9u zTI)K~Pd#(G4x#IBOg}xsNo_~hF?HJ?lK$YIvC*?fLipa%rrpWcoxA|}oVjODfdlx+ zp{PsLcyK70U-1wH86T*;ctWCX2EGdVqe2@?@JjqP6^eHT>mXhgE*F)`pck7G%;-Gu z=ey1cl5G*5Xuq!nTI<^sQi`sCS>8WV@D4z$K%SM$bhNMc0DWD(`v&xE)P($aX8vAD zbZec)Ry6oV13SsdUdHi>NhO*Aq=AjR`CI@zXx4)%fWa)<);^Q}Ul0V{3rUN>zSr?g z3#k_+MOjXsC`(xv4dEx~U)^=w8fppn<-0gB!n%Sm2k+e;wdEn;2Pm)U9`s0lh)pBwSV@x-(nvYyl2M#;!JeBLlx+ z9uQ?nhnrZtmMuTG71Flf?P52TZbT&qLY4Zz73zs?#xg}A)9i;Lp*bl(aJWP+3r@N8 zj)!ht{Gu;38kUuFli`}v&Eys8gA!zW~UeWl3#F=bO7g(&zxlRX>A@}19) z=$@b7#HmdCC(pyJGmC!L0=;P)PkD@*dIDrJv2i&U>ocxfJ%Vx<>OSi?S*e*FKWH4* z)-N6QgU$M-50|~8GkynmS0D3u8#+PyZ$E46ZoO3RZ=XGx>LJc)Yu>Tc+Z%7J84&_c z-AvM5=_&snTAvlVh^k(1e4>0R7xf-yP)Z1AMOHHM(c1+dVrGZu-395c{n`tD+Megg zo4(zn4zw2-G7t5RTm^2p^T%P6#9ty*UDKRxX~UH_&#Q?ayia<5bR{!*nMM=4(u+^L z(s2UD`Ld<3_yMc7Fi=O~;Bg&NgjRzvZEz?bFP5-yQ3^+KZ=Yu^^YIN0sZKh>8IL@M z$X~s5wz>+}G@1X*$r6&PektPtZu-8?KGvO1OgN7Wk}WhRLPs$6l0|zjE3y-8-9DcC(c>C&Vr%}c>;X-5?2gtiU4mE-ntck z^O=YKnkZQJu{1DLK=dH6D5i85v(X4<&MKZ|AO~6-!}2mDd9BLJ(jm!i$LEkxk57fX zIYRFRA@FQa_bKQG-wj2<4HQ*Zky1oaSO~)wN#7ZAaU3s>4`j?JSoOJGCB7iG3_}gt1n??cjbs zZ~w>R{%`_3-#`xhdAMMC`_w}Z@#b{lHI|-3+#(ci5=VSeI-bJ+a(H zpc(DEyp3j{$$!a~Ss#b|7Y3Frgu`f=tB(t!4++JefvD9be_=ug?Ht{l!>)#o&fD6j z4dR6wI~5vMbC*@bGX+t zuh_QTp3~mz`6<6?d%=YsrNV&h=im z)Zb4uOfYewB%9^)Je|S)S91zED*WR+%VMtI9dHxJ|DA?F+6`W_yf$*Bc?K*)PE!AU zgOx42w^SGJuBn@_IPFI(=Zh3czOu6yq>UKX_1Og^d1q|0_Cl>P$7r#)x6#_D`W~vg zgZE(B?WSyIF>6X<-0q$Lw3%PpU5SPfK6TbLEW2%7ch7IufwQ^P^g9P$_mXE?9ENV0 z7xHWkm%DlMmIZm|jJN+??Z9rCZno%T^x?x_b5o^a;!|6h?(CP-ZdJ)WV(Zwp4Oh;Y z(zuxB|6{FVb+NIra;CRC&nIxA4mEF(^f#NyY5(+ef71_hE0&ScpqBw}h5J3j)w)Sg zS+bq{aC@aY%4)ye-QLzCUU zx;egXETL~6U^@N1^HIIXRhMBCwqbO3!tr4VnPao_og47TnLR27=14+{x8Ul^ieFwZ zXT-*Ri8YIM%(uuXM+*Fs5?*ZhafVXfD{~uXYK#$10wY5vA+j$)iJ{PP_*91+N1yv!8 z7vg*fsamFORM_8v;m7?nraB9wIm+{%`z!)|)O^@s|y*dPm)Sf$tIRF4>z4-{}`)>88g9 zm;Av#2kV#3Y;7WFeQW-~OhW$cY5q&y(1n$guIHB^`VH)N^8T8|9eZs*bw8l&H?pL) zu^0W~{*?;D)wO)&8)kQbK`w)i&JjR`6mDG=YTcWZdb47n;@9uW$~1_7(TJW+kMHsi z9i=B}M+@Cq+IR)g_{X#ux(uLIPB_8;q@YAjhnuTAeh2r%C`Jrd`s<~?88^MH3dCT= zy&2Jswv|CQP>k@_)4a**(V(lDIz3V$)5jxBV%c%oieQJPMtS$#|7r0;Nfp_p*odo9 zfEeuah4lWrye0V6?2G;2>;A9wc*YTt0Mvm3q}_2t8b18|l(eN9;G6m?SKzMVuWXx- zf0n5$1LnbJ>15n`#%nj*|GIT8->UExSI|lrc!M21DkZ98hxh$^ZA2gmodb_OB_g1N zE4AHI+8`wrLc$=t*BIYC6;>2|>$As=j>+?n&fKw0D`WqqgZNoj5B*(#oLbFqs>k-U zFOExmpd%TLz`2+I9~~x9zUrcUP*l*z#yI^?OO8#otZws?i8nXu;2j5t^ zqr9jmTl>3h-Dj}QehJeIi4V7I1;~b1oX;PoR!0ZB?z}{q*}gBl+z%cPooOV6uAfZG z?uyfgf8Ff1OV+doVD$a|5(c2}wEnDStM-{+)RhjcQIRr)M1$BJJk?lT#pW5W)L$?9 z5M_bqi zpSc5xRjKorL%f`%28(wOJ88yy9iJucTRL|3qA$KWc1%Am`hrwjIhR#Fvma$|UVfaH zXP0(A3Q3i(pX|0i@~!P7KZGIQQg6+o0~-}@xO%%})-6+QtNHAjN}W2?i?)FicB=T0 zFb-u$jFpY6?p57v=A+@d(fg{KvJRi4u22BwjveBgI2KxkbYhF1I9BtSvb?fKfvCDKsiwY11#j>oZ{V z!w;x^ATUzXE}=*uf!}spV5R&b(LitQrWN%T?aZYe^)HL-$$E80?Xrie?NW|G9|SEt zB2?>e{;raNwSxhXJK!eWrb}OMv3252(v76lDLXcwOzBTyGEO{Kucj!MX(*@0Jr;2c zFISVm*3%}Q7bUpJNP_tFU&Jbm5@C#1tXWzY}Is zdm|-JyM?V$ViOUO-KHLW?PwqN{nDlzD+`u!DOWdjHVsLvmr#NO(4@|A-xTiro+_S6 zEd-_|^wL^NS^Ps5eLQ5m+;Hl?I*~e>y3_u}`@Wo9_v9X=9N%f^C?oCXk*!V9;>{U; z3+kCKAbz2^XnjX+=5a`>!~-25uqmmF{fm7VPR?C1J^XP(@U}}NUTQ*K)GJ#zPBOZy z1(~aZGG2WUlb%&k?D3#$NXXq*fK{;e@GC#vOL28|FIZ=d);^g8FS_3KTTcREWKO4_ z->JVUtnxdo1t4NLRe!8ny%uho2|w$;w~dHRa2~n0%KB5ESQ!1VlI84sSKf&?E}ogU zi~IW?Hh7$c(YucrShlH(;-~wsdrI9dPQGE|jc=&EiGip$Bp$a&`wVkTidX!_+G`@% zJ{vA*dvN< zD8HPlM8jV?YtgS7=?k{YFF&dz!HUc^f&JHXd4Twj$yOUO+^?r{S@297=Ub12Bh>8)L9d^=~^#JK*s@5so>n_Rm7s;Lz$O1${=;G^M-Qvo`%4DGI; zqfm2y(%4g3Z7@;u^SO(@e-Tqj3Lg1Q`YNPV?*eu89j7)Q&|iKc^>+NM&%Ba~jt13Y z+CCjNXOP!I>Qwc=L{20bUg|V&Tz|EcZAt?^1$>a_hQ4JZ;)b$oy(-nfED&U2Jp~P{(^;+<~dSUAM4mjVZDag zeVY+-fdKM2V0zIZJE?0Xgh|%=y8U}Z5l6}K`ag@!24X&eDUpYrheawuw#}rB=HM|l zzKGx;mFmmM(j~vy0|*|&l(WRe!VnFXxzvA4to~IqpoR`mRYBfHs8P#{CHS1Am6e?9yv3{NN& z*KXvo3*;~`%D<{6N(aJxIPiTej5v(?I0(_Dmv^Lto(j$Ej7JT+7wCE2bwWz90(s$l z)HLPvi#42!jc`bzfHiTWb&2_|J8I-J*9Olv)^VyT46qu`E;a{BECR(fZ$j81bUtW; zEgB2LEsaGE>)$V4nRq9mhIhjmu8fyDXfJm2P}6-xb2RvCf*B-J^G|{)0z$@Ox`HNY z=zN-VonccYRf>!9^eU-Z1c-v;%NOH*dkWbOo7;3~^R1=L6gQqW7iH9{E~N{a$O>-n zEM9__pkLKex7LQ8v@SBQLd{u0Pc@-@9(`=E-C836K9xA8^4 z0{E(F^94oxwtlrel63gt+kI(9xTM^=rjGIO3aDu*F?ane_?SZN3_)JqL6a8 zWzVJ`6okzL^_=PE+`YK_%zCoH&p7XxzV1|Oc-TD|@kUd6_Gmp0p(~$J7n^c-tq=#g z=BICM9Q3Ef;dFT6TzEEsSD|Pu6H3JSUe4n)DpQ%YwPKV}_we|EFWB~eb_kj2-_z3V!^c0eOtj-k zumM}tF}Fisx!Rhev%turb6pE(|8Q^74($Hd`cYb;37om<8CF-Z`=Z`(8Vt?K;-3X3 zRUms>n@l|dH#WQ^;$XO-r0pLq+HM+fd@nf1zUCk84$;Bs8p6uTxmS#xh_w-i!w?jl zQBI9IVO(JR&*tSZvC-9>>$e6e0!{kxyFM#%oKX;eri!w{zmUZMkE)ald!jU`6S4 z_g2}Ohu$rl8AGG{IEUyhLws46Rf`63k%2QW_A{D@C6SUDKA_4%w>q@mH2!mMBE%Jg8#>D}5p{_bv7VH&s0{e01C z<*_>VvVwGbl*;Y`L3u!c85gt4R{McBfz0qH1SW4a^RsfLBFQ}ND$awRS}df^DYfrX zqMPm~fW1z^1*zepVyhyeSE!ZFjLaU3zfkRNLS&x7kk{A#_4XC?iTI5tQNBpEFn_=q zv2b!XW;rnELtVV+8{VgIrV=ZT>h{;FL@-l^JkrjL>xZM^)Em0j!7p=hjro0zvWmtWG)ysBd(w^;ibz&P+0isuM7}dQ#e(PB-arSb=u;4d5=Fc?M|9N`wx|6A^ z@!(xL6q|Q_-sT~grAsOZ@W{co={DEB=$5oBe!IPI*IHQdy>6fJ82bp@2WS`(-{BpZ zI(FMpT|ENyCf7dw%%6THV@dIzsWSAT$(Hg+8~0W%5>2Yv%7kg-J{HwzsRXbHpyNml zpn1RY#49}hf?Tp*-L&k8o!wfIFWBXPNmusEmRcf7`)zZ5#}a^9K4fL`W)mX_I*kEy zcNk@)c$;GI-f`3KQLjibxekvc&_iqTDj;-kEBjl)3en>`hNxC4XnIy2-kFzfw344M=xf5&8^EQFh1{VvX1tw7K+F5TaA;d%9K=@~;#E*ux+# z69DiuhG%r~ceCIZ7f{Zb623MxB@(s0;pu=PwMpbv78}U`&o3fW2(|{F{k@l|( z&e^`uBT=bnDt!{C>v=$sHJ zA`u6L>Bc;$Vdu9mBjz8(vk}89xLN-=;1|Pm8e&mom{%yk_5dKM!l1aS5C`rHGFF111yMm_{P@49Fgq3KH&rZCU0heSGuh!d=CEu2S(rDP&&mn|4PKuKgQn7g!0>=x z0z;YfPitDjs8>5aky_kyhh;!gjkc4OjyI8`yD3w>GS*$KUK^7Q8DPE>3LM;){GdC| z2E#F>(sf?%sb}Fy$^8Fn?L2P%7~JHU<5+imQIv94dYx#G?8hJ=tB?E(;tmu)td4~Jk7pPDSeVGu&bXdd%-)8hvY z{>nyv#vu4y8w7r%M(AF>;L>8=*k~M67h2I$4WKd950hp7JBIbd3pfWHFNHj7d zad!&sp_XbeE-KuMnkoorAal{$9i|B+!^Uq z95CyfIt66Gux%Xj;Di#@2o^>wt`6G3TiM~Tw%6=p*to(qHn&%?fOrkSk7-0Qu7JY~ zD{Cw%JwEn16W(>~=W0IMaTehXE}2ig7}Gc%e|erdD~y*c@Z@Y#a&!++# z!CKHv12LG2jR|NB+~@_|L&oJxjNVQc2ZNZF=DqfO&~kVp{(t}hpaMXigbGvyQiah( z<((&D>v-3c`l?4uo^t){{wF7&fbk1Uh%u!`x6-=+p^z(^?SK)0f9>{&q(2KCOqqyT zHW(BJi~Abbt-FWGUEhTyMtjY+a3!vG8OBw&E90et-Ip%{`W4oF0>oLm|=;Y_H6M?iLoC()AsD!tiEf2UiAA|>DIa-Pt1pR zcYf_Z2Ipg%spIHpS8oP;*f}_Ox+o9trC(YZ*dA4=nr5zTNRv`3W|etYNy?~MS+usT zj6_2xLw8jw1z3EoM&}6D0S)zfLCa#<87D+#%*}u%nAz&%*|V#~$44WYQ0|Qk{upFr zvQ8$39ltX(J%*!D^ja_g6)(4f663S_3;-BIvT=k!ojvZ}2s=IJW4X(4$75FjbhGLa zDdYNEohX-!5=oJa#HDH$k5ef2QpvS#bwheenGx%2-#o82m6ZxgA&ah6%eK{y?QN*7 z-`Q>7#oqT!cKuZ4-`LzeoZ5Kr_V_H~tZjE0FJwJ#-GP> z>9BQEZ%IlnsVR{0?z25uV^(kMsD51h_i|9S|9(uFzLdA9{X6yU3cuFe{-Z}cUDZ4F zkh(hH!4#%0Z-gvegldznek0YzPCd()>B7VI&q0mI^4dOj_vHGpL(D`GV$1?0VNs06 zWe+J!5lggE;pUCK9J=Yn<|OY7WC4U5!#Bz7lp@s_2`~tKnlupUS~Yy~1UMFXckh{g z(i;J^TG)ZiX0e*3?=`>W<5TvXuUG%Q{>L@zx|MSJVp%<{y(W10D4+V_cpcpl0>MWW ziFUtVLwWV8iHcs&JJjrfcBV(tGTxNx>o;98ns2PpgV$GRRIS8y_ZS8a`94+`FR|A( z)!@oQa<4>@v;LC2A7~ipeKR@kvaRE7BwL!%0yC#}udz3#< z+SMEnAszDQ%%&HPrfcp0>O1}OOhucemh`H5Jzw3l$D&9(@>(ZH>GC#^e4~h+U);tW zpw;$2cCh;P!>0BB1~lrr`_so$@9jE7jUV2)>rwaazVH3ZXJ*2CUpZb+Nl3rlOntjO zo&VkJcCG&9)4ouU`pPSZ4RE9i9-){+a-7nhF9B&U->?z)`e`k!h+5K**zz^$) z?LNP*`kSqOq5d5H$DxrmMgw4Z4jTH78)9tswKL7YIGo!XK-*{=AKY1wzAUKzX(EN6 zg-cjqWHGjy6Z|D=u>87XsvAK|d?O(;Q$u-h$GD3s2GUKVJIM06H}^jm`TvXex}AM| zILz?&ax$^7Lw?FLq$u7<(bYJZQh=jUSx$KG_zL{c$O zSPS~pDhfq2#5aNT@kT{aMHOMmQ^bm- zX>kRM;MM%@?F3W!7O{mCw3x}BrrtD%CNG%^`Pu3Fj^Ef_VLX@7JwBTYlcV_vRs!}R zSs&{wLxyMNt2uyFG@B6I+NH?Q%7}>7(EC0d(Phkw1r{t6ibaaEgUIxMz3nfQ+@=&b z5cL@-$fV>CuX@9`(+#HS1V|&})sP!+>b&DE_2-%yD@z;GI1n$${Y*aIYwGsxCfXu5566^LMBtjXH5n(enkW&+xa-Ce$(Bttj6`+Zn3KZdxlxvk>>;kA5!$E>G z0L*yMr5HaG4C5JO!%uOcG-!DaW@Q=VD0Bk}EP3V{Jikjt1_`icFlvj~v(rkpj}xQ< zS~lrbz+>5)Yb9&2?3H=8<;iw-TzF|c*8}Bcj~$3!m7lcGw@gO-8vjsuzn%R*%R$-z z$h7^3`r%mjI><&V-Fw)~&3$KVX2YgOX2maqD`V~?S(%zKRG|-nyLBe`RSMGlX?7_sg;&;|J;3g z>~+DqP?Rz!CN?uq8`lRiUK<%u^_MjXo5(1(ooRC>S2SH40?`C6mE2g8tekJE@dSgn zse<-xByih&sLbVkUy*+sJG1!yw~G7R7SGr4_RYW0B7^A!&(PQ2beKEO(C;p}a4}%2 ze^ORIk1!GrzKm>jSiaX=1`V%wRDgjDb@cxy^fj<#ZTK_bUFzf@JTD^$b&&M!WBYpL zVL62zNl0U+a^cfG3oo-ShaFj&b`|iW!HY57a$54BLs{fICfBq0GsudE+rOC%x;FRd z#CmqN^DX&g5}V%A3bx^Ua4&EHz<_+eOaSt(ALO5j{SZaN01ZTtmz277J7JZgg_8WT z{)?yb?$#0J-@%zhbeq+%i}AwdZ>OM3&2f~nadWGxO{LY1yUNBg=#4+6rn0qxWFW@1 zi(OG;D;A0!h1L@5Ib(G`(yG~;sWeH@sV6a+Z6a!PtN{oX4AN4zRDkzzl9Sy{I@%Hj zL9RhhMzctt!}938rylmFc(?WA1sxEo1Oxdp6PDicK@hf-Qp&+d^YqnD0LYuHY6xn^ zEgADKcdtNbZP7&G)5UIZsIF%f8`<_Wx~$Ku`CWCkA-Chb-{U)B{`o2z$|=eGzbTka zi-$Lo#$Hg+;eI2Wx&%e>9ulC4k=lGz$MI$yQcl#-_IZ?Om;i`;MqIi}Gsr+a@|I3> zn#!-19=CvPblu5hK+EFCKnTU0;=7Du7A+Bm5{|_78AJt5Q&6XzYLWG|$l*r=h~(uj zoV@0GyOHr(Dlf<{);(=Y z&af&sEgOU5zQO(sjYt&tBu5~6BS03OI3xo7Dgd29@7S*aIc+h_h`?J4*< z)Su!H1+ywU#dsQSJ>M#$LG{HHq7W&)mk0jtHl9orcmkl|uL>AH6{D)~YP0+UGg)7M z3odae#GIciR4+A5K9hYv6FCg5!&y=hV`wo-_eK<`{7o6&l#$kVP6B+nG<4;)K=^yo z9OH98u?Dd8yq~WyIFIE3{MJ+?%RIt)=Q9N-I3-yM{&DpF*JiYrQ;av^J}xc(YfqSr zOZKwu@)F>hyI(eCmRe;mAHh$7^JvF-4Co2*XL8ONZ0o}Ai@k)mf{(Ep8Rm+~w9mnk zYwj5kk}?6wfB{KWe?E8P^vCj?|CRrd?}Gzji(-2|UZKy(5!~Rq{z4Csz(g@UjCIw~ z@Dw9slwfr=`?@XQr6b1+>z`+bm>4h@CI7XO8eu(YMKU7Tl1+oYpscL==bb#+@iXjg zBHYhwo=>dwjDw|l2*nCa@rHdHdY)f#<)7YRE)M;Fto&8`vVs0ILut0gn-yT94uAS) zv_wLR%`#S0#4f9JEhL5X7z93C{DO}G^#!Z?tNEXu^S>)HR3wdwFr!Q>RyXD=j0Psl z+yLG*8d$KH0|pC8;xfx5ODf+ifYq2mToSq7>`7nkDhnpUhcTG8t56O+BRj@(JM?tx zz#Ns4MT#sNNl-f(SpTBao$J}v@bAlVtQ7HhZZ53BMTqGbqspduX_lbldw8L`V0RQwdp#vYCv}4sn_oYc|n|vv#(1PE@&Qa^FQWM`E`U>g&Skvf9KIHOl6aRc*Ur zK+Ls7Q!cGCHq~ID+E~Tel$hfRsG_VkXsX0fSf(*biZCnBRY66I6i17!1Ev-TYQnM7 zSrXXQRg7mVVlfdnXt`r<^eZN|-LF%#wWuIAyqzDSY;AjU|VZi#9R8-i*7XHWgV z1Ny%n?}hzYrg4~OHANYr8j?tml0rzrHqvRf+GZSG4=N;raK2{qz)_L!T&g#CxW__gdQ{|c|r<7%yQE@=G@nS!Lq$#1Qm#Ku#UXX73zAng1aN?Ti3DA3T;X z_!K;kY7LO6{Y{3*CW|adRT#UF1}}oLk|3lD+;5^NcEl_Hs{ty@g+j`?4wg|)YNG$o z2p5Oe2SI;9wk1B3Vo=y?^A%zB#zJmPHKDe$ydzs9?w;e^+X|zx+2u`37 zK&c7`Ajhl*qsqe5c-QOgv*fxqh@pNfh!pqlPwh1RhQaxk=BvTa8ObsKGKc^GP{@dP z8|RVzNDp2<>mYVFZX5tezkd;=t_M|4_1p$$UP;Zs=V=>suWD%-b1u>l5Qt7nb2^Ai z$!?!T5!GosGn12#OzLTLD8zl^p4V0ssJW$(;i64`Y+nCrEc;_MnH7)gS@d|`-aU^h zs5ES2vhHL1=5Pq)&u8jCcU>?vG5w(KErdC)TV&DjY8*_dN<(8)B5KM#fIv{Kf3%&i zh>8R7NI4aa@7Ir)D*Aly;NSLq7X-&otUFHa)l}keLumfrq7FR@ z6?b*=ayi}C_xr2%eO?ilfUtfK5p#e9b0GB_j(o1D3dkBSK`>&$(00mnuCMjV zF})%89R;#7G*aX{G5F3TXy7>&*c7tZipi%U-k0&PT(2s|uvEt9rjlRr;DzwJ(c0> z^C!s3pG&JhgARWOzJC5N_ZuVP+n+(FKYy*)>;HWYzs<~G=cbtdn~?d-`aWJ{kEwa{STY=YrO;9{2U#REB4^p@xC9QOYwG`F3Ysu@;<$P1GI7R z`gC4bE6dq@eRnS-+1~EBTJKw@`24P?Yq<4nIKHg!GviJNRlD_bI~6`Y!*E1JP4TIZ zQ`_?`4=7_KLdo34!Vcj~aTs zHcPRgjl6OiIz2OJW@Eus(7qtu*H%SE{|8szl{N0c`^oDYLGmFJoE7~%k%zP9NbzL9 zl$N;%dWMDF%6r!202D}QX%wultQ$p+&JPG_>7Y0Rly5dGD z8vT)9tYhTc3@{-kpvR;GlY^=#*Dhs7$hHg^!NNuDRLO?xi)b>%UvpM`l`yr z#$&@3EX(ijdoN zf366^;Q!&t^5#8#Bs(t;2Vz?6w(^6q*?%-WkDs8O{&=5no81o!_wjAtcQhUU{L1k^ z%ocdIYX515Q1{I_S9sniO_0ZouZONeL9#6`5}^p9DJ)epw!gtoezUapw;w!0{Akm3FaRec(Iq zzW;n}CE|wR{3De$HDSq=ha!L=jshi#s%fdd7@@j}P#G09q5%jiBOsCjn$DnXOn9Hx zjY~^J%8pD&Wf_r>j7Sh-Coht%<*5{eSTSHk2nhg;SP(|)DP&yQT3HvD^cFekh>{o^ zY*1<_Mt)pc3M~Tzs?FD%kg6y`Wl^C^QranDu}v=m))L|u1g1XMi*lR$icrVDqz*6M zQilB4VadQ=0B78`63CROApp%FHw@N#?=8__u1?f~)!-Bs$0ifH62D68hLUKw1OLa& z?EZ88iS+az>+_qlF&u6&kjl)|Gf0#s+gcexW;JTL2)NNJZCtwA*PCl)4x-eu=sK^x%DhkNxphy7d!9tQKZ|!8T zupk6bfH5K@iv2#*l7{=WN`*dcIjw=(SYeTfz!FcDX65iA50U_}Gy=2>iramXNqzz^FZ5?sCU`?T$U z?J{58`yAJ|z5jLh{HtL_F0X{~tWdlnf*1;4PBxaH#nml2e1@?A~azE$hFQa`1 zHuW3>D^;=-r6?dZKWLRzb*gl#qnQhGZA`Jdl_Xl_{oN3otd+}GMV*GB@H^l^Vn$buF z>Uc03%S760rc9Wr1`i%*WK_FqmNUC~4xcmb;|?ISx$+zt33kR6j68GHZ?7)Zg6S44 z^QtrRzSp;@OQeBsWH!HZEKRSE^Yg!Ni?#N4Ew!O|WFoX=t0Jz#BecAre&1vI`Ww>% z21HPiBn%*QW2bjBPd&cvXCJXx^-n`g+rEC$F~c1Tn7&2+{ce#>9+r< zSi7%-t+?QU0$JicI2N z)6ba!9bt;5Y&QwBe9o|Kz9JwiK(cy=(&~pzr7*vUQW|GlY1=lL2B*~Nv4^L$pnggo z9mz85iX_?+#L#l73(xi(oqfO5=WOCd<`VPD#z5r=>iY^j@X7|Nu@#70_64jLl{2xC ze3Yaupz7577lMk`2L!{nRSF@#4%`SvKCa&tOi3bYX(5s`22wVWEp6s57piqQ{FGPAnu_!cWJE)y;%tSJ3byDv_5u*;16vkB zL|jG1&3HOmGlm&H4uY7_+85&U4rjzbizEXC)cEdceZJPBYU;@2)*~e6Yo!1yFK0H= za%vpQ?19epy>*8x1vL@Gexx4m9Af*->!>GV{q=9<|HsJZJkB^z-p9Dl)76?W1;oJaxvFl_^i9-Hy01OWil$UAW5IO7h? z0(fH!jX-ZE)8_l4{0sB^=X&46g;hlwLrED4Ek|8;?p9y{dEXvyQ9ptHzC1MI9ei_A zeM3#g??s*X=s?S>vcvLr+G-wyuCDMhxNd#~Ev}PD%R5Ugr>&}QzIEQaa19_J^L^KW ztzBf2LRU(N#qhpOj`N3s_wV){f6Ise@0(-%-sAp#w2$rdMG?WF$EzU|^7uxBXq8|WZ5e;<-+WIArxxa#zaDBJ2hcUV zGz^@^@koEw_?hQV%sBi<76-}c{^Q#`zz6zd3Kk0?$y_)LV!1SCumI+)YFR@p_-M~~(u~`touLgmdDSy3Oob@4;Gu>C`$*~O+wp{xPUniS;_^Gg(N`43|tR6ZuBqqGN68f@I7>H?y_ ziD7G?!BPN-1DS$G#ZHZTu)R?beBz&f{8J7#--YWJ-HMh3AjEMmiOW{8s)~TOePUU* zhuo!%Zp+u6$F)m?Vts6@lampkCb);5)m()A&oaqP}ILPcOfQ zSH7HkFAmvMD5^;ykUrg+q=f~Lg*v2lMzf9iBz>mLLQZNtI+KQ#w-~d80fr$$inh!{ z4t+T~_PB9i$OfW16fPqzSvEB*XW9KBx*ejqWEc%E1DFSsppBAiC_>^4V6&i7>rN+< zhx1&ylxI=EfmO30zJo|!gUfzHjSmB_6&J-ZN5hMjINk?SieR@e2K5a4CQdqBQ-Z#( z)&kxDqCCeLhs5F7!sRdkFuOnRE|jvRi2;h1h1=R!HdI*GMt#g1lIo^qolvkpEa1UB z_yMj@)&Xd)R%b!5x2rqxi=xZ2&evBrEI3yc+T=L{?0D98fQO8)UAzOR7nLpBO1Wl^ zS(q;C9~CbZ7QC`c(7ES}dMwfeUMvU_VIX7i$`ng{G*2tU8Y#Eb|3x~-`k(3kT3(0{ z`BT(kN0`%Q6giAckStl!R!pXFHofbiXA~~E3;|#VHffd0dE(%9d9jZ}O)|_#bJ3bW zJnEKwMzwaX)eOoz1Y9>+qRV;lZlN-XH^FKR4_|_$3FQ)k;Kf1lq$*xJBW5F#K#T(S z1}H4u*ibap#~0$}@qN9qO5Jlz94;5MJ_W`Sc2RfnW7U9p6Op>$Vd=li zzV)E2*c8sxNzG8)6Pj0e=OaKFh z_QBhEP7xqOuCayM4;jQgSb`u0PFe8yID{HtOKeEEJ`KJ+i4kLV6ssz%&$edvJ%>#<;n5Lihm zVh#D;Izy`?we+FoaRAc;NO=S!k1Sj>1yQ8avvYeG*VLFqY18o*;|)@os7Y(A?a$)n zCTeeL%g8iIa2CmsdClk|Nh@-A^LcA{%sVXXOJSA;yay zMMG)J1GQx{{=MnON#_;aefi9uH3b?%DH9_vL*Bo3I4%GwgHbtuHs#SXrQ)GVnTXVN zTHJ3sWW-R?f(T8{Jle<0pb>rjc&dDJ5&^+EFK{O?Eay;NRg@)RC&h7vX@$(y(c7D;Gjs9#$PFzx zQk-)k)g!2~>qTW`7;arPl`SiAhp!eSPo}jr?hCNO48zM1*DL8|t1O|mx{i^Bg$82= z5S-8}>_~1k>%xIh7aYPZGr}XpJ3(z@f>&CrZI{a#qzZUhn?Js4q875)C|(7;y5~w) zUx}hKh8QjBlT;jR1-P9DKccPP@y&3z64L$5lL`^%A-_VtJ>nkkgZ|b50nIeZS>jrm40Z{Gc0Duq zAqhOt;US+gg)+jS#Gyj+l?dADXqH40Q#1P_u!C<_4z!iT;dnwo2jEuq|Hi#TEv!Ho z>+WXdp^kqtI%~}(SvB!?HZjb19jktHmgn0-GuG=VfLe@(7d%Qi8v9;uqgP)G(qcAJ z0RGvS1}HKN^|HfMOopo3d8m4j$(H*Ctcypm|Cd&rw_PR3uKzGqbFOn61bB$d8ImGv zK8iAn8}LC@)m))_*hU}>6ZG(-s|ox^8Je~TYpADrPJIS<17C|vc6!^QafI~uhk2-)JCPxY89&acw9`fO3$XJ3$^qU zcOgU?73@K?TNA+*cTDhqZ16NrsJ4PfCK=Es_J(+Yzcm zx952KY-O9g&N-6h8D_)VM1>YS%%HSZ>&a@L?xdk(P%?Lnq=xegG_yrWU?WW28IC^8 zED9J(!c^wcHJxv{VZC`8FLlHkfa!Nt!~CkeiD-*pqqPgrek`f?RmiBdUeCplqw*pt z9UQ-((Cqy!vakw<7Bs%TLM9`zZpeTBq0Vb_EaKC{!SE48L{Grj?CL=}%Z8*g-v3KTEw!mjV7DUe9iRiXe{`Oc5`7NEgUO;QW70_597Ni+W&-^0z1tUNlVC?{##&kCdzJjoOdDf`aak@R6z$VLxrju)~MW zujo_xcVz1oMpGqT6^p1o9o9=2P(;9|`&Jb%=j5_`=JP%`VS-z#o>9-cmaP0 z726(bvM_7`O~DdHgCvqM5-^MzAreA!=dL*gA#x!92gooMn0l*NL_~ogL}Cn(iIfVj zDpM@^NPfRoMkGC7vojC)geC1tPv=@eV8$Xs1W1HbAf!-=-$6n!Vj}>6q!^&ZB8dM* zBS@%7h&Ro%+1ZyCsrWrnqNYGz1QGJ4ud%j(U4>BlQ(y9RoFSTxKA-U8|#y`y##g7KKo`(1-{ zn-B^7ydj1q6cFFj9AUc8QDd_AXE9pU-j4YX(885Q&Oo#8KTP{IRvpeLe!<@Y4eXOqJ zj&nljK>k1A$X9_Mjy3bWH7P#*&3g~#)!UWlXJxpW{s;sm9RT15NI^#L>1?M~SbEq- zB>jww{)4UB(oi{S+@U*nUT^vYdk94re7?4plXE&MvUXwS)y#KucDMGpm)t!M4F79( zzZxiQhRW}ZcPhomvbo%2(A~fB7#xN|#MPofC_4WXf?R?&%~2CA3mo2AJREmsG#_(N z5_DB>q^V#A)Jy?C$wTug6Z2F)W)j(S^YHndE>HgO`5&Q1;up>kbyOzggT#VMk_kx= zjzA#|j4KZfcj|UlbgoW@x-~5o1DXmo(3^^ydf7y@QJhWeo@L?3pNC;^;_j(6?h_i3_3oaw4d&!5QbS!iyt>p`f=oIi^{GaM}Nhc)dNHbUZ($DT?eVto}Teq$qpd zw~+Ij*;OwAQPS+@Fnu+B)-s3jVyA(0`7g&y-!Sj0-%?V49F7*p|G7O@d&8Gom%IOc zc5}1cDtgXeySp7O&+^Lh*u~%^)Re?0BsrLlyAZ+m-KM8RIUPPTrRzqYr_bVtkCE&@ zCC~ElJgkW9x?f}bjUL@XuO59PYQl=mxidI{n7c(Da&izJ9p%{K5s? zbVx3j{98Hm_5wd?;d+|!vu)1(dauAb{5Kt_{5tO^&K;E;!Eb*L^yF|jy~o5mZyWLO z#cy-#IOqE##_)VD=y{$$#ijWJe8wXQ=XV}Zwej8f-^Y*gipiml`G4X^OX+BSU&wgg z2a@1+bp6M@`47u)^#AfPgU0Xt?%7`Z)f9z6wV$V2IJH+S;gsM+HUwf*Otk5Ifv&pD9n= z{jPl0317}!Y%Sc(Su-r)*NVh^B*TAPi2>D2C{Ax2A{rY<0c0z@RVImByn+fsQPeY< z0+udphP%lBLINCg6Oo+9;qr?r87*#M*Cm??HvfM`$Jm#UWl2K?C_r`!lu@^FNZY-( z2(glhs)vOg0Z!a~%>r+zjP@|9A-bYRhUu0FC5rtLf}(V?1~~vo3-){XVsM&OBxD@| zw#XwPA`w1ZA1n_q-e7gVs5q6#J;`V46~-DF@Er z*)@Ig@nof@bc>^B!2GxT4vkC&x6@o6OI2$>t_Pjh`rJ-dd+Oti?sq$q{W%z#N$YNS zq%t0gwG_6#k{PVRTvVx|ZVXx`;93pu_}=U6|IPfLt@Xyf zyb-narz1z)c=8o#zwD3YB}lGwWUZX(RVaQnaBVe#wAS0`#4X<;P~5kCu+Tds*V1;~ z)>B}|cq||IKlg^981bazo{7tSIENyo80&39UR-gS2HCrvFyt(S-P%CAo3xn*8%^=d z4PkV`Rb*B-W^9{fnb^$X(Cw@{Qy47dHIYJybl*neb0+Cf=Hf*rm{cbS?PO5nRu0Vv zYF6GXP&C2bfLfXThj!9#o3ea=@&0TD08JKNRR{qk{yLwx~;fC7e4gqS=zm;_uLU4egE;K?fuUOD2MTY;pm`fBYn$l%-AxF1^ zPFgKUBS2j^AVmLUyM7CoyD9|wr~=%2SGvtiA^|sSN?qIVI|2|wV_^I&yxG^?-9w#_ ziwFcDvI4-62>^@^Q&$a}l=_~hxwlUpiJ3zoBW`2je!bb9nj#R4h#3MQ&V>hvwGkuf z?5<$L1{W%j^YG?Y#Gx%)W zX!hjlqBvnRW(O*IDvAK>`XL*BIAzhvm+!T{Lb3bVUj+eQi=3uUg6nvE&%z7-(P5A{`QD#D9`lWp#e^oi>2_o8e88j!c@^klFG&%x1RFvzJ_J)+eXX~gTIDvj z=`lWvE2$7nxR3lKFhis=1fi2tYg(K_W)=Djg^>EQxE61k!_>$_PQP>|EI;Q5)1CRz ztemwWWzh9Zw=}8%PAcW1w^F+uul;RWc}UW{qOzQy*}G(8+fm|Db>1-)6ZjlS`N3Qt{K{VgwWUhEwwaK zqfJ8R6;d=}v+Hg3{Z5Yd2i2V)N1byw^Nha}=D8Fa%;xjrYgQq3f7@6v^*Ho@HDhCW z;pm3ztlnVqMn8MjX{(13b zIJ?;NKTkz7ANcqCJl})e|6M(I`uD$%w|V0BTpvp?Ro&2}NKq&qa(S8|?kY$ff#R)) zXwycz5s7f2G3ovqK-I_!_b3TTu8ig4HYg)h^(Z`Z-(Swn*0ym5Dqnr>o(`L(S=x@o zNA!avu}!iUgy7%Kpj(vi!Q%sgJpweT|r&`S(ZDLuc+!V<4x+NO-CY<;u!90t9RrtiR z$@muB;g*ZH@$+KD^jt#`_j2rL)1Ut^(+KXNhu7cT!o6;v77fa4-yFI&$J623Zx7&c z;NsPGZCw~E-GU_F$5uw%@%DLkm8NvLv9|_U-CphsJbd)OpQXKmr~>B8y@Tg-ce$q- zGwbqMglOwyUcXWo2oEOq=S%E6uEu*hJc#HKrQ z%h69R);Wb$czz)1i+M%vZ+VYCEZrMfConT{tF^2V(j$CXb^E>Dhro{)ceBX;SB2NE zcQHM>{#NR?r^{C1Z&D2>dnmYO>0e{2$mwXr$g{DXi*$0vP}sIayZUR07}Y)heXBJ1 zEIggIu9|rx(4VBFeD{}$m=#a2F!y)DhUTiRn5#aRLuk;A)#c2TiaO-jFBYp2>{K+w zQb^=rTBzm)N-U{Vg}K0)5h)$COdJK?wlq&Z;9}s_(T;|?Zc_V^j+?{F!^29?COhh? zM^nvipjEaK_*R=59Sb#S!%DU~nkrAs=qYA%Z*u&wVUnU1{tKt7^ZjEn)s^Q}%y`K`!YJ2VXKFU{X>(=>CL+fF4>h;}) zAJeS(c`)UDX4yU)Yz{Rv9_E9^)Aktmn1{^uPG7CYz_iQ0j<$C#xcFw5;96#~I{L5v z%i*l$xzqjK6+I<|cS4W&k8H?Q-4Oeo+PSiHb-u zk|4;4$P8f^BmG1x$Yi8g3|PbJp!)MJrujL&=n8-|+ zGY-(s%e(GiE<@#sxFJyHY=wCQfGdc9)R1IwecoOVwi7A`m-({Uq-Kp73L^DoBl^x< z1qPF?urUzOC%g&XOte{MI)+AGR6xbg{tufUA1Sl>D6|oMuHnp|#tH%> zz$quZNB`EXcK~$&WdY~n-07S}Yx|{$d#oO7@ejUcC!Rg~u<_w|zx~-c?Jvz8O!?oj z{z(-yClVnUrQutOV8PN(05|Jon<|HWQf-e4EZ{LL57Xg|mt$avz7h^+k_fx@I7Za@8 z^m#s`?lt}=Ey72iiV=a`L*K+giCi?RM7s@VbzDuiFW3EV0CE}3Wm{n-rKqa2qb5dw zx%MB{&-DKX?mxQz?*AwEUwIFG_@B1M<-xZRK~%rV8x(b{F$IH#LmDN_l`9-vZdWnX z^*!a=P}=^HsNnI6wW(SA>vd`{G~#8smSa~bRjMU%sa#2kQEH-;V#UNuO6FHA%q_L5 z*t7TE8LgLF2ox2T*j2O_99FQ#KkHeoQ zgF%EXW3Y{_u2pso0fR!A%uin^!v?v72V+}QqK0#FdsQzm`HV-2imuNww(wkb_CMoQ z;KB4ezGR+q@6O4){dL~1N72`LdhXv7$?!jIZnd7am(TBQ_4FPW=le_O_)$8JT~zN; z-t)A%Ex+r{&wgL0KGXN~{k-;7<=z*f!VDDG)q@uHi9v)JsD%wCJ*Hb%U14fk_g94f z7qx)~ic*BpS(GpAyQA)h_^xdi+ANyuZk=W+zyoq43ecMrvNWclh6xKa)Q`GRrsh&tLlAKgp-pcCDD& zB@}adYxese?CZ8ZEuO8Q8~VCxhplQ!bP%koPcq|8+UraigD_{Y2l5uY^{y0o;N7Fr z?^az#-eM5bX1C~OTb{wtS*xz}GV$PTyOUOnc@7`>U^#-sFBf$YVphkw6Ss|f(a=Co z9tsruedL&Qh%t1bSgQHUM;SKC|Cdjcc4lTciz@4m>R?Ae*MIf?O}z7MKH-oFtrIM0 zj%&}bWicHN3I<}97l3l;RS*dqSC@Iz-*lgT zevJ2IvvxABR|-UJ&CuqPm*7*4_?%ein@FM0Tbpep37eR`YtCLzOmfKpWnTcrI zpLeQ>t!MJIYg)L>h~Z0tz(6H5ujyvnVW(u!sf87~40V{sIg^x$67=4hCHjR+FRJHj$1p?v7$Bv!rEuIhA$E;u5UYTo> zMY)d<>`%&VFhCF(&|qnyXY;$qD+Y*>lUcHP7&HDm9c-3u6%89|xJ>dqTQ2Ns7FNL# zIT}kCf{3>M(F}nmmP>@kSKGFasC2U(;PDB*mR-Dr@?kq%^^;ODmZRpc1xUWsJzr{Q8VHKlA=H`j4NVSKn&&Z-{^Z zm+JYtt#++#&sX1UJ9u^U2fP6PKLEhL#uj@n1#K|s@k=34Hoq9fr}%*(hUOnUy%#8O z{j9s}{{ltVS?3q++cVc6m8@D&#dDHH@%d+sin7(=+XRp&8IUiOvfuI>2-7-1!V&Gm zSOUZjY7FE6K2P~R{C&nj_l8o_D4O-rS}b(^FT(s!OC7dAKEzrEv8BGTx#jy>d4;ubRS&uU zKJ?#IfpGl9Lue0VQ2?R@B}NP+tONJYiVX$B&fZ*`oU* zbs}HwC#v)KU$u7+hW4Tq&*hKP=r#21Kgqp(3-D>eG{a_Gsih{0PG3^8QY#UGk`}X> zN$E;tqAL#}Ku9cjhajgfjWw^ibtw+&)~k^1=9Dnjpd)ul@fr^~gto$F(R^WgO-p{9 zXE@hXHAazhc{S%Y*l!@ImOL*L9pzMTIovnwFvJKb zapSPv2z>@@g+?PT`;MGppFdL@vnjB$pQ8(DC#J>4VBPumNc)`}#t1X=e*K~%7FvWA zF^~C9RNS=gn9D=JNy`YyEjJ2s7ca((4K3bbHaqLCyJ6_NHGiX?egHW3KbDVJ!}ytf z(2kX#;~xnPvfn&N=9~k92kf$jV#FSRxk|6mRrf? zbkh9qv%_)Uo!PU?fjxnF33qPY{Vu8fmsbK)<;wrJu)=_Fuup zGw;=8wJ&4zNA~A^liaT5jjr1;LrY?|nqpj69I2$Pd8VGZ|6&{0b1r5}98lGMx~!6_ zs*^Fb9eHWvwtltI(#3T_Do~5dY9OopxLwPu;lYq zl5%sMmqya*nFE)#575-#9Ea7hk0I)oGl+TtKz(%Ka_}}LBL0v1|4RVuhSmQ?=orU( z{6;aoG$Qn{=w_k1JL`Tp|4-)lU!Ea;d=Fkb_ti0toviCp*)}M5q!fksSvI=Ko*Q{|%8n5D0P^$bTJH*y}}}`Hw;8d}J3~7h=y}2Ve~5 zXZt@elwCDrQeEGGf{Ad88K!R3^XIPRH4bxhANSs>G58n^x9Pu+b8AE3^J#IIyy6$q zOJCXHwYe=0r)8pz<7{O4>34x>cxX^gEDCegi z_HqB;KjPt2Vz>YI?eD+${o(WZ^_*R%OM6ey|87pFS^heTO_m|PFL}u2E4qpJaeQT} zwxGNQoDLA+3@erNms}OIX&LZilX|EoGGQRFhC*7~-%y5#f-i>goJ_BEM=8nD0$;DC z0~QH0XV*+1PN_4WUDr8Z&E;iVG-n-IOu6YixCNp$> zRCRriFG9~2=!9=t(z?F7d<5gWJU?=%3Nb*tMp`ws?fQ=&O@iN++ts(x{2R@-kHYx( zF!sH*2Ty_iuBCsrk)!#YFO}y)qxBEb{}^mEzPr)K;QA*&to)?wl|LdJJ09j`TYLBjXD3m?xQ+w`TN~`Ycd&;)_gbhgg@`j zKP51Sk>-2hW*UPt?!-f2m)>SYqm-S%U&g5ELJY{0;2H{tErw z6&^pj?`K;}hB+F31;6UV#G6B6op#q@pcMgEf?MH!&;H{kj4R*nE`b1{Om-bIbP7h6 z5B-eSJnyQ(0RAuTH)*oJCyVsq3EEgv#LhyG#QgN8Zr2I=o9qx|7OaZ|AWD@Yebl{3k#VR*_4Bokw_mN z0AxiEn*sZnj|MC6;u`z91K_|uBoi_YeA~j%wh9E=OgGRO&_~_C9jsMw#pXm?S@X?W z(`~s`;&3X>UV5m~2@@Sto~|Q|8#Y4pam57Iy{}Niu+{WFq=Je7z=-f<4V}uV_>HZ( znVKG%ag5L5gY%251wg#h)2FXODVhiUr|6%J@}IQB`5*T^lk~Jb1^8|8TrcSvCcXI% zQDY&wtemdjEo+e`34pN}B9=^5QyLU5;eci!7Hbi+DhjU^c=$aWU}_r#8eK%$A<8NHDPHwh9R+dRW4NG%`b@pl;zXBLTmzwkdQ_iVSi)*gh8#e6m3&> z&5e@DERfa;PyISqotI!|^tKifMw$9kv--dERyB%g+D?MSZEx10TGrJ^Sg?(;1slpE zg%wcpUVS=wy_fxR-+(_n@SOT&$2AW=Rd1v*T(?QoQ{xV4cl{ z0_lEmKUm4{z~udV!#3rhO$e&Fl)G?VLbmGXzWoo6Y+q3`{vq*j{s*wPgR#f@H#sRA z1zwGPWv-TtB?Agaowk-1q+SXH>uEPEA{&pC`Ihq3?P!yZL_59tT>^{s!-zF!;9{igArZ|%9G z$j{?FjU`l-hCd}|Z;RF9|9PG+ubuYApU>ypXmXd_{O%|I$@B94CqI9~&gxj+=HcXX+q+-0k$yUi>pVR!uMAql z#C8JAB)YzXDZazB-(eJRw%Lkz8+NT)wP?!>F}-k}zg~#_*Q%@WFw7W%Haqz_dT~}n z%WDDt!UypP>YRQ;{wj~+j^V?HYdQraUfT)Epv^7~qDUaj%q^{Ipfd>_QwnV!yW=F3ti z=v1kJORo?1FyY5Rl1ZR=}m$=kv2$%LJUW%KIk!-S}N!4@fLHRPBNM;7gAbQwH%sO2?1yfRl>79!lm-TqVEz=~yZcfPzVHs8<}a`FmHXUz z2ZCb_#=fSEn#6)5GG8i|1HeEMhDGiuNP)&#SeH|cbKftuq3&ffeYA|bxSf`opF3MK z+twN$N!;|i@_Oc@NADrYi)a2=;zG<~Rt_IR*vS2tr}&fnp8Iv~XXrCvGtWN&Vr`fn zVJH^xlmWbhRZ~zB*i>dynEsd+9A62wmR?C1)thwA2(74P>VSoDdq3DDl4vs^Uvc-I z@3H-+{*DYB1qiTN1W6@#@^s&mkK7s0pGY!uggP)pQb(;SVg*XfW?EZu#um^4V#wdP zx!3G<#pl_szn8x&%+s?DhR1O)WYvMp;OlZ}IECJ=Otzgl_Vw7pb5#PC01zyUq>AG} z_=STUD}gcc#vGb>d^CYa|)quny3R-mpGGR`KeNS>V@>M^rm1%@e71_+jR6|HOto75$1Q;@Dk zjVvjHH5EhV>0*>FF$5(rECI=j0ri&wamOZ_+F_1ia)^pHf~4ta%v_X02p4-{7-2L7 zl+QDJOy#9=6HMwb^Tgl3sxOingojV!9UP(8>;MWDo? z11xUTNd*W{`9>-oTQqmd!3J4iL2OP?Qcgq%MFj&USlEMnFAy%$FJ&d4Gct-m!swWk z7pjut=z;|@z6*)1Gp<#(4^|MO*yM=unr0h2oZ9(>$?&@{jFUWuAh}E=U?40`HKYu& zV5n^Kk_;09fkIIt4rS40vbxE!319(1T0&BC%OLYZleAXQBRRkVP^ECnn43g1+X%xP z5HSFhwAf^5km5iFarXIJ6_kiE#M*0M0IE)ZcTBr&T%#hV<4G_9B1!r-?AB0+VEqWY;` z3Eer)R$xGz2GF943P)?k*lu(?bxi5gp}2H8DZT4}Jo6!@25n%e)U~Q9UNE@v#%n>A z>u8vv5bPPqOETc0Y^2L29m1J03TVPil5|C#ocHUZPEb-PsOobUc>{!kfGmJ17A%3y zD7j|0>$y6@ZL89c1+h#Bp+Q4Ls00Yj7E;Am8O-C01WHBmIEM^L&2qq70GC09-vNb8 z7z}WXSsH^RG4)=*#(b!nAL?ifX3__kBP8XDBw~gS^d$nCNJt(xNzXUYVzV`qT{9us zX2HvXa7Uir2rRdfLy?6I@qkENmSw}$S`y6w8xwf}^Xz}4_TBl@-;NhW?|*&weI7mkw zaQg?PL4UffAMyw86fllAMn*qE^J|2mN)#WD^ubY$kcJ$D`95@SD_!ULmifCIR_ANkko`M{LYy4w&4|VBpU<;Q)7qDM zPcjhG2@gl{sDG9rK7%CL3C9mD8Y@4_*N6Y^bXuqb8YFw1R>$K|p#qZ7^P&E|P?zSHs$4-3o3Wr+ms`z)Jk&cv#g)sl!_bExGUVw000!#O69%Vv@s zA&94;DsQVHo}OL}&lc@qZqNNhF-KSVZj2Q27OJQqkblhz7>}?~y{O23!*6;q!C;7| z9ZzPnNl+G57?)9w$P_~pY9yQpdaR8tLrI#~Dg3Uy90yLI4kj1w_`%8@kD0?%6Q&%k z7IssS6fg`aDlh~7LZ9T#Xi+CoY74M5?6_f!*~TpF(Qxc;$w!}N`nrc}FnRJRvpH=7 zhf-eYLv2s~?`zM3uT-+zXwk?GR$)ToF2WydL^+y*p~w#iC{dY}NR|}eYn@)GV4STL zV;z#a<`a}h4Prw_ZJDZ37DIPs)rgsBYG@4?m%FsNbe+fHvaKO`>_tOJ)_*-m^<#s0PQAQzLe{$4l z6<1M$1E^1NSp)7DGp=~9Lsdw;V5pV|1pb4bU)VdS^i2kSTe%9L_vO zl@)1(GMGON7l$CO(S{*| z0!k^Yq21l>W;!#ywS-X_>JXBs`NJfUr5BSww8xn?hA5fUJ4U=Yu%N>@;n+vnuVHiq z5^Uph;MK@mfGn8*0n&K$jA;snbRJmY4UXM~c%ln3W!C;5|KEq+{EuSTgCZGIdrJ`O5f+Xte$^#{3WBb7q+-%;l<5cj!7u}rnoyR)8k zV;n3GStfNAkbG@Z69EvXgIaB;^&()k4Ga)_JRA+_dAjjG~e$!QN z>#SS-WhohpvM|UAI*~1{LY!oEl0dYnJGO;sK%?1(j5k7iRzjPbjA9uSLD@olnUeT@ z`ICfxP+SlLX{a_@4(t&XNa!gD8bV57>rL}SK_GBOT~us$nHizoZ3wQWMQ(+-Wi7I7 zhkj~dR1luZcRbz1`UB!a9%(rsaBk?yDYCJoWWu(n3TA5|jfYt6VI-Z5Ddg5JCtlw+ zj=L2I9%jmw>RC=#rb{-6JNJbg8HU4}L;{@+umX^%v{I->oMY^G{C_R9<{_8q;x!$# z$|Yj={iB~frV2yI^YmFsE@!{O`;3fM3H#Ba4m2Pss|AIY9TD1>&}4+SR%G*1%n9?+hRSWUPV-d_J6&Z8L5G@u4>fTi)G9oc!4Wc0R=+Y@H9HlC4Etn~N zHt4=(7+5`SU3EQeF({t9-?d_fqaK>j>#fU<#I8vCFJ7`XLVY=wtWk;fxudRQd9_@4 z=tT;8h`^G8iX)yW&%||P*g&Q)tiIl>|B}yc8i#)m3}uk8!>%@0t02%0u93iKG1YOE ztzh*7Fu`TGx$oB2CKAA`?V?!~Jb-|L=giixFBBGP13swoXv(rVuDEye3P@WSabWuRosl4`|2UsUol zLys^447)4;c=YkTe@n$xba*}-`Sc8_4rX1dSnkH$>;DgW%w4=q`jJ<(y#tw)j8oo0 zkoDAuHA*<;d85WLfP}ZO0~=pGKAR=X{JnWr@ejtS-G_$0#bPm=Ft$v0peU}XQ>Exd z7XCCYF!@JHvcbyf9#f$N0Q??>Jmv`em*-;(@++A{T!g9I<`f@=k&7RZ@jIKCHQ^2w z7jRMjcjoyoHY~}sZcvHuSi|Lsy1ktfPe`-H&ssR$R%g=LTz`Mo^nL!TO&7nNYmaXU zJ5=x3`b7Lt`6k}HUWsjyU@U@*J|Y$Ah_GUak!mPa z6k^N#Yf(%Ukr<2_{FVE=A%ZZP`QN3@BB#k|KHlBg{z?WiA_gH)QC18{u!<?JfVij!)#enxTP*^I(C25Tjp7oWIV+x4Hl8mT-$jv5_ zX_P>z1=*_{TUE3ukrG5;v2hBV*-#kBu}7uZ35c>R6j-5H7BF>cOl6HoQ6j8aZ4m{L zLM&(VJ8%pjf~*mmWv#7YQ~EHU7=-C$Kc@yKSPH8$D7;$Ok+c-%irD|ie_?j&Eu;R3~m$i;7%-(X3C z4)eI4B~FkWGQ(6{Qb2ebskn&)q<0iETfoV!n=YY*f+&cA5F$aCEO3}D4I4k0>^;yn z@B0A4yyQy)mZ8E7DYn}hRsXV~rJ7YQpG>l$1Zt4+>jEEJj|q@mTQqtcmaJfy+D z24)P5H<5zU2>?LI$VKYVTJr}gt?{UEGK!3?^4@&Mgx@_P`Mo_X_Y=%KG|uzNTcqyh z80@R-!-{Hj5J8X%J0LrmiHV?~A8EHavzsN5XK)V+L6j&JN@LK1K|sEVON=#dO$Sa1 z2=us~rf*q|VvD$|=wEDVb2YXjTuTvlF_W!`UD>1q*lHAUzcbH!j#K9GuMyDYgZf_WcGkQoZ}*~C_p37|xRHU{Ve{}GLI zTz@JX+==cwmO1Fak`tb3MxH?QM)Ujrx$oME{wkpIKc!y#?RccN9>4;4&Xr@4=d(v- z5FlJQ*Jmn4f@jO{6VVYAv3>8``3~J>wNoJ5riNMXsZVg9kMbk(CUgZ|jZcVYU*-8- z_hNCoeD6Rs%~vTC^5S(umuq>^l&hmBU`)ejN@BOIiNl&_o)Qlh9>kGL2}WW1LO%=& zMj(m>wsSZePhlUDiP<$m7ke)Lh8=8p@)qhQf>dBCO3Sz-0vex&hmXhC^k-}G|H-GL zw{f<@es#W`b#A5(%a5MRs5iV1V@2q5`TCz%VZDKi)IZ)w#9Zugn;*|%%EsY$x(;1G zy;IdrXY`!^e_e#*Wau{eon}_QZ_l~1-h3IoUq7GE^zyv@m%ZF@H+=q2K8HWg=i~i9 zn|sgN{MycUKk4ZBohQ-WNXu(E{QgF!t2zMdjvg=YF^gD>|BH72xg_ z9QxJ1ZYx%Z0mk2HwGM#XWm!-vSnHiDfP)4du&KcVdiev)>|ju-!OsAW+a1*!L&JNu zfjQYkl-{w{W-f|91}e{6uz&z?V1u0Ikv#@ZM2s@J?t+{Be0|Rz|9RWe`0&2X)ekEF zeXj3!-XlpeASZ_ZqyO%V+pmP098osa%%q?;0;!$=g9w{QT*v@sO0dT%w|0EHq*F1) z!nX8xzV;P>bqQZkzWlp975=wtI!{2`$GCna(b1*{? zib<9;`?fN{yX8y|`JS&3rAOwLLs42b=m3>&q+X_WfI^$z?xrdWGRaaw!B}|8kBf{I z@Ho4M{s4vXeEm&0;IzUFDvTB(){Cn-4CsiKRtpNwh!GmD%H~zeqmt@lhEtU}Ye0;5 zp-(Ap%j*`3k5=>(Zd!bi4O3x?GVom`KlDqOHtXClw=v0IW22E+GHtkVd+Q<<0@(6 zUXkCC<&q0|2$NF$lyVh(^)ZxUYo zIe0vyEFqwCJIp>7MF5eT6>(fr!Uu~D6>r`LzWh!7m@^?j+f2o$pSsl6-XQovDcn9D z$iU)J0UV!(A2?QC9ffj1p&aWCN-KgYXfuRqK($@>$(EaCH0_?NM|`{Hutv@eTlvLw zmoZl;8N6t};aH`LsaFVEQ>yUN|!+ADH(BKiRTm?)rlD0__U=^{o z3BYexb2FD%ITn2sK1qSwPlvLw1|29-tM5R>g6S}^R+f&7xiSER`G%KgRJIDc{7No# z$JZpJ;Bg`8@{D70F3*V*B&##&FGnG0ZPyblQ=}K zRh%r7`EA^|weQ7hAhv7Z3Kqw=RNyef0Z3x`lJG+g*P(Gj0^ks-!I2OZsc$6Rd*a%> zUiS%OM^%S$cZ=Isc3DoiaQ|oC^?SZh^vr3`VM7+Sxro#$zbsUB+c*M6+H_XuaFBjr z(ftfS*$oY^`m#m#Yx19WLGM<7R5V{sCxv;Hn8!%WzXTv2Gn>q9ywZ2O39kRb$z-

g+q{{AFf#DFp>|T@THr4GH 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

YT;=*oCQMWSe*DBlFqbPsKL8I6oc%~Y6s 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�`YU_mq{dH6T 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%0DP0pu| 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%0D^+0iDKh;*oSKYUTmifyw)P6 zuq4>Afi@jWnISc5(!A+l;0=yQ)`AZ<)({u0F)W8TV*LreWv|L$jgN zl{*7Svw#*!Vx-DMU~g#*Uzkf7<%CnKOBp?!luiNC8HS7vXh6XMIAf0)xJVjLeDt8Zz!3wE3n5dSNC;ApA%cc1JYr7H_Go&T!O6`-7{YI@1tMhj!Pw!Z z1TyJc5g4M8;S$pQU=(=q!{I|mf~1}4vE$Iug~Qi0BgK@cHa0ZdLru3+RSDMKrtepa zv%Y%#4EJ$Sp3>}jdR~{G=v(KmFjZeoe><7%{J9DT*+}|WJkUKcuR{Kv0Bbd(=pK|^ zJ;+d(xtV0QukG=mprFp173iE~k|d9^<%*#7`Vm0VVR{j{n)E(84$kMR!&&#(alRh7 z2Isw^@Ixn?TR^)F0kopQC%4W{-t8yBGB%W0DV^~H4jZhBBhufB@P_t9kPMzd6d{wq zK^~j~&*nU;gWPY>AvbB^Dif$vt^#o~Fqo#E0m(bhp!eAMA4`z%r2m;6j%&x*H|Vk^)xiuTltnYneW-=<690KnSE3*!NR!Gt03I%UNG@()BNg zK1nS-gJ;0zV`8H+t4qv;xHdp=d;0vHJ9$+Wa*U{}h;%z{reP`9q0@$@UUl|yWoA7}7)gv-?+b7~ zt2Z>?jlUt=oP2mwiGcH50<0BN6}mj1AMS{%#wxo&+7KBHgfJoS;0K4YOdYzaY0BZ} zCe%Vpy$cA@xKTYCtW~4EQfa8220Cad#A4uiJN$2VZR6Zs^Lp9*ES3t+hON|%j#kM<%iv=)kZeyxl~KS9 zWWx2!jqv|(GL>FKd$g9r$bWss5+n)wVKbD-$GcR6ArXeDuJ^pU zkgQo@cDLQ=4&Q?6bQ5qmrj`>P)?6~;X$@F})~i(GkYwPXJr85dgmk$F+7Rm*F7wOD`JcP;(q=RH`g7onVA$+Z5KXDV00!h> z@FN)j1J(LYlg`-xE{Rr0o%=QWe}A^>@$}7G8$aQ!?&-@@UBYG4c3gk6dD}8D+7X)T zy3f(mr}}gfO|jKx-Enlf1^w5#=Kr4u@BC`CoQ@ncGW<6NjzkOgX(}@2=(;Y;n~Bit zG=0Y!F7j;FqwM8smsU#up6}+*;=_Y+Fa-W-Vspu_Y zYf{34(?W+6-Nczy3Wl%ak8hcWm3vqS+#H{W?*H=*eoxTf_ufZG=l%AO97cZfLn^2a z-IgRN+3cqSpZk6-2fLu@dCD%EXlF}(VM6``u<_^yR@WiH^s&4+7u$=k)$l{a)iN** z4A8!dKX0ql%{P6e%cwF*Di;t%&Xt`S%)}t*#<-V@jKpbiK`9n z&POwWci(q8oF;82fNi&ymIu9WpZ$L;&PNY3-t_E1hC!o4f+6yCR4MtMR!wK~_Bp;z zTT`6+7wHP9W!r}2Z(Yr&FAK2vzVDyOh2v%SyefbB#qWeRbaT$$I(7(XbSkyKhGkQY z)OPm#3Ry0ob#0?I4UAReeVSe2>HjRAQ+vb9YjYB{)i7iRj!HZ;hYmr;W0@z_^PY02 z>3okDvC*}_8o}I|oR+P&@2u@>ey83S%@>XA@BW<5a-&9sL(|GTt=L;>wOVZ+6J1v> zbrInPjWI~#F@dz%B+=nm0C}sU{qz$qWcU&#AUDILo2R?XafPvRllUC4;7CndWdaPI;Eex9N;(NOALj zi0{^sc@vOwvDw6k+o?iHB|zsjy;&xC^+7z^1764y->Jb^ z2`HH;fn_q!HE9MF>}Uw0z%sBs_+t0knWF;e2kx|+zI<-Eezo*t?WAlO)%jtc{EFqNA3wdvc-AsK{Jga8G$Hu9}$3IM?l zg9y%(2gkfV=wu?&^^C_yc|$`y9oB4}+j9gc(`O^+!lgZGA;aUWEKD6EU^#Vndzn6- z0sQ&w)?fg{5Y&Ma2MwrK5RoJ{s$^06rvuTcBq9LO8^G1ufF1w< diff --git a/elfutils-0.169-dup-shstrtab.patch b/elfutils-0.169-dup-shstrtab.patch deleted file mode 100644 index d6095eb..0000000 --- a/elfutils-0.169-dup-shstrtab.patch +++ /dev/null @@ -1,98 +0,0 @@ -commit e014cbba4e16f717807bca88512d2875a1c17ee4 -Author: Mark Wielaard -Date: Wed Jun 7 14:05:36 2017 +0200 - - strip: Make sure old .shstrab is removed when eu-strip recreates it. - - Although we always recreate the .shstrtab section for the new output - file we never explicitly assumed it could be removed. It might not be - possible to remove it when the section string table is shared with - a symbol table. But if it is removable we should (and recreate it for - the new section list). - - Regression introduced in commit elfutils-0.163-33-gdf7dfab. - "Handle merged strtab/shstrtab string tables in strip and unstrip." - Add extra testcase to explicitly check for this case. - - https://sourceware.org/bugzilla/show_bug.cgi?id=21525 - - Signed-off-by: Mark Wielaard - -diff --git a/src/ChangeLog b/src/ChangeLog -index cbb77fc..6ac0ef2 100644 ---- a/src/ChangeLog -+++ b/src/ChangeLog -@@ -1,3 +1,7 @@ -+2017-06-06 Mark Wielaard -+ -+ * strip.c (handle_elf): Assume e_shstrndx section can be removed. -+ - 2017-04-20 Ulf Hermann - - * readelf.c: Include strings.h. -diff --git a/src/strip.c b/src/strip.c -index f747441..11b2a37 100644 ---- a/src/strip.c -+++ b/src/strip.c -@@ -711,11 +711,13 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - in the sh_link or sh_info element it cannot be removed either - */ - for (cnt = 1; cnt < shnum; ++cnt) -- /* Check whether the section can be removed. */ -+ /* Check whether the section can be removed. Since we will create -+ a new .shstrtab assume it will be removed too. */ - if (remove_shdrs ? !(shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) -- : ebl_section_strip_p (ebl, ehdr, &shdr_info[cnt].shdr, -- shdr_info[cnt].name, remove_comment, -- remove_debug)) -+ : (ebl_section_strip_p (ebl, ehdr, &shdr_info[cnt].shdr, -+ shdr_info[cnt].name, remove_comment, -+ remove_debug) -+ || cnt == ehdr->e_shstrndx)) - { - /* For now assume this section will be removed. */ - shdr_info[cnt].idx = 0; -@@ -1062,8 +1064,10 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - } - - /* Test whether we are doing anything at all. */ -- if (cnt == idx) -- /* Nope, all removable sections are already gone. */ -+ if (cnt == idx -+ || (cnt == idx + 1 && shdr_info[ehdr->e_shstrndx].idx == 0)) -+ /* Nope, all removable sections are already gone. Or the only section -+ we would remove is the .shstrtab section which we will add again. */ - goto fail_close; - - /* Create the reference to the file with the debug info. */ -diff --git a/tests/ChangeLog b/tests/ChangeLog -index 5b0d486..5800946 100644 ---- a/tests/ChangeLog -+++ b/tests/ChangeLog -@@ -1,3 +1,7 @@ -+2017-06-06 Mark Wielaard -+ -+ * run-strip-test.sh: Test strip -g doesn't introduce extra .shstrtab. -+ - 2017-02-13 Ulf Hermann - Mark Wielaard - -diff --git a/tests/run-strip-test.sh b/tests/run-strip-test.sh -index 42aa988..280814e 100755 ---- a/tests/run-strip-test.sh -+++ b/tests/run-strip-test.sh -@@ -49,6 +49,14 @@ testrun ${abs_top_builddir}/src/unstrip -o testfile.unstrip testfile.temp testfi - testrun ${abs_top_builddir}/src/elfcmp --hash-inexact $original testfile.unstrip - } - -+# test strip -g -+testrun ${abs_top_builddir}/src/strip -g -o testfile.temp $original -+ -+# Buggy eu-strip created multiple .shstrtab sections -+shstrtab_SECS=$(testrun ${abs_top_builddir}/src/readelf -S testfile.temp | grep '.shstrtab' | wc --lines) -+test $shstrtab_SECS -eq 1 || -+ { echo "*** failure not just one '.shstrtab' testfile.temp ($shstrtab_SECS)"; status=1; } -+ - # Now strip in-place and make sure it is smaller. - SIZE_original=$(stat -c%s $original) - testrun ${abs_top_builddir}/src/strip $original diff --git a/elfutils-0.169-ppc64-fallback-unwinder.patch b/elfutils-0.169-ppc64-fallback-unwinder.patch deleted file mode 100644 index da727b5..0000000 --- a/elfutils-0.169-ppc64-fallback-unwinder.patch +++ /dev/null @@ -1,275 +0,0 @@ -From 1b2cd3f4dc581eed0fc1ee98f97aa492a19873b0 Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Sun, 21 May 2017 23:33:15 +0200 -Subject: [PATCH] ppc64: Add minimal fallback unwinder. - -This adds a minimal fallback unwinder for ppc64[le] in case we cannot find -CFI for a particular address. It simply always sets the program counter to -the link register, picks the previous stack pointer from the backchain, -and the previous link register from the LR save area. - -This is enough for some simple situations when we don't have CFI and -seems to work nicely in the case of perf with libdw powerpc support: -https://lkml.org/lkml/2017/5/18/998 - -Signed-off-by: Mark Wielaard ---- - backends/ChangeLog | 6 +++ - backends/Makefile.am | 2 +- - backends/ppc64_init.c | 1 + - backends/ppc64_unwind.c | 76 +++++++++++++++++++++++++++++++++ - tests/ChangeLog | 10 +++++ - tests/Makefile.am | 3 ++ - tests/backtrace-subr.sh | 2 +- - tests/backtrace.ppc64le.fp.core.bz2 | Bin 0 -> 37786 bytes - tests/backtrace.ppc64le.fp.exec.bz2 | Bin 0 -> 383808 bytes - tests/run-backtrace-fp-core-ppc64le.sh | 29 +++++++++++++ - 10 files changed, 127 insertions(+), 2 deletions(-) - create mode 100644 backends/ppc64_unwind.c - create mode 100644 tests/backtrace.ppc64le.fp.core.bz2 - create mode 100755 tests/backtrace.ppc64le.fp.exec.bz2 - create mode 100755 tests/run-backtrace-fp-core-ppc64le.sh - -index ff80a82..ac45a45 100644 ---- a/backends/Makefile.am -+++ b/backends/Makefile.am -@@ -98,7 +98,7 @@ am_libebl_ppc_pic_a_OBJECTS = $(ppc_SRCS:.c=.os) - - ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c \ - ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \ -- ppc_cfi.c ppc_initreg.c ppc64_resolve_sym.c -+ ppc_cfi.c ppc_initreg.c ppc64_unwind.c ppc64_resolve_sym.c - libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS) - am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os) - -diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c -index 11d3a77..e567033 100644 ---- a/backends/ppc64_init.c -+++ b/backends/ppc64_init.c -@@ -73,6 +73,7 @@ ppc64_init (Elf *elf __attribute__ ((unused)), - eh->frame_nregs = (114 - 1) + 32; - HOOK (eh, set_initial_registers_tid); - HOOK (eh, dwarf_to_regno); -+ HOOK (eh, unwind); - HOOK (eh, resolve_sym_value); - - /* Find the function descriptor .opd table for resolve_sym_value. */ -diff --git a/backends/ppc64_unwind.c b/backends/ppc64_unwind.c -new file mode 100644 -index 0000000..4fa0b5a ---- /dev/null -+++ b/backends/ppc64_unwind.c -@@ -0,0 +1,76 @@ -+/* Get previous frame state for an existing frame state. -+ Copyright (C) 2017 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 either -+ -+ * the GNU Lesser General Public License as published by the Free -+ Software Foundation; either version 3 of the License, or (at -+ your option) any later version -+ -+ or -+ -+ * 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 -+ -+ or both in parallel, as here. -+ -+ 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 copies of the GNU General Public License and -+ the GNU Lesser General Public License along with this program. If -+ not, see . */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#define BACKEND ppc64_ -+ -+#define LR_REG 65 /* Not 108, see ppc_dwarf_to_regno. */ -+#define SP_REG 1 -+ -+#define LR_OFFSET 16 -+ -+#include "libebl_CPU.h" -+ -+/* Simplistic fallback frame unwinder. SP points to the backchain (contains -+ address of previous stack pointer). At SP offset 16 is the LR save area -+ (contains the value of the previous LR). */ -+ -+bool -+EBLHOOK(unwind) (Ebl *ebl __attribute__ ((unused)), -+ Dwarf_Addr pc __attribute__ ((unused)), -+ ebl_tid_registers_t *setfunc, ebl_tid_registers_get_t *getfunc, -+ ebl_pid_memory_read_t *readfunc, void *arg, -+ bool *signal_framep __attribute__ ((unused))) -+{ -+ Dwarf_Word sp, newSp, lr, newLr; -+ -+ /* Stack pointer points to the backchain which contains the previous sp. */ -+ if (! getfunc (SP_REG, 1, &sp, arg)) -+ sp = 0; -+ -+ /* Link register contains previous program counter. */ -+ if (! getfunc (LR_REG, 1, &lr, arg) -+ || lr == 0 -+ || ! setfunc (-1, 1, &lr, arg)) -+ return false; -+ -+ if (! readfunc(sp, &newSp, arg)) -+ newSp = 0; -+ -+ if (! readfunc(newSp + LR_OFFSET, &newLr, arg)) -+ newLr = 0; -+ -+ setfunc(SP_REG, 1, &newSp, arg); -+ setfunc(LR_REG, 1, &newLr, arg); -+ -+ /* Sanity check the stack grows down. */ -+ return newSp > sp; -+} -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 3a12fe3..50648db 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -117,6 +117,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ - run-backtrace-native-core-biarch.sh run-backtrace-core-x86_64.sh \ - run-backtrace-fp-core-x86_64.sh \ - run-backtrace-fp-core-aarch64.sh \ -+ run-backtrace-fp-core-ppc64le.sh \ - run-backtrace-core-x32.sh \ - run-backtrace-core-i386.sh run-backtrace-fp-core-i386.sh \ - run-backtrace-core-ppc.sh \ -@@ -303,6 +304,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ - backtrace-subr.sh backtrace.i386.core.bz2 backtrace.i386.exec.bz2 \ - run-backtrace-fp-core-i386.sh \ - backtrace.i386.fp.core.bz2 backtrace.i386.fp.exec.bz2 \ -+ run-backtrace-fp-core-ppc64le.sh \ -+ backtrace.ppc64le.fp.core.bz2 backtrace.ppc64le.fp.exec.bz2 \ - backtrace.x86_64.core.bz2 backtrace.x86_64.exec.bz2 \ - backtrace.x86_64.fp.core.bz2 backtrace.x86_64.fp.exec.bz2 \ - backtrace.ppc.core.bz2 backtrace.ppc.exec.bz2 \ -diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh -index 9731c43..c1f3156 100644 ---- a/tests/backtrace-subr.sh -+++ b/tests/backtrace-subr.sh -@@ -59,7 +59,7 @@ check_backtracegen() - # Ignore it here as it is a bug of OS, not a bug of elfutils. - check_err() - { -- if [ $(egrep -v <$1 'dwfl_thread_getframes: (No DWARF information found|no matching address range|address out of range|Invalid register)$' \ -+ if [ $(egrep -v <$1 'dwfl_thread_getframes: (No DWARF information found|no matching address range|address out of range|Invalid register|\(null\))$' \ - | wc -c) \ - -eq 0 ] - then -diff --git a/tests/run-backtrace-fp-core-ppc64le.sh b/tests/run-backtrace-fp-core-ppc64le.sh -new file mode 100755 -index 0000000..326ca34 ---- /dev/null -+++ b/tests/run-backtrace-fp-core-ppc64le.sh -@@ -0,0 +1,29 @@ -+#! /bin/bash -+# Copyright (C) 2017 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/backtrace-subr.sh -+ -+# The binary is generated by compiling backtrace-child without unwind -+# information, but with -fno-omit-frame-pointer. -+# -+# gcc -static -O2 -fno-omit-frame-pointer -fno-asynchronous-unwind-tables \ -+# -D_GNU_SOURCE -pthread -o tests/backtrace.ppc64le.fp.exec -I. -Ilib \ -+# tests/backtrace-child.c -+# -+# The core is generated by calling tests/backtrace.ppc64le.fp.exec --gencore -+ -+check_core ppc64le.fp --- -1.8.3.1 - -diff -ru elfutils-0.169.orig/backends/Makefile.in elfutils-0.169/backends/Makefile.in ---- elfutils-0.169.orig/backends/Makefile.in 2017-05-30 21:43:28.725454717 +0200 -+++ elfutils-0.169/backends/Makefile.in 2017-05-30 21:43:55.681944556 +0200 -@@ -159,7 +159,7 @@ - ppc64_retval.$(OBJEXT) ppc64_corenote.$(OBJEXT) \ - ppc_regs.$(OBJEXT) ppc_auxv.$(OBJEXT) ppc_attrs.$(OBJEXT) \ - ppc_syscall.$(OBJEXT) ppc_cfi.$(OBJEXT) ppc_initreg.$(OBJEXT) \ -- ppc64_resolve_sym.$(OBJEXT) -+ ppc64_unwind.$(OBJEXT) ppc64_resolve_sym.$(OBJEXT) - libebl_ppc64_pic_a_OBJECTS = $(am_libebl_ppc64_pic_a_OBJECTS) - libebl_ppc_pic_a_AR = $(AR) $(ARFLAGS) - libebl_ppc_pic_a_LIBADD = -@@ -505,7 +505,7 @@ - am_libebl_ppc_pic_a_OBJECTS = $(ppc_SRCS:.c=.os) - ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c \ - ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \ -- ppc_cfi.c ppc_initreg.c ppc64_resolve_sym.c -+ ppc_cfi.c ppc_initreg.c ppc64_unwind.c ppc64_resolve_sym.c - - libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS) - am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os) -@@ -696,6 +696,7 @@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_resolve_sym.Po@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_retval.Po@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_symbol.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_unwind.Po@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_attrs.Po@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_auxv.Po@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_cfi.Po@am__quote@ -diff -ru elfutils-0.169.orig/tests/Makefile.in elfutils-0.169/tests/Makefile.in ---- elfutils-0.169.orig/tests/Makefile.in 2017-05-30 21:43:28.743454377 +0200 -+++ elfutils-0.169/tests/Makefile.in 2017-05-30 21:43:56.191934904 +0200 -@@ -174,7 +174,8 @@ - run-backtrace-native-biarch.sh run-backtrace-native-core.sh \ - run-backtrace-native-core-biarch.sh \ - run-backtrace-core-x86_64.sh run-backtrace-fp-core-x86_64.sh \ -- run-backtrace-fp-core-aarch64.sh run-backtrace-core-x32.sh \ -+ run-backtrace-fp-core-aarch64.sh \ -+ run-backtrace-fp-core-ppc64le.sh run-backtrace-core-x32.sh \ - run-backtrace-core-i386.sh run-backtrace-fp-core-i386.sh \ - run-backtrace-core-ppc.sh run-backtrace-core-s390x.sh \ - run-backtrace-core-s390.sh run-backtrace-core-aarch64.sh \ -@@ -1174,6 +1175,8 @@ - backtrace-subr.sh backtrace.i386.core.bz2 backtrace.i386.exec.bz2 \ - run-backtrace-fp-core-i386.sh \ - backtrace.i386.fp.core.bz2 backtrace.i386.fp.exec.bz2 \ -+ run-backtrace-fp-core-ppc64le.sh \ -+ backtrace.ppc64le.fp.core.bz2 backtrace.ppc64le.fp.exec.bz2 \ - backtrace.x86_64.core.bz2 backtrace.x86_64.exec.bz2 \ - backtrace.x86_64.fp.core.bz2 backtrace.x86_64.fp.exec.bz2 \ - backtrace.ppc.core.bz2 backtrace.ppc.exec.bz2 \ -@@ -2924,6 +2927,13 @@ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ -+ "$$tst" $(AM_TESTS_FD_REDIRECT) -+run-backtrace-fp-core-ppc64le.sh.log: run-backtrace-fp-core-ppc64le.sh -+ @p='run-backtrace-fp-core-ppc64le.sh'; \ -+ b='run-backtrace-fp-core-ppc64le.sh'; \ -+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ -+ --log-file $$b.log --trs-file $$b.trs \ -+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) - run-backtrace-core-x32.sh.log: run-backtrace-core-x32.sh - @p='run-backtrace-core-x32.sh'; \ diff --git a/elfutils-0.169-s390x-ptrace.patch b/elfutils-0.169-s390x-ptrace.patch deleted file mode 100644 index 86e51e8..0000000 --- a/elfutils-0.169-s390x-ptrace.patch +++ /dev/null @@ -1,27 +0,0 @@ -commit 1dd301b7c302b9df980946e2d04ca99748754991 -Author: Mark Wielaard -Date: Mon Jul 17 17:26:25 2017 +0200 - - backends: Swap sys/ptrace.h and asm/ptrace.h include order on s390. - - glibc 2.26 changed the sys/ptrace.h header so that it cannot be included - after asm/ptrace.h. We still need to include the kernel asm/ptrace.h for - the ptrace_area definition. Including it after sys/ptrace.h works against - both old and new glibc. - - Signed-off-by: Mark Wielaard - -diff --git a/backends/s390_initreg.c b/backends/s390_initreg.c -index 011305c..23bf8ed 100644 ---- a/backends/s390_initreg.c -+++ b/backends/s390_initreg.c -@@ -34,8 +34,8 @@ - #include - #if defined(__s390__) && defined(__linux__) - # include --# include - # include -+# include - #endif - - #define BACKEND s390_ diff --git a/elfutils-0.169-strip-data-marker-symbols.patch b/elfutils-0.169-strip-data-marker-symbols.patch deleted file mode 100644 index 37cede8..0000000 --- a/elfutils-0.169-strip-data-marker-symbols.patch +++ /dev/null @@ -1,553 +0,0 @@ -commit 17bfd57dd13f81b8ed5d1ee5109355bc377cf76c -Author: Mark Wielaard -Date: Thu Jul 20 22:34:29 2017 +0200 - - strip: Deal with ARM data marker symbols pointing to debug sections. - - ARM data marker symbols "$d" indicate the start of a sequence of data - items in a section. For data only sections no data marker symbol is - necessary, but may be put pointing to the start of the section. - binutils however has a bug which places a data marker symbol somewhere - inside the section (at least for .debug_frame). - https://sourceware.org/bugzilla/show_bug.cgi?id=21809 - - When strip finds a symbol pointing to a debug section that would be - put into the .debug file then it will copy over the whole symbol table. - This isn't necessary because the symbol is redundant. - - Add an ebl hook to recognize data marker symbols with implementations - for arm and aarch64. Use it in strip to strip such symbols from the - symbol table if they point to a debug section. - - Signed-off-by: Mark Wielaard - -diff --git a/backends/aarch64_init.c b/backends/aarch64_init.c -index 0866494..fad923f 100644 ---- a/backends/aarch64_init.c -+++ b/backends/aarch64_init.c -@@ -1,5 +1,5 @@ - /* Initialization of AArch64 specific backend library. -- Copyright (C) 2013 Red Hat, Inc. -+ Copyright (C) 2013, 2017 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -56,6 +56,7 @@ aarch64_init (Elf *elf __attribute__ ((unused)), - HOOK (eh, reloc_simple_type); - HOOK (eh, return_value_location); - HOOK (eh, check_special_symbol); -+ HOOK (eh, data_marker_symbol); - HOOK (eh, abi_cfi); - - /* X0-X30 (31 regs) + SP + 1 Reserved + ELR, 30 Reserved regs (34-43) -diff --git a/backends/aarch64_symbol.c b/backends/aarch64_symbol.c -index 76999e4..da3382e 100644 ---- a/backends/aarch64_symbol.c -+++ b/backends/aarch64_symbol.c -@@ -1,5 +1,5 @@ - /* AArch64 specific symbolic name handling. -- Copyright (C) 2013, 2015 Red Hat, Inc. -+ Copyright (C) 2013, 2015, 2017 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -90,3 +90,15 @@ aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym, - - return false; - } -+ -+/* A data mapping symbol is a symbol with "$d" name or "$d." name, -+ STT_NOTYPE, STB_LOCAL and st_size of zero. The indicate the stat of a -+ sequence of data items. */ -+bool -+aarch64_data_marker_symbol (const GElf_Sym *sym, const char *sname) -+{ -+ return (sym != NULL && sname != NULL -+ && sym->st_size == 0 && GELF_ST_BIND (sym->st_info) == STB_LOCAL -+ && GELF_ST_TYPE (sym->st_info) == STT_NOTYPE -+ && (strcmp (sname, "$d") == 0 || strncmp (sname, "$d.", 3) == 0)); -+} -diff --git a/backends/arm_init.c b/backends/arm_init.c -index caadac6..f2b1b11 100644 ---- a/backends/arm_init.c -+++ b/backends/arm_init.c -@@ -1,5 +1,5 @@ - /* Initialization of Arm specific backend library. -- Copyright (C) 2002, 2005, 2009, 2013, 2014, 2015 Red Hat, Inc. -+ Copyright (C) 2002, 2005, 2009, 2013, 2014, 2015, 2017 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 2002. - -@@ -64,6 +64,7 @@ arm_init (Elf *elf __attribute__ ((unused)), - HOOK (eh, abi_cfi); - HOOK (eh, check_reloc_target_type); - HOOK (eh, symbol_type_name); -+ HOOK (eh, data_marker_symbol); - - /* We only unwind the core integer registers. */ - eh->frame_nregs = 16; -diff --git a/backends/arm_symbol.c b/backends/arm_symbol.c -index da4a50a..3edda72 100644 ---- a/backends/arm_symbol.c -+++ b/backends/arm_symbol.c -@@ -1,5 +1,5 @@ - /* Arm specific symbolic name handling. -- Copyright (C) 2002-2009, 2014, 2015 Red Hat, Inc. -+ Copyright (C) 2002-2009, 2014, 2015, 2017 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -32,6 +32,7 @@ - - #include - #include -+#include - - #define BACKEND arm_ - #include "libebl_CPU.h" -@@ -142,3 +143,15 @@ arm_symbol_type_name (int type, - } - return NULL; - } -+ -+/* A data mapping symbol is a symbol with "$d" name or "$d." name, -+ * STT_NOTYPE, STB_LOCAL and st_size of zero. The indicate the stat of a -+ * sequence of data items. */ -+bool -+arm_data_marker_symbol (const GElf_Sym *sym, const char *sname) -+{ -+ return (sym != NULL && sname != NULL -+ && sym->st_size == 0 && GELF_ST_BIND (sym->st_info) == STB_LOCAL -+ && GELF_ST_TYPE (sym->st_info) == STT_NOTYPE -+ && (strcmp (sname, "$d") == 0 || strncmp (sname, "$d.", 3) == 0)); -+} -diff --git a/libebl/Makefile.am b/libebl/Makefile.am -index 6f945eb..2491df8 100644 ---- a/libebl/Makefile.am -+++ b/libebl/Makefile.am -@@ -1,6 +1,6 @@ - ## Process this file with automake to create Makefile.in - ## --## Copyright (C) 2000-2010, 2013, 2016 Red Hat, Inc. -+## Copyright (C) 2000-2010, 2013, 2016, 2017 Red Hat, Inc. - ## This file is part of elfutils. - ## - ## This file is free software; you can redistribute it and/or modify -@@ -53,7 +53,8 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c \ - eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \ - ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \ - eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \ -- eblunwind.c eblresolvesym.c eblcheckreloctargettype.c -+ eblunwind.c eblresolvesym.c eblcheckreloctargettype.c \ -+ ebl_data_marker_symbol.c - - libebl_a_SOURCES = $(gen_SOURCES) - -diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h -index b725374..f3a0e64 100644 ---- a/libebl/ebl-hooks.h -+++ b/libebl/ebl-hooks.h -@@ -1,5 +1,5 @@ - /* Backend hook signatures internal interface for libebl. -- Copyright (C) 2000-2011, 2013, 2014, 2016 Red Hat, Inc. -+ Copyright (C) 2000-2011, 2013, 2014, 2016, 2017 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -121,6 +121,9 @@ bool EBLHOOK(relative_reloc_p) (int); - bool EBLHOOK(check_special_symbol) (Elf *, GElf_Ehdr *, const GElf_Sym *, - const char *, const GElf_Shdr *); - -+/* Check if this is a data marker symbol. e.g. '$d' symbols for ARM. */ -+bool EBLHOOK(data_marker_symbol) (const GElf_Sym *sym, const char *sname); -+ - /* Check whether only valid bits are set on the st_other symbol flag. - Standard ST_VISIBILITY have already been masked off. */ - bool EBLHOOK(check_st_other_bits) (unsigned char st_other); -diff --git a/libebl/ebl_data_marker_symbol.c b/libebl/ebl_data_marker_symbol.c -new file mode 100644 -index 0000000..922d720 ---- /dev/null -+++ b/libebl/ebl_data_marker_symbol.c -@@ -0,0 +1,44 @@ -+/* Check whether a symbol is a special data marker. -+ Copyright (C) 2017 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 either -+ -+ * the GNU Lesser General Public License as published by the Free -+ Software Foundation; either version 3 of the License, or (at -+ your option) any later version -+ -+ or -+ -+ * 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 -+ -+ or both in parallel, as here. -+ -+ 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 copies of the GNU General Public License and -+ the GNU Lesser General Public License along with this program. If -+ not, see . */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include -+#include -+ -+ -+bool -+ebl_data_marker_symbol (Ebl *ebl, const GElf_Sym *sym, const char *sname) -+{ -+ if (ebl == NULL) -+ return false; -+ -+ return ebl->data_marker_symbol (sym, sname); -+} -diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c -index f3a65cf..1f81477 100644 ---- a/libebl/eblopenbackend.c -+++ b/libebl/eblopenbackend.c -@@ -1,5 +1,5 @@ - /* Generate ELF backend handle. -- Copyright (C) 2000-2016 Red Hat, Inc. -+ Copyright (C) 2000-2017 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -184,6 +184,7 @@ static bool default_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, - const GElf_Sym *sym, - const char *name, - const GElf_Shdr *destshdr); -+static bool default_data_marker_symbol (const GElf_Sym *sym, const char *sname); - static bool default_check_st_other_bits (unsigned char st_other); - static bool default_check_special_section (Ebl *, int, - const GElf_Shdr *, const char *); -@@ -235,6 +236,7 @@ fill_defaults (Ebl *result) - result->none_reloc_p = default_none_reloc_p; - result->relative_reloc_p = default_relative_reloc_p; - result->check_special_symbol = default_check_special_symbol; -+ result->data_marker_symbol = default_data_marker_symbol; - result->check_st_other_bits = default_check_st_other_bits; - result->bss_plt_p = default_bss_plt_p; - result->return_value_location = default_return_value_location; -@@ -672,6 +674,13 @@ default_check_special_symbol (Elf *elf __attribute__ ((unused)), - } - - static bool -+default_data_marker_symbol (const GElf_Sym *sym __attribute__ ((unused)), -+ const char *sname __attribute__ ((unused))) -+{ -+ return false; -+} -+ -+static bool - default_check_st_other_bits (unsigned char st_other __attribute__ ((unused))) - { - return false; -diff --git a/libebl/libebl.h b/libebl/libebl.h -index 87896e4..882bdb9 100644 ---- a/libebl/libebl.h -+++ b/libebl/libebl.h -@@ -1,5 +1,5 @@ - /* Interface for libebl. -- Copyright (C) 2000-2010, 2013, 2014, 2015, 2016 Red Hat, Inc. -+ Copyright (C) 2000-2010, 2013, 2014, 2015, 2016, 2017 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -156,6 +156,10 @@ extern bool ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr, - const GElf_Sym *sym, const char *name, - const GElf_Shdr *destshdr); - -+/* Check if this is a data marker symbol. e.g. '$d' symbols for ARM. */ -+extern bool ebl_data_marker_symbol (Ebl *ebl, const GElf_Sym *sym, -+ const char *sname); -+ - /* Check whether only valid bits are set on the st_other symbol flag. */ - extern bool ebl_check_st_other_bits (Ebl *ebl, unsigned char st_other); - -diff --git a/src/strip.c b/src/strip.c -index 4a35ea1..773ed54 100644 ---- a/src/strip.c -+++ b/src/strip.c -@@ -1,5 +1,5 @@ - /* Discard section not used at runtime from object files. -- Copyright (C) 2000-2012, 2014, 2015, 2016 Red Hat, Inc. -+ Copyright (C) 2000-2012, 2014, 2015, 2016, 2017 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 2000. - -@@ -960,8 +960,19 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - if (shdr_info[scnidx].idx == 0) - /* This symbol table has a real symbol in - a discarded section. So preserve the -- original table in the debug file. */ -- shdr_info[cnt].debug_data = symdata; -+ original table in the debug file. Unless -+ it is a redundant data marker to a debug -+ (data only) section. */ -+ if (! (ebl_section_strip_p (ebl, ehdr, -+ &shdr_info[scnidx].shdr, -+ shdr_info[scnidx].name, -+ remove_comment, -+ remove_debug) -+ && ebl_data_marker_symbol (ebl, sym, -+ elf_strptr (elf, -+ shdr_info[cnt].shdr.sh_link, -+ sym->st_name)))) -+ shdr_info[cnt].debug_data = symdata; - } - } - -@@ -1293,7 +1304,10 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - shdr_info[cnt].shdr.sh_name = dwelf_strent_off (shdr_info[cnt].se); - - /* Update the section header from the input file. Some fields -- might be section indeces which now have to be adjusted. */ -+ might be section indeces which now have to be adjusted. Keep -+ the index to the "current" sh_link in case we need it to lookup -+ symbol table names. */ -+ size_t sh_link = shdr_info[cnt].shdr.sh_link; - if (shdr_info[cnt].shdr.sh_link != 0) - shdr_info[cnt].shdr.sh_link = - shdr_info[shdr_info[cnt].shdr.sh_link].idx; -@@ -1492,13 +1506,17 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - /* The symbol points to a section that is discarded - but isn't preserved in the debug file. Check that - this is a section or group signature symbol -- for a section which has been removed. */ -+ for a section which has been removed. Or a special -+ data marker symbol to a debug section. */ - { - elf_assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION - || ((shdr_info[sidx].shdr.sh_type - == SHT_GROUP) - && (shdr_info[sidx].shdr.sh_info -- == inner))); -+ == inner)) -+ || ebl_data_marker_symbol (ebl, sym, -+ elf_strptr (elf, sh_link, -+ sym->st_name))); - } - } - -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 7fd4b21..edfdb53 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -81,7 +81,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ - run-strip-test3.sh run-strip-test4.sh run-strip-test5.sh \ - run-strip-test6.sh run-strip-test7.sh run-strip-test8.sh \ - run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ -- run-strip-nothing.sh \ -+ run-strip-nothing.sh run-strip-g.sh \ - run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ - run-strip-nobitsalign.sh run-strip-remove-keep.sh \ - run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-test3.sh \ -@@ -176,7 +176,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ - run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ - run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ - run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ -- run-strip-nothing.sh run-strip-remove-keep.sh \ -+ run-strip-nothing.sh run-strip-remove-keep.sh run-strip-g.sh \ - run-strip-strmerge.sh run-strip-nobitsalign.sh \ - testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ - run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ -diff --git a/tests/run-strip-g.sh b/tests/run-strip-g.sh -new file mode 100755 -index 0000000..1303819 ---- /dev/null -+++ b/tests/run-strip-g.sh -@@ -0,0 +1,102 @@ -+#! /bin/sh -+# Copyright (C) 2017 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 -+ -+# When stripping just the debug sections/symbols we keep the symtab -+# in the main ELF file. There should be no symbols pointing into the -+# debug sections and so there should not be a copy in the debug file -+# except for a NOBITS one. -+ -+tempfiles a.out strip.out debug.out readelf.out -+ -+echo Create debug a.out. -+echo "int main() { return 1; }" | gcc -g -xc - -+ -+echo strip -g to file with debug file -+testrun ${abs_top_builddir}/src/strip -g -o strip.out -f debug.out || -+ { echo "*** failed to strip -g -o strip.out -f debug.out a.out"; exit -1; } -+ -+status=0 -+testrun ${abs_top_builddir}/src/readelf -S strip.out > readelf.out -+grep SYMTAB readelf.out || status=$? -+echo $status -+if test $status -ne 0; then -+ echo no symtab found in strip.out -+ exit 1 -+fi -+ -+status=0 -+testrun ${abs_top_builddir}/src/readelf -S debug.out > readelf.out -+grep SYMTAB readelf.out || status=$? -+echo $status -+if test $status -ne 1; then -+ echo symtab found in debug.out -+ exit 1 -+fi -+ -+# arm (with data marker in .debug_frame). See tests/run-addrcfi.sh -+testfiles testfilearm -+ -+echo arm strip -g to file with debug file -+testrun ${abs_top_builddir}/src/strip -g -o strip.out -f debug.out testfilearm || -+ { echo "*** failed to strip -g -o strip.out -f debug.out a.out"; exit -1; } -+ -+status=0 -+testrun ${abs_top_builddir}/src/readelf -S strip.out > readelf.out -+grep SYMTAB readelf.out || status=$? -+echo $status -+if test $status -ne 0; then -+ echo no symtab found in strip.out -+ exit 1 -+fi -+ -+status=0 -+testrun ${abs_top_builddir}/src/readelf -S debug.out > readelf.out -+grep SYMTAB readelf.out || status=$? -+echo $status -+if test $status -ne 1; then -+ echo symtab found in debug.out -+ exit 1 -+fi -+ -+# aarch64 (with data marker in .debug_frame). See tests/run-addrcfi.sh -+testfiles testfileaarch64 -+ -+echo aarch64 strip -g to file with debug file -+testrun ${abs_top_builddir}/src/strip -g -o strip.out -f debug.out testfileaarch64 || -+ { echo "*** failed to strip -g -o strip.out -f debug.out a.out"; exit -1; } -+ -+status=0 -+testrun ${abs_top_builddir}/src/readelf -S strip.out > readelf.out -+grep SYMTAB readelf.out || status=$? -+echo $status -+if test $status -ne 0; then -+ echo no symtab found in strip.out -+ exit 1 -+fi -+ -+status=0 -+testrun ${abs_top_builddir}/src/readelf -S debug.out > readelf.out -+grep SYMTAB readelf.out || status=$? -+echo $status -+if test $status -ne 1; then -+ echo symtab found in debug.out -+ exit 1 -+fi -+ -+exit 0 -diff -ru elfutils-0.169.orig/libebl/Makefile.in elfutils-0.169/libebl/Makefile.in ---- elfutils-0.169.orig/libebl/Makefile.in 2017-07-21 12:49:56.824083447 +0200 -+++ elfutils-0.169/libebl/Makefile.in 2017-07-21 12:50:44.169036296 +0200 -@@ -163,7 +163,8 @@ - eblstother.$(OBJEXT) eblinitreg.$(OBJEXT) \ - ebldwarftoregno.$(OBJEXT) eblnormalizepc.$(OBJEXT) \ - eblunwind.$(OBJEXT) eblresolvesym.$(OBJEXT) \ -- eblcheckreloctargettype.$(OBJEXT) -+ eblcheckreloctargettype.$(OBJEXT) \ -+ ebl_data_marker_symbol.$(OBJEXT) - am_libebl_a_OBJECTS = $(am__objects_1) - libebl_a_OBJECTS = $(am_libebl_a_OBJECTS) - AM_V_P = $(am__v_P_@AM_V@) -@@ -405,7 +406,8 @@ - eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \ - ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \ - eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \ -- eblunwind.c eblresolvesym.c eblcheckreloctargettype.c -+ eblunwind.c eblresolvesym.c eblcheckreloctargettype.c \ -+ ebl_data_marker_symbol.c - - libebl_a_SOURCES = $(gen_SOURCES) - noinst_HEADERS = libeblP.h ebl-hooks.h -diff -ru elfutils-0.169.orig/tests/Makefile.in elfutils-0.169/tests/Makefile.in ---- elfutils-0.169.orig/tests/Makefile.in 2017-07-21 12:49:56.849082894 +0200 -+++ elfutils-0.169/tests/Makefile.in 2017-07-21 12:50:44.461029838 +0200 -@@ -139,17 +139,18 @@ - run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ - run-strip-test7.sh run-strip-test8.sh run-strip-test9.sh \ - run-strip-test10.sh run-strip-test11.sh run-strip-nothing.sh \ -- run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ -- run-strip-nobitsalign.sh run-strip-remove-keep.sh \ -- run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-test3.sh \ -- run-unstrip-test4.sh run-unstrip-M.sh run-elfstrmerge-test.sh \ -- run-ecp-test.sh run-ecp-test2.sh run-alldts.sh \ -- run-elflint-test.sh run-elflint-self.sh run-ranlib-test.sh \ -- run-ranlib-test2.sh run-ranlib-test3.sh run-ranlib-test4.sh \ -- run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \ -- run-find-prologues.sh run-allregs.sh run-addrcfi.sh \ -- run-nm-self.sh run-readelf-self.sh run-readelf-test1.sh \ -- run-readelf-test2.sh run-readelf-test3.sh run-readelf-test4.sh \ -+ run-strip-g.sh run-strip-groups.sh run-strip-reloc.sh \ -+ run-strip-strmerge.sh run-strip-nobitsalign.sh \ -+ run-strip-remove-keep.sh run-unstrip-test.sh \ -+ run-unstrip-test2.sh run-unstrip-test3.sh run-unstrip-test4.sh \ -+ run-unstrip-M.sh run-elfstrmerge-test.sh run-ecp-test.sh \ -+ run-ecp-test2.sh run-alldts.sh run-elflint-test.sh \ -+ run-elflint-self.sh run-ranlib-test.sh run-ranlib-test2.sh \ -+ run-ranlib-test3.sh run-ranlib-test4.sh run-addrscopes.sh \ -+ run-strings-test.sh run-funcscopes.sh run-find-prologues.sh \ -+ run-allregs.sh run-addrcfi.sh run-nm-self.sh \ -+ run-readelf-self.sh run-readelf-test1.sh run-readelf-test2.sh \ -+ run-readelf-test3.sh run-readelf-test4.sh \ - run-readelf-twofiles.sh run-readelf-macro.sh \ - run-readelf-loc.sh run-readelf-aranges.sh run-readelf-line.sh \ - run-readelf-z.sh run-native-test.sh run-bug1-test.sh \ -@@ -1046,7 +1047,7 @@ - run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ - run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ - run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ -- run-strip-nothing.sh run-strip-remove-keep.sh \ -+ run-strip-nothing.sh run-strip-remove-keep.sh run-strip-g.sh \ - run-strip-strmerge.sh run-strip-nobitsalign.sh \ - testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ - run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ -@@ -2340,6 +2341,13 @@ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ -+ "$$tst" $(AM_TESTS_FD_REDIRECT) -+run-strip-g.sh.log: run-strip-g.sh -+ @p='run-strip-g.sh'; \ -+ b='run-strip-g.sh'; \ -+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ -+ --log-file $$b.log --trs-file $$b.trs \ -+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) - run-strip-groups.sh.log: run-strip-groups.sh - @p='run-strip-groups.sh'; \ diff --git a/elfutils-0.169-strip-empty.patch b/elfutils-0.169-strip-empty.patch deleted file mode 100644 index 13d0c0f..0000000 --- a/elfutils-0.169-strip-empty.patch +++ /dev/null @@ -1,235 +0,0 @@ -commit b065d4a401e2120c11c92357b213a85e6d70f300 -Author: Mark Wielaard -Date: Wed Jun 7 20:32:38 2017 +0200 - - strip: Don't generate empty output file when nothing to do. - - If there was nothing to do strip would skip generating a separate - debug file if one was requested, but it would also not finish the - creation of a new output file (with the non-stripped sections). - Also if there was an error any partially created output would be kept. - - Make sure that when the -o output file option is given we always generate - a complete output file (except on error). Also make sure that when the -f - debug file option is given it is only generated when it is not empty. - - Add testcase run-strip-nothing.sh that tests the various combinations. - - https://sourceware.org/bugzilla/show_bug.cgi?id=21522 - - Signed-off-by: Mark Wielaard - -diff --git a/src/ChangeLog b/src/ChangeLog -index 6ac0ef2..e19122e 100644 ---- a/src/ChangeLog -+++ b/src/ChangeLog -@@ -1,3 +1,9 @@ -+2017-06-07 Mark Wielaard -+ -+ * strip.c (handle_elf): Introduce new handle_elf boolean. Use it to -+ determine whether to create an output and/or debug file. Remove new -+ output file on error. -+ - 2017-06-06 Mark Wielaard - - * strip.c (handle_elf): Assume e_shstrndx section can be removed. -diff --git a/src/strip.c b/src/strip.c -index 11b2a37..2bf95f9 100644 ---- a/src/strip.c -+++ b/src/strip.c -@@ -1063,15 +1063,17 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - shdr_info[cnt].se = dwelf_strtab_add (shst, shdr_info[cnt].name); - } - -- /* Test whether we are doing anything at all. */ -- if (cnt == idx -- || (cnt == idx + 1 && shdr_info[ehdr->e_shstrndx].idx == 0)) -- /* Nope, all removable sections are already gone. Or the only section -- we would remove is the .shstrtab section which we will add again. */ -- goto fail_close; -- -- /* Create the reference to the file with the debug info. */ -- if (debug_fname != NULL && !remove_shdrs) -+ /* Test whether we are doing anything at all. Either all removable -+ sections are already gone. Or the only section we would remove is -+ the .shstrtab section which we would add again. */ -+ bool removing_sections = !(cnt == idx -+ || (cnt == idx + 1 -+ && shdr_info[ehdr->e_shstrndx].idx == 0)); -+ if (output_fname == NULL && !removing_sections) -+ goto fail_close; -+ -+ /* Create the reference to the file with the debug info (if any). */ -+ if (debug_fname != NULL && !remove_shdrs && removing_sections) - { - /* Add the section header string table section name. */ - shdr_info[cnt].se = dwelf_strtab_add_len (shst, ".gnu_debuglink", 15); -@@ -1759,7 +1761,8 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - /* Remove any relocations between debug sections in ET_REL - for the debug file when requested. These relocations are always - zero based between the unallocated sections. */ -- if (debug_fname != NULL && reloc_debug && ehdr->e_type == ET_REL) -+ if (debug_fname != NULL && removing_sections -+ && reloc_debug && ehdr->e_type == ET_REL) - { - scn = NULL; - cnt = 0; -@@ -1997,7 +2000,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - - /* Now that we have done all adjustments to the data, - we can actually write out the debug file. */ -- if (debug_fname != NULL) -+ if (debug_fname != NULL && removing_sections) - { - /* Finally write the file. */ - if (unlikely (elf_update (debugelf, ELF_C_WRITE) == -1)) -@@ -2230,7 +2233,11 @@ cannot set access and modification date of '%s'"), - - /* Close the file descriptor if we created a new file. */ - if (output_fname != NULL) -- close (fd); -+ { -+ close (fd); -+ if (result != 0) -+ unlink (output_fname); -+ } - - return result; - } -diff --git a/tests/ChangeLog b/tests/ChangeLog -index 5800946..5550eac 100644 ---- a/tests/ChangeLog -+++ b/tests/ChangeLog -@@ -1,3 +1,9 @@ -+2017-06-07 Mark Wielaard -+ -+ * run-strip-nothing.sh: New test. -+ * Makefile.am (TESTS): Add run-strip-nothing.sh. -+ (EXTRA_DIST): Likewise. -+ - 2017-06-06 Mark Wielaard - - * run-strip-test.sh: Test strip -g doesn't introduce extra .shstrtab. -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 3a12fe3..28e997c 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -81,6 +81,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ - run-strip-test3.sh run-strip-test4.sh run-strip-test5.sh \ - run-strip-test6.sh run-strip-test7.sh run-strip-test8.sh \ - run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ -+ run-strip-nothing.sh \ - run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ - run-strip-nobitsalign.sh \ - run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-test3.sh \ -@@ -174,6 +175,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ - run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ - run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ - run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ -+ run-strip-nothing.sh \ - run-strip-strmerge.sh run-strip-nobitsalign.sh \ - testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ - run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ -diff --git a/tests/run-strip-nothing.sh b/tests/run-strip-nothing.sh -new file mode 100755 -index 0000000..e80bd90 ---- /dev/null -+++ b/tests/run-strip-nothing.sh -@@ -0,0 +1,62 @@ -+#! /bin/sh -+# Copyright (C) 2017 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 -+ -+# If there is nothing to strip then -o output should be identical to input. -+# And there should not be an (empty) -f debug file. -+ -+tempfiles a.out strip.out debug.out -+ -+# Create no-debug a.out. -+echo "int main() { return 1; }" | gcc -xc - -+ -+# strip to file -+testrun ${abs_top_builddir}/src/strip -g -o strip.out || -+ { echo "*** failed to strip -g -o strip.out a.out"; exit -1; } -+ -+testrun ${abs_top_builddir}/src/elfcmp a.out strip.out || -+ { echo "*** failed strip.out different from a.out"; exit -1; } -+ -+# strip original -+testrun ${abs_top_builddir}/src/strip -g || -+ { echo "*** failed to strip -g a.out"; exit -1; } -+ -+testrun ${abs_top_builddir}/src/elfcmp strip.out a.out || -+ { echo "*** failed a.out different from strip.out"; exit -1; } -+ -+# strip to file with debug file -+testrun ${abs_top_builddir}/src/strip -g -o strip.out -f debug.out || -+ { echo "*** failed to strip -g -o strip.out -f debug.out a.out"; exit -1; } -+ -+testrun ${abs_top_builddir}/src/elfcmp a.out strip.out || -+ { echo "*** failed strip.out different from a.out (with debug)"; exit -1; } -+ -+test ! -f debug.out || -+ { echo "*** failed strip.out and debug.out exist"; exit -1; } -+ -+# strip original with debug file -+testrun ${abs_top_builddir}/src/strip -g -f debug.out || -+ { echo "*** failed to strip -g -f debug.out a.out"; exit -1; } -+ -+testrun ${abs_top_builddir}/src/elfcmp strip.out a.out || -+ { echo "*** failed a.out different from strip.out (with debug)"; exit -1; } -+ -+test ! -f debug.out || -+ { echo "*** failed a.out and debug.out exist"; exit -1; } -+ -+exit 0 ---- elfutils-0.169/tests/Makefile.in.orig 2017-06-07 21:48:55.475994222 +0200 -+++ elfutils-0.169/tests/Makefile.in 2017-06-07 21:49:20.441430261 +0200 -@@ -138,8 +138,8 @@ - run-strip-test.sh run-strip-test2.sh run-strip-test3.sh \ - run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ - run-strip-test7.sh run-strip-test8.sh run-strip-test9.sh \ -- run-strip-test10.sh run-strip-test11.sh run-strip-groups.sh \ -- run-strip-reloc.sh run-strip-strmerge.sh \ -+ run-strip-test10.sh run-strip-test11.sh run-strip-nothing.sh \ -+ run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ - run-strip-nobitsalign.sh run-unstrip-test.sh \ - run-unstrip-test2.sh run-unstrip-test3.sh run-unstrip-test4.sh \ - run-unstrip-M.sh run-elfstrmerge-test.sh run-ecp-test.sh \ -@@ -1046,6 +1046,7 @@ - run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ - run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ - run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ -+ run-strip-nothing.sh \ - run-strip-strmerge.sh run-strip-nobitsalign.sh \ - testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ - run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ -@@ -2332,6 +2333,13 @@ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ -+ "$$tst" $(AM_TESTS_FD_REDIRECT) -+run-strip-nothing.sh.log: run-strip-nothing.sh -+ @p='run-strip-nothing.sh'; \ -+ b='run-strip-nothing.sh'; \ -+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ -+ --log-file $$b.log --trs-file $$b.trs \ -+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) - run-strip-groups.sh.log: run-strip-groups.sh - @p='run-strip-groups.sh'; \ diff --git a/elfutils-0.169-strip-keep-remove-section.patch b/elfutils-0.169-strip-keep-remove-section.patch deleted file mode 100644 index d864e60..0000000 --- a/elfutils-0.169-strip-keep-remove-section.patch +++ /dev/null @@ -1,1063 +0,0 @@ -commit d03be4f70c688a8c675935973663014c3c4bba76 -Author: Mark Wielaard -Date: Fri Jul 14 17:09:40 2017 +0200 - - strip: Add --keep-section=SECTION and --remove-section=SECTION. - - Adds two new output options: - - --keep-section=SECTION Keep the named section. SECTION is an extended - wildcard pattern. May be given more than once. - - --remove-section=SECTION Remove the named section. SECTION is an - extended wildcard pattern. May be given more than - once. Only non-allocated sections can be removed. - - The --remove-section was already partially implemented, but only for the - .comment section. The short option -R is to be compatible with binutils. - - The new testcase makes sure that various combinations of kept/removed - sections pull the correct dependencies into the output and/or debug files. - - https://bugzilla.redhat.com/show_bug.cgi?id=1465997 - - Signed-off-by: Mark Wielaard - -diff --git a/ChangeLog b/ChangeLog -index 0d6cd2b..c9db732 100644 ---- a/ChangeLog -+++ b/ChangeLog -@@ -1,3 +1,7 @@ -+2017-07-14 Mark Wielaard -+ -+ * NEWS: Add 0.170 section and new strip options. -+ - 2017-05-05 Mark Wielaard - - * configure.ac: Set version to 0.169. Update copyright year. -diff --git a/NEWS b/NEWS -index eb7dd97..b69aef4 100644 ---- a/NEWS -+++ b/NEWS -@@ -1,3 +1,7 @@ -+Version 0.170 -+ -+strip: Add -R, --remove-section=SECTION and --keep-section=SECTION. -+ - Version 0.169 - - backends: Add support for EM_PPC64 GNU_ATTRIBUTES. -diff --git a/src/ChangeLog b/src/ChangeLog -index e19122e..0b60fc7 100644 ---- a/src/ChangeLog -+++ b/src/ChangeLog -@@ -1,3 +1,16 @@ -+2017-07-14 Mark Wielaard -+ -+ * strip (OPT_KEEP_SECTION): New define. -+ (options): Add documentation for remove-section. Add keep-section. -+ (struct section_pattern): New data type. -+ (keep_secs, remove_secs): New globals. -+ (add_pattern, free_sec_patterns, free_patterns, section_name_matches): -+ New functions. -+ (main): Call free_patterns. -+ (parse_opt): Handle 'R' and OPT_KEEP_SECTION. Check remove_comment -+ on ARGP_KEY_SUCCESS. -+ (handle_elf): Handle and sanity check keep_secs and remove_secs. -+ - 2017-06-07 Mark Wielaard - - * strip.c (handle_elf): Introduce new handle_elf boolean. Use it to -diff --git a/src/strip.c b/src/strip.c -index 2bf95f9..4a35ea1 100644 ---- a/src/strip.c -+++ b/src/strip.c -@@ -26,6 +26,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -60,6 +61,7 @@ ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT; - #define OPT_PERMISSIVE 0x101 - #define OPT_STRIP_SECTIONS 0x102 - #define OPT_RELOC_DEBUG 0x103 -+#define OPT_KEEP_SECTION 0x104 - - - /* Definitions of arguments for argp functions. */ -@@ -83,7 +85,8 @@ static const struct argp_option options[] = - N_("Resolve all trivial relocations between debug sections if the removed sections are placed in a debug file (only relevant for ET_REL files, operation is not reversable, needs -f)"), 0 }, - { "remove-comment", OPT_REMOVE_COMMENT, NULL, 0, - N_("Remove .comment section"), 0 }, -- { "remove-section", 'R', "SECTION", OPTION_HIDDEN, NULL, 0 }, -+ { "remove-section", 'R', "SECTION", 0, N_("Remove the named section. SECTION is an extended wildcard pattern. May be given more than once. Only non-allocated sections can be removed."), 0 }, -+ { "keep-section", OPT_KEEP_SECTION, "SECTION", 0, N_("Keep the named section. SECTION is an extended wildcard pattern. May be given more than once."), 0 }, - { "permissive", OPT_PERMISSIVE, NULL, 0, - N_("Relax a few rules to handle slightly broken ELF files"), 0 }, - { NULL, 0, NULL, 0, NULL, 0 } -@@ -157,6 +160,58 @@ static bool permissive; - /* If true perform relocations between debug sections. */ - static bool reloc_debug; - -+/* Sections the user explicitly wants to keep or remove. */ -+struct section_pattern -+{ -+ char *pattern; -+ struct section_pattern *next; -+}; -+ -+static struct section_pattern *keep_secs = NULL; -+static struct section_pattern *remove_secs = NULL; -+ -+static void -+add_pattern (struct section_pattern **patterns, const char *pattern) -+{ -+ struct section_pattern *p = xmalloc (sizeof *p); -+ p->pattern = xstrdup (pattern); -+ p->next = *patterns; -+ *patterns = p; -+} -+ -+static void -+free_sec_patterns (struct section_pattern *patterns) -+{ -+ struct section_pattern *pattern = patterns; -+ while (pattern != NULL) -+ { -+ struct section_pattern *p = pattern; -+ pattern = p->next; -+ free (p->pattern); -+ free (p); -+ } -+} -+ -+static void -+free_patterns (void) -+{ -+ free_sec_patterns (keep_secs); -+ free_sec_patterns (remove_secs); -+} -+ -+static bool -+section_name_matches (struct section_pattern *patterns, const char *name) -+{ -+ struct section_pattern *pattern = patterns; -+ while (pattern != NULL) -+ { -+ if (fnmatch (pattern->pattern, name, FNM_EXTMATCH) == 0) -+ return true; -+ pattern = pattern->next; -+ } -+ return false; -+} -+ - - int - main (int argc, char *argv[]) -@@ -207,6 +262,7 @@ Only one input file allowed together with '-o' and '-f'")); - while (++remaining < argc); - } - -+ free_patterns (); - return result; - } - -@@ -257,14 +313,13 @@ parse_opt (int key, char *arg, struct argp_state *state) - break; - - case 'R': -- if (!strcmp (arg, ".comment")) -+ if (fnmatch (arg, ".comment", FNM_EXTMATCH) == 0) - remove_comment = true; -- else -- { -- argp_error (state, -- gettext ("-R option supports only .comment section")); -- return EINVAL; -- } -+ add_pattern (&remove_secs, arg); -+ break; -+ -+ case OPT_KEEP_SECTION: -+ add_pattern (&keep_secs, arg); - break; - - case 'g': -@@ -284,6 +339,16 @@ parse_opt (int key, char *arg, struct argp_state *state) - case 's': /* Ignored for compatibility. */ - break; - -+ case ARGP_KEY_SUCCESS: -+ if (remove_comment == true -+ && section_name_matches (keep_secs, ".comment")) -+ { -+ argp_error (state, -+ gettext ("cannot both keep and remove .comment section")); -+ return EINVAL; -+ } -+ break; -+ - default: - return ARGP_ERR_UNKNOWN; - } -@@ -622,6 +687,28 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - goto fail_close; - } - -+ /* Sanity check the user. */ -+ if (section_name_matches (remove_secs, shdr_info[cnt].name)) -+ { -+ if ((shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) != 0) -+ { -+ error (0, 0, -+ gettext ("Cannot remove allocated section '%s'"), -+ shdr_info[cnt].name); -+ result = 1; -+ goto fail_close; -+ } -+ -+ if (section_name_matches (keep_secs, shdr_info[cnt].name)) -+ { -+ error (0, 0, -+ gettext ("Cannot both keep and remove section '%s'"), -+ shdr_info[cnt].name); -+ result = 1; -+ goto fail_close; -+ } -+ } -+ - /* Mark them as present but not yet investigated. */ - shdr_info[cnt].idx = 1; - -@@ -709,6 +796,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - know how to handle them - - if a section is referred to from a section which is not removed - in the sh_link or sh_info element it cannot be removed either -+ - the user might have explicitly said to remove or keep a section - */ - for (cnt = 1; cnt < shnum; ++cnt) - /* Check whether the section can be removed. Since we will create -@@ -717,8 +805,13 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - : (ebl_section_strip_p (ebl, ehdr, &shdr_info[cnt].shdr, - shdr_info[cnt].name, remove_comment, - remove_debug) -- || cnt == ehdr->e_shstrndx)) -+ || cnt == ehdr->e_shstrndx -+ || section_name_matches (remove_secs, shdr_info[cnt].name))) - { -+ /* The user might want to explicitly keep this one. */ -+ if (section_name_matches (keep_secs, shdr_info[cnt].name)) -+ continue; -+ - /* For now assume this section will be removed. */ - shdr_info[cnt].idx = 0; - -@@ -2174,14 +2267,14 @@ while computing checksum for debug information")); - if (shdr_info != NULL) - { - /* For some sections we might have created an table to map symbol -- table indices. */ -- if (any_symtab_changes) -- for (cnt = 1; cnt <= shdridx; ++cnt) -- { -- free (shdr_info[cnt].newsymidx); -- if (shdr_info[cnt].debug_data != NULL) -- free (shdr_info[cnt].debug_data->d_buf); -- } -+ table indices. Or we might kept (original) data around to put -+ into the .debug file. */ -+ for (cnt = 1; cnt <= shdridx; ++cnt) -+ { -+ free (shdr_info[cnt].newsymidx); -+ if (shdr_info[cnt].debug_data != NULL) -+ free (shdr_info[cnt].debug_data->d_buf); -+ } - - /* Free data we allocated for the .gnu_debuglink section. */ - free (debuglink_buf); -diff --git a/tests/ChangeLog b/tests/ChangeLog -index ecf6263..3dd6f2a 100644 ---- a/tests/ChangeLog -+++ b/tests/ChangeLog -@@ -1,3 +1,9 @@ -+2017-07-14 Mark Wielaard -+ -+ * run-strip-remove-keep.sh: New test. -+ * Makefile.am (TESTS): Add run-strip-remove-keep.sh. -+ (EXTRA_DIST): Likewise. -+ - 2017-06-07 Mark Wielaard - - * run-strip-nothing.sh: New test. -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 0aa16da..7fd4b21 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -83,7 +83,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ - run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ - run-strip-nothing.sh \ - run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ -- run-strip-nobitsalign.sh \ -+ run-strip-nobitsalign.sh run-strip-remove-keep.sh \ - run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-test3.sh \ - run-unstrip-test4.sh run-unstrip-M.sh run-elfstrmerge-test.sh \ - run-ecp-test.sh run-ecp-test2.sh run-alldts.sh \ -@@ -176,7 +176,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ - run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ - run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ - run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ -- run-strip-nothing.sh \ -+ run-strip-nothing.sh run-strip-remove-keep.sh \ - run-strip-strmerge.sh run-strip-nobitsalign.sh \ - testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ - run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ -diff --git a/tests/run-strip-remove-keep.sh b/tests/run-strip-remove-keep.sh -new file mode 100755 -index 0000000..92647fa ---- /dev/null -+++ b/tests/run-strip-remove-keep.sh -@@ -0,0 +1,688 @@ -+#! /bin/sh -+# Copyright (C) 2017 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 -+ -+# strip -o output and -f debug files -+tempfiles testfile.elf testfile.debug -+ -+# A random 32bit testfile -+testfiles testfile -+ -+# Explicitly keep .strtab (but not .symtab, so .strtab will be in both). 32bit -+echo strip --keep-section=.strtab testfile -+testrun ${abs_top_builddir}/src/strip --keep-section=.strtab -o testfile.elf -f testfile.debug testfile -+echo elflint testfile.elf -+testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf -+echo elflint testfile.debug -+testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug -+echo readelf testfile.elf -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF -+There are 27 section headers, starting at offset 0xaf8: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 00000000 000000 000000 0 0 0 0 -+[ 1] .interp PROGBITS 080480f4 0000f4 000013 0 A 0 0 1 -+[ 2] .note.ABI-tag NOTE 08048108 000108 000020 0 A 0 0 4 -+[ 3] .hash HASH 08048128 000128 000030 4 A 4 0 4 -+[ 4] .dynsym DYNSYM 08048158 000158 000070 16 A 5 1 4 -+[ 5] .dynstr STRTAB 080481c8 0001c8 00008e 0 A 0 0 1 -+[ 6] .gnu.version GNU_versym 08048256 000256 00000e 2 A 4 0 2 -+[ 7] .gnu.version_r GNU_verneed 08048264 000264 000030 0 A 5 1 4 -+[ 8] .rel.got REL 08048294 000294 000008 8 A 4 19 4 -+[ 9] .rel.plt REL 0804829c 00029c 000020 8 A 4 11 4 -+[10] .init PROGBITS 080482bc 0002bc 000018 0 AX 0 0 4 -+[11] .plt PROGBITS 080482d4 0002d4 000050 4 AX 0 0 4 -+[12] .text PROGBITS 08048330 000330 00018c 0 AX 0 0 16 -+[13] .fini PROGBITS 080484bc 0004bc 00001e 0 AX 0 0 4 -+[14] .rodata PROGBITS 080484dc 0004dc 000008 0 A 0 0 4 -+[15] .data PROGBITS 080494e4 0004e4 000010 0 WA 0 0 4 -+[16] .eh_frame PROGBITS 080494f4 0004f4 000004 0 WA 0 0 4 -+[17] .ctors PROGBITS 080494f8 0004f8 000008 0 WA 0 0 4 -+[18] .dtors PROGBITS 08049500 000500 000008 0 WA 0 0 4 -+[19] .got PROGBITS 08049508 000508 000020 4 WA 0 0 4 -+[20] .dynamic DYNAMIC 08049528 000528 0000a0 8 WA 5 0 4 -+[21] .bss NOBITS 080495c8 0005c8 00001c 0 WA 0 0 4 -+[22] .comment PROGBITS 00000000 0005c8 000170 0 0 0 1 -+[23] .note NOTE 00000000 000738 0000a0 0 0 0 1 -+[24] .strtab STRTAB 00000000 0007d8 000235 0 0 0 1 -+[25] .gnu_debuglink PROGBITS 00000000 000a10 000014 0 0 0 4 -+[26] .shstrtab STRTAB 00000000 000a24 0000d1 0 0 0 1 -+ -+EOF -+echo readelf testfile.debug -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF -+There are 35 section headers, starting at offset 0x463c: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 00000000 000000 000000 0 0 0 0 -+[ 1] .interp NOBITS 080480f4 0000f4 000013 0 A 0 0 1 -+[ 2] .note.ABI-tag NOTE 08048108 0000f4 000020 0 A 0 0 4 -+[ 3] .hash NOBITS 08048128 000114 000030 4 A 4 0 4 -+[ 4] .dynsym NOBITS 08048158 000114 000070 16 A 5 1 4 -+[ 5] .dynstr NOBITS 080481c8 000114 00008e 0 A 0 0 1 -+[ 6] .gnu.version NOBITS 08048256 000114 00000e 2 A 4 0 2 -+[ 7] .gnu.version_r NOBITS 08048264 000114 000030 0 A 5 1 4 -+[ 8] .rel.got NOBITS 08048294 000114 000008 8 A 4 19 4 -+[ 9] .rel.plt NOBITS 0804829c 000114 000020 8 A 4 11 4 -+[10] .init NOBITS 080482bc 000114 000018 0 AX 0 0 4 -+[11] .plt NOBITS 080482d4 000114 000050 4 AX 0 0 4 -+[12] .text NOBITS 08048330 000120 00018c 0 AX 0 0 16 -+[13] .fini NOBITS 080484bc 000120 00001e 0 AX 0 0 4 -+[14] .rodata NOBITS 080484dc 000120 000008 0 A 0 0 4 -+[15] .data NOBITS 080494e4 000120 000010 0 WA 0 0 4 -+[16] .eh_frame NOBITS 080494f4 000120 000004 0 WA 0 0 4 -+[17] .ctors NOBITS 080494f8 000120 000008 0 WA 0 0 4 -+[18] .dtors NOBITS 08049500 000120 000008 0 WA 0 0 4 -+[19] .got NOBITS 08049508 000120 000020 4 WA 0 0 4 -+[20] .dynamic NOBITS 08049528 000120 0000a0 8 WA 5 0 4 -+[21] .sbss PROGBITS 080495c8 000120 000000 0 W 0 0 1 -+[22] .bss NOBITS 080495c8 000120 00001c 0 WA 0 0 4 -+[23] .stab PROGBITS 00000000 000120 000720 12 24 0 4 -+[24] .stabstr STRTAB 00000000 000840 001934 0 0 0 1 -+[25] .comment NOBITS 00000000 002174 000170 0 0 0 1 -+[26] .debug_aranges PROGBITS 00000000 002174 000060 0 0 0 1 -+[27] .debug_pubnames PROGBITS 00000000 0021d4 000055 0 0 0 1 -+[28] .debug_info PROGBITS 00000000 002229 001678 0 0 0 1 -+[29] .debug_abbrev PROGBITS 00000000 0038a1 0001d2 0 0 0 1 -+[30] .debug_line PROGBITS 00000000 003a73 000223 0 0 0 1 -+[31] .note NOTE 00000000 003c96 0000a0 0 0 0 1 -+[32] .shstrtab STRTAB 00000000 003d36 00012e 0 0 0 1 -+[33] .symtab SYMTAB 00000000 003e64 0005a0 16 34 68 4 -+[34] .strtab STRTAB 00000000 004404 000235 0 0 0 1 -+ -+EOF -+ -+# Explicitly keep .symtab (pulls in .strtab, so they will both be in elf). 32bit -+echo strip --keep-section=.symtab testfile -+testrun ${abs_top_builddir}/src/strip --keep-section=.symtab -o testfile.elf -f testfile.debug testfile -+echo elflint testfile.elf -+testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf -+echo elflint testfile.debug -+testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug -+echo readelf testfile.elf -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF -+There are 28 section headers, starting at offset 0x1010: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 00000000 000000 000000 0 0 0 0 -+[ 1] .interp PROGBITS 080480f4 0000f4 000013 0 A 0 0 1 -+[ 2] .note.ABI-tag NOTE 08048108 000108 000020 0 A 0 0 4 -+[ 3] .hash HASH 08048128 000128 000030 4 A 4 0 4 -+[ 4] .dynsym DYNSYM 08048158 000158 000070 16 A 5 1 4 -+[ 5] .dynstr STRTAB 080481c8 0001c8 00008e 0 A 0 0 1 -+[ 6] .gnu.version GNU_versym 08048256 000256 00000e 2 A 4 0 2 -+[ 7] .gnu.version_r GNU_verneed 08048264 000264 000030 0 A 5 1 4 -+[ 8] .rel.got REL 08048294 000294 000008 8 A 4 19 4 -+[ 9] .rel.plt REL 0804829c 00029c 000020 8 A 4 11 4 -+[10] .init PROGBITS 080482bc 0002bc 000018 0 AX 0 0 4 -+[11] .plt PROGBITS 080482d4 0002d4 000050 4 AX 0 0 4 -+[12] .text PROGBITS 08048330 000330 00018c 0 AX 0 0 16 -+[13] .fini PROGBITS 080484bc 0004bc 00001e 0 AX 0 0 4 -+[14] .rodata PROGBITS 080484dc 0004dc 000008 0 A 0 0 4 -+[15] .data PROGBITS 080494e4 0004e4 000010 0 WA 0 0 4 -+[16] .eh_frame PROGBITS 080494f4 0004f4 000004 0 WA 0 0 4 -+[17] .ctors PROGBITS 080494f8 0004f8 000008 0 WA 0 0 4 -+[18] .dtors PROGBITS 08049500 000500 000008 0 WA 0 0 4 -+[19] .got PROGBITS 08049508 000508 000020 4 WA 0 0 4 -+[20] .dynamic DYNAMIC 08049528 000528 0000a0 8 WA 5 0 4 -+[21] .bss NOBITS 080495c8 0005c8 00001c 0 WA 0 0 4 -+[22] .comment PROGBITS 00000000 0005c8 000170 0 0 0 1 -+[23] .note NOTE 00000000 000738 0000a0 0 0 0 1 -+[24] .symtab SYMTAB 00000000 0007d8 000510 16 25 59 4 -+[25] .strtab STRTAB 00000000 000ce8 000235 0 0 0 1 -+[26] .gnu_debuglink PROGBITS 00000000 000f20 000014 0 0 0 4 -+[27] .shstrtab STRTAB 00000000 000f34 0000d9 0 0 0 1 -+ -+EOF -+echo readelf testfile.debug -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF -+There are 35 section headers, starting at offset 0x3e64: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 00000000 000000 000000 0 0 0 0 -+[ 1] .interp NOBITS 080480f4 0000f4 000013 0 A 0 0 1 -+[ 2] .note.ABI-tag NOTE 08048108 0000f4 000020 0 A 0 0 4 -+[ 3] .hash NOBITS 08048128 000114 000030 4 A 4 0 4 -+[ 4] .dynsym NOBITS 08048158 000114 000070 16 A 5 1 4 -+[ 5] .dynstr NOBITS 080481c8 000114 00008e 0 A 0 0 1 -+[ 6] .gnu.version NOBITS 08048256 000114 00000e 2 A 4 0 2 -+[ 7] .gnu.version_r NOBITS 08048264 000114 000030 0 A 5 1 4 -+[ 8] .rel.got NOBITS 08048294 000114 000008 8 A 4 19 4 -+[ 9] .rel.plt NOBITS 0804829c 000114 000020 8 A 4 11 4 -+[10] .init NOBITS 080482bc 000114 000018 0 AX 0 0 4 -+[11] .plt NOBITS 080482d4 000114 000050 4 AX 0 0 4 -+[12] .text NOBITS 08048330 000120 00018c 0 AX 0 0 16 -+[13] .fini NOBITS 080484bc 000120 00001e 0 AX 0 0 4 -+[14] .rodata NOBITS 080484dc 000120 000008 0 A 0 0 4 -+[15] .data NOBITS 080494e4 000120 000010 0 WA 0 0 4 -+[16] .eh_frame NOBITS 080494f4 000120 000004 0 WA 0 0 4 -+[17] .ctors NOBITS 080494f8 000120 000008 0 WA 0 0 4 -+[18] .dtors NOBITS 08049500 000120 000008 0 WA 0 0 4 -+[19] .got NOBITS 08049508 000120 000020 4 WA 0 0 4 -+[20] .dynamic NOBITS 08049528 000120 0000a0 8 WA 5 0 4 -+[21] .sbss PROGBITS 080495c8 000120 000000 0 W 0 0 1 -+[22] .bss NOBITS 080495c8 000120 00001c 0 WA 0 0 4 -+[23] .stab PROGBITS 00000000 000120 000720 12 24 0 4 -+[24] .stabstr STRTAB 00000000 000840 001934 0 0 0 1 -+[25] .comment NOBITS 00000000 002174 000170 0 0 0 1 -+[26] .debug_aranges PROGBITS 00000000 002174 000060 0 0 0 1 -+[27] .debug_pubnames PROGBITS 00000000 0021d4 000055 0 0 0 1 -+[28] .debug_info PROGBITS 00000000 002229 001678 0 0 0 1 -+[29] .debug_abbrev PROGBITS 00000000 0038a1 0001d2 0 0 0 1 -+[30] .debug_line PROGBITS 00000000 003a73 000223 0 0 0 1 -+[31] .note NOTE 00000000 003c96 0000a0 0 0 0 1 -+[32] .shstrtab STRTAB 00000000 003d36 00012e 0 0 0 1 -+[33] .symtab NOBITS 00000000 003e64 0005a0 16 34 68 4 -+[34] .strtab NOBITS 00000000 003e64 000235 0 0 0 1 -+ -+EOF -+ -+# A random 64bit testfile -+testfiles testfile69.so -+# Explicitly keep .strtab (but not .symtab, so .strtab will be in both). 64bit -+echo strip --keep-section=.strtab testfile69.so -+testrun ${abs_top_builddir}/src/strip --keep-section=.strtab -o testfile.elf -f testfile.debug testfile69.so -+echo elflint testfile.elf -+testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf -+echo elflint testfile.debug -+testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug -+echo readelf testfile.elf -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF -+There are 27 section headers, starting at offset 0xad8: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 -+[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 -+[ 2] .gnu.hash GNU_HASH 00000000000001b8 000001b8 0000003c 0 A 3 0 8 -+[ 3] .dynsym DYNSYM 00000000000001f8 000001f8 00000108 24 A 4 2 8 -+[ 4] .dynstr STRTAB 0000000000000300 00000300 00000077 0 A 0 0 1 -+[ 5] .gnu.version GNU_versym 0000000000000378 00000378 00000016 2 A 3 0 2 -+[ 6] .gnu.version_r GNU_verneed 0000000000000390 00000390 00000020 0 A 4 1 8 -+[ 7] .rela.dyn RELA 00000000000003b0 000003b0 00000060 24 A 3 0 8 -+[ 8] .rela.plt RELA 0000000000000410 00000410 00000018 24 A 3 10 8 -+[ 9] .init PROGBITS 0000000000000428 00000428 00000018 0 AX 0 0 4 -+[10] .plt PROGBITS 0000000000000440 00000440 00000020 16 AX 0 0 16 -+[11] .text PROGBITS 0000000000000460 00000460 00000128 0 AX 0 0 16 -+[12] .fini PROGBITS 0000000000000588 00000588 0000000e 0 AX 0 0 4 -+[13] .eh_frame_hdr PROGBITS 0000000000000598 00000598 00000024 0 A 0 0 4 -+[14] .eh_frame PROGBITS 00000000000005c0 000005c0 00000084 0 A 0 0 8 -+[15] .ctors PROGBITS 0000000000200648 00000648 00000010 0 WA 0 0 8 -+[16] .dtors PROGBITS 0000000000200658 00000658 00000010 0 WA 0 0 8 -+[17] .jcr PROGBITS 0000000000200668 00000668 00000008 0 WA 0 0 8 -+[18] .data.rel.ro PROGBITS 0000000000200670 00000670 00000008 0 WA 0 0 8 -+[19] .dynamic DYNAMIC 0000000000200678 00000678 00000180 16 WA 4 0 8 -+[20] .got PROGBITS 00000000002007f8 000007f8 00000018 8 WA 0 0 8 -+[21] .got.plt PROGBITS 0000000000200810 00000810 00000020 8 WA 0 0 8 -+[22] .bss NOBITS 0000000000200830 00000830 00000010 0 WA 0 0 8 -+[23] .comment PROGBITS 0000000000000000 00000830 0000002c 1 MS 0 0 1 -+[24] .strtab STRTAB 0000000000000000 0000085c 00000175 0 0 0 1 -+[25] .gnu_debuglink PROGBITS 0000000000000000 000009d4 00000014 0 0 0 4 -+[26] .shstrtab STRTAB 0000000000000000 000009e8 000000ee 0 0 0 1 -+ -+EOF -+echo readelf testfile.debug -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF -+There are 27 section headers, starting at offset 0x918: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 -+[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 -+[ 2] .gnu.hash NOBITS 00000000000001b8 000001b8 0000003c 0 A 3 0 8 -+[ 3] .dynsym NOBITS 00000000000001f8 000001b8 00000108 24 A 4 2 8 -+[ 4] .dynstr NOBITS 0000000000000300 000001b8 00000077 0 A 0 0 1 -+[ 5] .gnu.version NOBITS 0000000000000378 000001b8 00000016 2 A 3 0 2 -+[ 6] .gnu.version_r NOBITS 0000000000000390 000001b8 00000020 0 A 4 1 8 -+[ 7] .rela.dyn NOBITS 00000000000003b0 000001b8 00000060 24 A 3 0 8 -+[ 8] .rela.plt NOBITS 0000000000000410 000001b8 00000018 24 A 3 10 8 -+[ 9] .init NOBITS 0000000000000428 000001b8 00000018 0 AX 0 0 4 -+[10] .plt NOBITS 0000000000000440 000001c0 00000020 16 AX 0 0 16 -+[11] .text NOBITS 0000000000000460 000001c0 00000128 0 AX 0 0 16 -+[12] .fini NOBITS 0000000000000588 000001c0 0000000e 0 AX 0 0 4 -+[13] .eh_frame_hdr NOBITS 0000000000000598 000001c0 00000024 0 A 0 0 4 -+[14] .eh_frame NOBITS 00000000000005c0 000001c0 00000084 0 A 0 0 8 -+[15] .ctors NOBITS 0000000000200648 000001c0 00000010 0 WA 0 0 8 -+[16] .dtors NOBITS 0000000000200658 000001c0 00000010 0 WA 0 0 8 -+[17] .jcr NOBITS 0000000000200668 000001c0 00000008 0 WA 0 0 8 -+[18] .data.rel.ro NOBITS 0000000000200670 000001c0 00000008 0 WA 0 0 8 -+[19] .dynamic NOBITS 0000000000200678 000001c0 00000180 16 WA 4 0 8 -+[20] .got NOBITS 00000000002007f8 000001c0 00000018 8 WA 0 0 8 -+[21] .got.plt NOBITS 0000000000200810 000001c0 00000020 8 WA 0 0 8 -+[22] .bss NOBITS 0000000000200830 000001c0 00000010 0 WA 0 0 8 -+[23] .comment NOBITS 0000000000000000 000001c0 0000002c 1 MS 0 0 1 -+[24] .shstrtab STRTAB 0000000000000000 000001c0 000000e7 0 0 0 1 -+[25] .symtab SYMTAB 0000000000000000 000002a8 000004f8 24 26 44 8 -+[26] .strtab STRTAB 0000000000000000 000007a0 00000175 0 0 0 1 -+ -+EOF -+ -+# Explicitly keep .symtab (pulls in .strtab, so they will both be in elf). 64bit -+# Use --remove-comment to make sure testfile.debug isn't empty. -+echo strip --keep-section=.symtab --remove-comment testfile69.so -+testrun ${abs_top_builddir}/src/strip --keep-section=.symtab --remove-comment -o testfile.elf -f testfile.debug testfile69.so -+echo elflint testfile.elf -+testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf -+echo elflint testfile.debug -+testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug -+echo readelf testfile.elf -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF -+There are 27 section headers, starting at offset 0xf90: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 -+[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 -+[ 2] .gnu.hash GNU_HASH 00000000000001b8 000001b8 0000003c 0 A 3 0 8 -+[ 3] .dynsym DYNSYM 00000000000001f8 000001f8 00000108 24 A 4 2 8 -+[ 4] .dynstr STRTAB 0000000000000300 00000300 00000077 0 A 0 0 1 -+[ 5] .gnu.version GNU_versym 0000000000000378 00000378 00000016 2 A 3 0 2 -+[ 6] .gnu.version_r GNU_verneed 0000000000000390 00000390 00000020 0 A 4 1 8 -+[ 7] .rela.dyn RELA 00000000000003b0 000003b0 00000060 24 A 3 0 8 -+[ 8] .rela.plt RELA 0000000000000410 00000410 00000018 24 A 3 10 8 -+[ 9] .init PROGBITS 0000000000000428 00000428 00000018 0 AX 0 0 4 -+[10] .plt PROGBITS 0000000000000440 00000440 00000020 16 AX 0 0 16 -+[11] .text PROGBITS 0000000000000460 00000460 00000128 0 AX 0 0 16 -+[12] .fini PROGBITS 0000000000000588 00000588 0000000e 0 AX 0 0 4 -+[13] .eh_frame_hdr PROGBITS 0000000000000598 00000598 00000024 0 A 0 0 4 -+[14] .eh_frame PROGBITS 00000000000005c0 000005c0 00000084 0 A 0 0 8 -+[15] .ctors PROGBITS 0000000000200648 00000648 00000010 0 WA 0 0 8 -+[16] .dtors PROGBITS 0000000000200658 00000658 00000010 0 WA 0 0 8 -+[17] .jcr PROGBITS 0000000000200668 00000668 00000008 0 WA 0 0 8 -+[18] .data.rel.ro PROGBITS 0000000000200670 00000670 00000008 0 WA 0 0 8 -+[19] .dynamic DYNAMIC 0000000000200678 00000678 00000180 16 WA 4 0 8 -+[20] .got PROGBITS 00000000002007f8 000007f8 00000018 8 WA 0 0 8 -+[21] .got.plt PROGBITS 0000000000200810 00000810 00000020 8 WA 0 0 8 -+[22] .bss NOBITS 0000000000200830 00000830 00000010 0 WA 0 0 8 -+[23] .symtab SYMTAB 0000000000000000 00000830 000004e0 24 24 43 8 -+[24] .strtab STRTAB 0000000000000000 00000d10 00000175 0 0 0 1 -+[25] .gnu_debuglink PROGBITS 0000000000000000 00000e88 00000014 0 0 0 4 -+[26] .shstrtab STRTAB 0000000000000000 00000e9c 000000ed 0 0 0 1 -+ -+EOF -+echo readelf testfile.debug -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF -+There are 27 section headers, starting at offset 0x2d8: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 -+[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 -+[ 2] .gnu.hash NOBITS 00000000000001b8 000001b8 0000003c 0 A 3 0 8 -+[ 3] .dynsym NOBITS 00000000000001f8 000001b8 00000108 24 A 4 2 8 -+[ 4] .dynstr NOBITS 0000000000000300 000001b8 00000077 0 A 0 0 1 -+[ 5] .gnu.version NOBITS 0000000000000378 000001b8 00000016 2 A 3 0 2 -+[ 6] .gnu.version_r NOBITS 0000000000000390 000001b8 00000020 0 A 4 1 8 -+[ 7] .rela.dyn NOBITS 00000000000003b0 000001b8 00000060 24 A 3 0 8 -+[ 8] .rela.plt NOBITS 0000000000000410 000001b8 00000018 24 A 3 10 8 -+[ 9] .init NOBITS 0000000000000428 000001b8 00000018 0 AX 0 0 4 -+[10] .plt NOBITS 0000000000000440 000001c0 00000020 16 AX 0 0 16 -+[11] .text NOBITS 0000000000000460 000001c0 00000128 0 AX 0 0 16 -+[12] .fini NOBITS 0000000000000588 000001c0 0000000e 0 AX 0 0 4 -+[13] .eh_frame_hdr NOBITS 0000000000000598 000001c0 00000024 0 A 0 0 4 -+[14] .eh_frame NOBITS 00000000000005c0 000001c0 00000084 0 A 0 0 8 -+[15] .ctors NOBITS 0000000000200648 000001c0 00000010 0 WA 0 0 8 -+[16] .dtors NOBITS 0000000000200658 000001c0 00000010 0 WA 0 0 8 -+[17] .jcr NOBITS 0000000000200668 000001c0 00000008 0 WA 0 0 8 -+[18] .data.rel.ro NOBITS 0000000000200670 000001c0 00000008 0 WA 0 0 8 -+[19] .dynamic NOBITS 0000000000200678 000001c0 00000180 16 WA 4 0 8 -+[20] .got NOBITS 00000000002007f8 000001c0 00000018 8 WA 0 0 8 -+[21] .got.plt NOBITS 0000000000200810 000001c0 00000020 8 WA 0 0 8 -+[22] .bss NOBITS 0000000000200830 000001c0 00000010 0 WA 0 0 8 -+[23] .comment PROGBITS 0000000000000000 000001c0 0000002c 1 MS 0 0 1 -+[24] .shstrtab STRTAB 0000000000000000 000001ec 000000e7 0 0 0 1 -+[25] .symtab NOBITS 0000000000000000 000002d8 000004f8 24 26 44 8 -+[26] .strtab NOBITS 0000000000000000 000002d8 00000175 0 0 0 1 -+ -+EOF -+ -+# Explicitly remove .symtab (but not .strtab, so it will be in both). 32bit -+echo strip -g --remove-section=.symtab testfile -+testrun ${abs_top_builddir}/src/strip -g --remove-section=.symtab -o testfile.elf -f testfile.debug testfile -+echo elflint testfile.elf -+testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf -+echo elflint testfile.debug -+testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug -+echo readelf testfile.elf -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF -+There are 28 section headers, starting at offset 0xafc: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 00000000 000000 000000 0 0 0 0 -+[ 1] .interp PROGBITS 080480f4 0000f4 000013 0 A 0 0 1 -+[ 2] .note.ABI-tag NOTE 08048108 000108 000020 0 A 0 0 4 -+[ 3] .hash HASH 08048128 000128 000030 4 A 4 0 4 -+[ 4] .dynsym DYNSYM 08048158 000158 000070 16 A 5 1 4 -+[ 5] .dynstr STRTAB 080481c8 0001c8 00008e 0 A 0 0 1 -+[ 6] .gnu.version GNU_versym 08048256 000256 00000e 2 A 4 0 2 -+[ 7] .gnu.version_r GNU_verneed 08048264 000264 000030 0 A 5 1 4 -+[ 8] .rel.got REL 08048294 000294 000008 8 A 4 19 4 -+[ 9] .rel.plt REL 0804829c 00029c 000020 8 A 4 11 4 -+[10] .init PROGBITS 080482bc 0002bc 000018 0 AX 0 0 4 -+[11] .plt PROGBITS 080482d4 0002d4 000050 4 AX 0 0 4 -+[12] .text PROGBITS 08048330 000330 00018c 0 AX 0 0 16 -+[13] .fini PROGBITS 080484bc 0004bc 00001e 0 AX 0 0 4 -+[14] .rodata PROGBITS 080484dc 0004dc 000008 0 A 0 0 4 -+[15] .data PROGBITS 080494e4 0004e4 000010 0 WA 0 0 4 -+[16] .eh_frame PROGBITS 080494f4 0004f4 000004 0 WA 0 0 4 -+[17] .ctors PROGBITS 080494f8 0004f8 000008 0 WA 0 0 4 -+[18] .dtors PROGBITS 08049500 000500 000008 0 WA 0 0 4 -+[19] .got PROGBITS 08049508 000508 000020 4 WA 0 0 4 -+[20] .dynamic DYNAMIC 08049528 000528 0000a0 8 WA 5 0 4 -+[21] .sbss PROGBITS 080495c8 0005c8 000000 0 W 0 0 1 -+[22] .bss NOBITS 080495c8 0005c8 00001c 0 WA 0 0 4 -+[23] .comment PROGBITS 00000000 0005c8 000170 0 0 0 1 -+[24] .note NOTE 00000000 000738 0000a0 0 0 0 1 -+[25] .strtab STRTAB 00000000 0007d8 000235 0 0 0 1 -+[26] .gnu_debuglink PROGBITS 00000000 000a10 000014 0 0 0 4 -+[27] .shstrtab STRTAB 00000000 000a24 0000d7 0 0 0 1 -+ -+EOF -+echo readelf testfile.debug -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF -+There are 35 section headers, starting at offset 0x463c: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 00000000 000000 000000 0 0 0 0 -+[ 1] .interp NOBITS 080480f4 0000f4 000013 0 A 0 0 1 -+[ 2] .note.ABI-tag NOTE 08048108 0000f4 000020 0 A 0 0 4 -+[ 3] .hash NOBITS 08048128 000114 000030 4 A 4 0 4 -+[ 4] .dynsym NOBITS 08048158 000114 000070 16 A 5 1 4 -+[ 5] .dynstr NOBITS 080481c8 000114 00008e 0 A 0 0 1 -+[ 6] .gnu.version NOBITS 08048256 000114 00000e 2 A 4 0 2 -+[ 7] .gnu.version_r NOBITS 08048264 000114 000030 0 A 5 1 4 -+[ 8] .rel.got NOBITS 08048294 000114 000008 8 A 4 19 4 -+[ 9] .rel.plt NOBITS 0804829c 000114 000020 8 A 4 11 4 -+[10] .init NOBITS 080482bc 000114 000018 0 AX 0 0 4 -+[11] .plt NOBITS 080482d4 000114 000050 4 AX 0 0 4 -+[12] .text NOBITS 08048330 000120 00018c 0 AX 0 0 16 -+[13] .fini NOBITS 080484bc 000120 00001e 0 AX 0 0 4 -+[14] .rodata NOBITS 080484dc 000120 000008 0 A 0 0 4 -+[15] .data NOBITS 080494e4 000120 000010 0 WA 0 0 4 -+[16] .eh_frame NOBITS 080494f4 000120 000004 0 WA 0 0 4 -+[17] .ctors NOBITS 080494f8 000120 000008 0 WA 0 0 4 -+[18] .dtors NOBITS 08049500 000120 000008 0 WA 0 0 4 -+[19] .got NOBITS 08049508 000120 000020 4 WA 0 0 4 -+[20] .dynamic NOBITS 08049528 000120 0000a0 8 WA 5 0 4 -+[21] .sbss NOBITS 080495c8 000120 000000 0 W 0 0 1 -+[22] .bss NOBITS 080495c8 000120 00001c 0 WA 0 0 4 -+[23] .stab PROGBITS 00000000 000120 000720 12 24 0 4 -+[24] .stabstr STRTAB 00000000 000840 001934 0 0 0 1 -+[25] .comment NOBITS 00000000 002174 000170 0 0 0 1 -+[26] .debug_aranges PROGBITS 00000000 002174 000060 0 0 0 1 -+[27] .debug_pubnames PROGBITS 00000000 0021d4 000055 0 0 0 1 -+[28] .debug_info PROGBITS 00000000 002229 001678 0 0 0 1 -+[29] .debug_abbrev PROGBITS 00000000 0038a1 0001d2 0 0 0 1 -+[30] .debug_line PROGBITS 00000000 003a73 000223 0 0 0 1 -+[31] .note NOTE 00000000 003c96 0000a0 0 0 0 1 -+[32] .shstrtab STRTAB 00000000 003d36 00012e 0 0 0 1 -+[33] .symtab SYMTAB 00000000 003e64 0005a0 16 34 68 4 -+[34] .strtab STRTAB 00000000 004404 000235 0 0 0 1 -+ -+EOF -+ -+# Explicitly remove both .symtab and .strtab. Keep .stab and .stabstr 32bit -+echo strip -g --remove-section=".s[yt][mr]tab" --keep-section=".stab*" testfile -+testrun ${abs_top_builddir}/src/strip -g --remove-section=".s[yt][mr]tab" --keep-section=".stab*" -o testfile.elf -f testfile.debug testfile -+echo elflint testfile.elf -+testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf -+echo elflint testfile.debug -+testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug -+echo readelf testfile.elf -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF -+There are 29 section headers, starting at offset 0x2920: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 00000000 000000 000000 0 0 0 0 -+[ 1] .interp PROGBITS 080480f4 0000f4 000013 0 A 0 0 1 -+[ 2] .note.ABI-tag NOTE 08048108 000108 000020 0 A 0 0 4 -+[ 3] .hash HASH 08048128 000128 000030 4 A 4 0 4 -+[ 4] .dynsym DYNSYM 08048158 000158 000070 16 A 5 1 4 -+[ 5] .dynstr STRTAB 080481c8 0001c8 00008e 0 A 0 0 1 -+[ 6] .gnu.version GNU_versym 08048256 000256 00000e 2 A 4 0 2 -+[ 7] .gnu.version_r GNU_verneed 08048264 000264 000030 0 A 5 1 4 -+[ 8] .rel.got REL 08048294 000294 000008 8 A 4 19 4 -+[ 9] .rel.plt REL 0804829c 00029c 000020 8 A 4 11 4 -+[10] .init PROGBITS 080482bc 0002bc 000018 0 AX 0 0 4 -+[11] .plt PROGBITS 080482d4 0002d4 000050 4 AX 0 0 4 -+[12] .text PROGBITS 08048330 000330 00018c 0 AX 0 0 16 -+[13] .fini PROGBITS 080484bc 0004bc 00001e 0 AX 0 0 4 -+[14] .rodata PROGBITS 080484dc 0004dc 000008 0 A 0 0 4 -+[15] .data PROGBITS 080494e4 0004e4 000010 0 WA 0 0 4 -+[16] .eh_frame PROGBITS 080494f4 0004f4 000004 0 WA 0 0 4 -+[17] .ctors PROGBITS 080494f8 0004f8 000008 0 WA 0 0 4 -+[18] .dtors PROGBITS 08049500 000500 000008 0 WA 0 0 4 -+[19] .got PROGBITS 08049508 000508 000020 4 WA 0 0 4 -+[20] .dynamic DYNAMIC 08049528 000528 0000a0 8 WA 5 0 4 -+[21] .sbss PROGBITS 080495c8 0005c8 000000 0 W 0 0 1 -+[22] .bss NOBITS 080495c8 0005c8 00001c 0 WA 0 0 4 -+[23] .stab PROGBITS 00000000 0005c8 000720 12 24 0 4 -+[24] .stabstr STRTAB 00000000 000ce8 001934 0 0 0 1 -+[25] .comment PROGBITS 00000000 00261c 000170 0 0 0 1 -+[26] .note NOTE 00000000 00278c 0000a0 0 0 0 1 -+[27] .gnu_debuglink PROGBITS 00000000 00282c 000014 0 0 0 4 -+[28] .shstrtab STRTAB 00000000 002840 0000de 0 0 0 1 -+ -+EOF -+echo readelf testfile.debug -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF -+There are 35 section headers, starting at offset 0x25e8: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 00000000 000000 000000 0 0 0 0 -+[ 1] .interp NOBITS 080480f4 0000f4 000013 0 A 0 0 1 -+[ 2] .note.ABI-tag NOTE 08048108 0000f4 000020 0 A 0 0 4 -+[ 3] .hash NOBITS 08048128 000114 000030 4 A 4 0 4 -+[ 4] .dynsym NOBITS 08048158 000114 000070 16 A 5 1 4 -+[ 5] .dynstr NOBITS 080481c8 000114 00008e 0 A 0 0 1 -+[ 6] .gnu.version NOBITS 08048256 000114 00000e 2 A 4 0 2 -+[ 7] .gnu.version_r NOBITS 08048264 000114 000030 0 A 5 1 4 -+[ 8] .rel.got NOBITS 08048294 000114 000008 8 A 4 19 4 -+[ 9] .rel.plt NOBITS 0804829c 000114 000020 8 A 4 11 4 -+[10] .init NOBITS 080482bc 000114 000018 0 AX 0 0 4 -+[11] .plt NOBITS 080482d4 000114 000050 4 AX 0 0 4 -+[12] .text NOBITS 08048330 000120 00018c 0 AX 0 0 16 -+[13] .fini NOBITS 080484bc 000120 00001e 0 AX 0 0 4 -+[14] .rodata NOBITS 080484dc 000120 000008 0 A 0 0 4 -+[15] .data NOBITS 080494e4 000120 000010 0 WA 0 0 4 -+[16] .eh_frame NOBITS 080494f4 000120 000004 0 WA 0 0 4 -+[17] .ctors NOBITS 080494f8 000120 000008 0 WA 0 0 4 -+[18] .dtors NOBITS 08049500 000120 000008 0 WA 0 0 4 -+[19] .got NOBITS 08049508 000120 000020 4 WA 0 0 4 -+[20] .dynamic NOBITS 08049528 000120 0000a0 8 WA 5 0 4 -+[21] .sbss NOBITS 080495c8 000120 000000 0 W 0 0 1 -+[22] .bss NOBITS 080495c8 000120 00001c 0 WA 0 0 4 -+[23] .stab NOBITS 00000000 000120 000720 12 24 0 4 -+[24] .stabstr NOBITS 00000000 000120 001934 0 0 0 1 -+[25] .comment NOBITS 00000000 000120 000170 0 0 0 1 -+[26] .debug_aranges PROGBITS 00000000 000120 000060 0 0 0 1 -+[27] .debug_pubnames PROGBITS 00000000 000180 000055 0 0 0 1 -+[28] .debug_info PROGBITS 00000000 0001d5 001678 0 0 0 1 -+[29] .debug_abbrev PROGBITS 00000000 00184d 0001d2 0 0 0 1 -+[30] .debug_line PROGBITS 00000000 001a1f 000223 0 0 0 1 -+[31] .note NOTE 00000000 001c42 0000a0 0 0 0 1 -+[32] .shstrtab STRTAB 00000000 001ce2 00012e 0 0 0 1 -+[33] .symtab SYMTAB 00000000 001e10 0005a0 16 34 68 4 -+[34] .strtab STRTAB 00000000 0023b0 000235 0 0 0 1 -+ -+EOF -+ -+# Explicitly remove .symtab (but not .strtab, so it will be in both). 64bit -+echo strip -g --remove-section=.symtab testfile69.so -+testrun ${abs_top_builddir}/src/strip -g --remove-section=.symtab -o testfile.elf -f testfile.debug testfile69.so -+echo elflint testfile.elf -+testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf -+echo elflint testfile.debug -+testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug -+echo readelf testfile.elf -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF -+There are 27 section headers, starting at offset 0xad8: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 -+[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 -+[ 2] .gnu.hash GNU_HASH 00000000000001b8 000001b8 0000003c 0 A 3 0 8 -+[ 3] .dynsym DYNSYM 00000000000001f8 000001f8 00000108 24 A 4 2 8 -+[ 4] .dynstr STRTAB 0000000000000300 00000300 00000077 0 A 0 0 1 -+[ 5] .gnu.version GNU_versym 0000000000000378 00000378 00000016 2 A 3 0 2 -+[ 6] .gnu.version_r GNU_verneed 0000000000000390 00000390 00000020 0 A 4 1 8 -+[ 7] .rela.dyn RELA 00000000000003b0 000003b0 00000060 24 A 3 0 8 -+[ 8] .rela.plt RELA 0000000000000410 00000410 00000018 24 A 3 10 8 -+[ 9] .init PROGBITS 0000000000000428 00000428 00000018 0 AX 0 0 4 -+[10] .plt PROGBITS 0000000000000440 00000440 00000020 16 AX 0 0 16 -+[11] .text PROGBITS 0000000000000460 00000460 00000128 0 AX 0 0 16 -+[12] .fini PROGBITS 0000000000000588 00000588 0000000e 0 AX 0 0 4 -+[13] .eh_frame_hdr PROGBITS 0000000000000598 00000598 00000024 0 A 0 0 4 -+[14] .eh_frame PROGBITS 00000000000005c0 000005c0 00000084 0 A 0 0 8 -+[15] .ctors PROGBITS 0000000000200648 00000648 00000010 0 WA 0 0 8 -+[16] .dtors PROGBITS 0000000000200658 00000658 00000010 0 WA 0 0 8 -+[17] .jcr PROGBITS 0000000000200668 00000668 00000008 0 WA 0 0 8 -+[18] .data.rel.ro PROGBITS 0000000000200670 00000670 00000008 0 WA 0 0 8 -+[19] .dynamic DYNAMIC 0000000000200678 00000678 00000180 16 WA 4 0 8 -+[20] .got PROGBITS 00000000002007f8 000007f8 00000018 8 WA 0 0 8 -+[21] .got.plt PROGBITS 0000000000200810 00000810 00000020 8 WA 0 0 8 -+[22] .bss NOBITS 0000000000200830 00000830 00000010 0 WA 0 0 8 -+[23] .comment PROGBITS 0000000000000000 00000830 0000002c 1 MS 0 0 1 -+[24] .strtab STRTAB 0000000000000000 0000085c 00000175 0 0 0 1 -+[25] .gnu_debuglink PROGBITS 0000000000000000 000009d4 00000014 0 0 0 4 -+[26] .shstrtab STRTAB 0000000000000000 000009e8 000000ee 0 0 0 1 -+ -+EOF -+echo readelf testfile.debug -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF -+There are 27 section headers, starting at offset 0x918: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 -+[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 -+[ 2] .gnu.hash NOBITS 00000000000001b8 000001b8 0000003c 0 A 3 0 8 -+[ 3] .dynsym NOBITS 00000000000001f8 000001b8 00000108 24 A 4 2 8 -+[ 4] .dynstr NOBITS 0000000000000300 000001b8 00000077 0 A 0 0 1 -+[ 5] .gnu.version NOBITS 0000000000000378 000001b8 00000016 2 A 3 0 2 -+[ 6] .gnu.version_r NOBITS 0000000000000390 000001b8 00000020 0 A 4 1 8 -+[ 7] .rela.dyn NOBITS 00000000000003b0 000001b8 00000060 24 A 3 0 8 -+[ 8] .rela.plt NOBITS 0000000000000410 000001b8 00000018 24 A 3 10 8 -+[ 9] .init NOBITS 0000000000000428 000001b8 00000018 0 AX 0 0 4 -+[10] .plt NOBITS 0000000000000440 000001c0 00000020 16 AX 0 0 16 -+[11] .text NOBITS 0000000000000460 000001c0 00000128 0 AX 0 0 16 -+[12] .fini NOBITS 0000000000000588 000001c0 0000000e 0 AX 0 0 4 -+[13] .eh_frame_hdr NOBITS 0000000000000598 000001c0 00000024 0 A 0 0 4 -+[14] .eh_frame NOBITS 00000000000005c0 000001c0 00000084 0 A 0 0 8 -+[15] .ctors NOBITS 0000000000200648 000001c0 00000010 0 WA 0 0 8 -+[16] .dtors NOBITS 0000000000200658 000001c0 00000010 0 WA 0 0 8 -+[17] .jcr NOBITS 0000000000200668 000001c0 00000008 0 WA 0 0 8 -+[18] .data.rel.ro NOBITS 0000000000200670 000001c0 00000008 0 WA 0 0 8 -+[19] .dynamic NOBITS 0000000000200678 000001c0 00000180 16 WA 4 0 8 -+[20] .got NOBITS 00000000002007f8 000001c0 00000018 8 WA 0 0 8 -+[21] .got.plt NOBITS 0000000000200810 000001c0 00000020 8 WA 0 0 8 -+[22] .bss NOBITS 0000000000200830 000001c0 00000010 0 WA 0 0 8 -+[23] .comment NOBITS 0000000000000000 000001c0 0000002c 1 MS 0 0 1 -+[24] .shstrtab STRTAB 0000000000000000 000001c0 000000e7 0 0 0 1 -+[25] .symtab SYMTAB 0000000000000000 000002a8 000004f8 24 26 44 8 -+[26] .strtab STRTAB 0000000000000000 000007a0 00000175 0 0 0 1 -+ -+EOF -+ -+# Explicitly remove both .symtab and .strtab. Keep .comment section. 64bit -+echo strip -g --remove-section=".s[yt][mr]tab" --keep-section=.comment testfile69.so -+testrun ${abs_top_builddir}/src/strip -g --remove-section=".s[yt][mr]tab" --keep-section=.comment -o testfile.elf -f testfile.debug testfile69.so -+echo elflint testfile.elf -+testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf -+echo elflint testfile.debug -+testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug -+echo readelf testfile.elf -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF -+There are 26 section headers, starting at offset 0x958: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 -+[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 -+[ 2] .gnu.hash GNU_HASH 00000000000001b8 000001b8 0000003c 0 A 3 0 8 -+[ 3] .dynsym DYNSYM 00000000000001f8 000001f8 00000108 24 A 4 2 8 -+[ 4] .dynstr STRTAB 0000000000000300 00000300 00000077 0 A 0 0 1 -+[ 5] .gnu.version GNU_versym 0000000000000378 00000378 00000016 2 A 3 0 2 -+[ 6] .gnu.version_r GNU_verneed 0000000000000390 00000390 00000020 0 A 4 1 8 -+[ 7] .rela.dyn RELA 00000000000003b0 000003b0 00000060 24 A 3 0 8 -+[ 8] .rela.plt RELA 0000000000000410 00000410 00000018 24 A 3 10 8 -+[ 9] .init PROGBITS 0000000000000428 00000428 00000018 0 AX 0 0 4 -+[10] .plt PROGBITS 0000000000000440 00000440 00000020 16 AX 0 0 16 -+[11] .text PROGBITS 0000000000000460 00000460 00000128 0 AX 0 0 16 -+[12] .fini PROGBITS 0000000000000588 00000588 0000000e 0 AX 0 0 4 -+[13] .eh_frame_hdr PROGBITS 0000000000000598 00000598 00000024 0 A 0 0 4 -+[14] .eh_frame PROGBITS 00000000000005c0 000005c0 00000084 0 A 0 0 8 -+[15] .ctors PROGBITS 0000000000200648 00000648 00000010 0 WA 0 0 8 -+[16] .dtors PROGBITS 0000000000200658 00000658 00000010 0 WA 0 0 8 -+[17] .jcr PROGBITS 0000000000200668 00000668 00000008 0 WA 0 0 8 -+[18] .data.rel.ro PROGBITS 0000000000200670 00000670 00000008 0 WA 0 0 8 -+[19] .dynamic DYNAMIC 0000000000200678 00000678 00000180 16 WA 4 0 8 -+[20] .got PROGBITS 00000000002007f8 000007f8 00000018 8 WA 0 0 8 -+[21] .got.plt PROGBITS 0000000000200810 00000810 00000020 8 WA 0 0 8 -+[22] .bss NOBITS 0000000000200830 00000830 00000010 0 WA 0 0 8 -+[23] .comment PROGBITS 0000000000000000 00000830 0000002c 1 MS 0 0 1 -+[24] .gnu_debuglink PROGBITS 0000000000000000 0000085c 00000014 0 0 0 4 -+[25] .shstrtab STRTAB 0000000000000000 00000870 000000e6 0 0 0 1 -+ -+EOF -+echo readelf testfile.debug -+testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF -+There are 27 section headers, starting at offset 0x918: -+ -+Section Headers: -+[Nr] Name Type Addr Off Size ES Flags Lk Inf Al -+[ 0] NULL 0000000000000000 00000000 00000000 0 0 0 0 -+[ 1] .note.gnu.build-id NOTE 0000000000000190 00000190 00000024 0 A 0 0 4 -+[ 2] .gnu.hash NOBITS 00000000000001b8 000001b8 0000003c 0 A 3 0 8 -+[ 3] .dynsym NOBITS 00000000000001f8 000001b8 00000108 24 A 4 2 8 -+[ 4] .dynstr NOBITS 0000000000000300 000001b8 00000077 0 A 0 0 1 -+[ 5] .gnu.version NOBITS 0000000000000378 000001b8 00000016 2 A 3 0 2 -+[ 6] .gnu.version_r NOBITS 0000000000000390 000001b8 00000020 0 A 4 1 8 -+[ 7] .rela.dyn NOBITS 00000000000003b0 000001b8 00000060 24 A 3 0 8 -+[ 8] .rela.plt NOBITS 0000000000000410 000001b8 00000018 24 A 3 10 8 -+[ 9] .init NOBITS 0000000000000428 000001b8 00000018 0 AX 0 0 4 -+[10] .plt NOBITS 0000000000000440 000001c0 00000020 16 AX 0 0 16 -+[11] .text NOBITS 0000000000000460 000001c0 00000128 0 AX 0 0 16 -+[12] .fini NOBITS 0000000000000588 000001c0 0000000e 0 AX 0 0 4 -+[13] .eh_frame_hdr NOBITS 0000000000000598 000001c0 00000024 0 A 0 0 4 -+[14] .eh_frame NOBITS 00000000000005c0 000001c0 00000084 0 A 0 0 8 -+[15] .ctors NOBITS 0000000000200648 000001c0 00000010 0 WA 0 0 8 -+[16] .dtors NOBITS 0000000000200658 000001c0 00000010 0 WA 0 0 8 -+[17] .jcr NOBITS 0000000000200668 000001c0 00000008 0 WA 0 0 8 -+[18] .data.rel.ro NOBITS 0000000000200670 000001c0 00000008 0 WA 0 0 8 -+[19] .dynamic NOBITS 0000000000200678 000001c0 00000180 16 WA 4 0 8 -+[20] .got NOBITS 00000000002007f8 000001c0 00000018 8 WA 0 0 8 -+[21] .got.plt NOBITS 0000000000200810 000001c0 00000020 8 WA 0 0 8 -+[22] .bss NOBITS 0000000000200830 000001c0 00000010 0 WA 0 0 8 -+[23] .comment NOBITS 0000000000000000 000001c0 0000002c 1 MS 0 0 1 -+[24] .shstrtab STRTAB 0000000000000000 000001c0 000000e7 0 0 0 1 -+[25] .symtab SYMTAB 0000000000000000 000002a8 000004f8 24 26 44 8 -+[26] .strtab STRTAB 0000000000000000 000007a0 00000175 0 0 0 1 -+ -+EOF -+ -+exit 0 -diff -ur elfutils-0.169.orig/tests/Makefile.in elfutils-0.169/tests/Makefile.in ---- elfutils-0.169.orig/tests/Makefile.in 2017-07-17 11:25:44.681190429 +0200 -+++ elfutils-0.169/tests/Makefile.in 2017-07-17 11:25:56.177935408 +0200 -@@ -140,16 +140,16 @@ - run-strip-test7.sh run-strip-test8.sh run-strip-test9.sh \ - run-strip-test10.sh run-strip-test11.sh run-strip-nothing.sh \ - run-strip-groups.sh run-strip-reloc.sh run-strip-strmerge.sh \ -- run-strip-nobitsalign.sh run-unstrip-test.sh \ -- run-unstrip-test2.sh run-unstrip-test3.sh run-unstrip-test4.sh \ -- run-unstrip-M.sh run-elfstrmerge-test.sh run-ecp-test.sh \ -- run-ecp-test2.sh run-alldts.sh run-elflint-test.sh \ -- run-elflint-self.sh run-ranlib-test.sh run-ranlib-test2.sh \ -- run-ranlib-test3.sh run-ranlib-test4.sh run-addrscopes.sh \ -- run-strings-test.sh run-funcscopes.sh run-find-prologues.sh \ -- run-allregs.sh run-addrcfi.sh run-nm-self.sh \ -- run-readelf-self.sh run-readelf-test1.sh run-readelf-test2.sh \ -- run-readelf-test3.sh run-readelf-test4.sh \ -+ run-strip-nobitsalign.sh run-strip-remove-keep.sh \ -+ run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-test3.sh \ -+ run-unstrip-test4.sh run-unstrip-M.sh run-elfstrmerge-test.sh \ -+ run-ecp-test.sh run-ecp-test2.sh run-alldts.sh \ -+ run-elflint-test.sh run-elflint-self.sh run-ranlib-test.sh \ -+ run-ranlib-test2.sh run-ranlib-test3.sh run-ranlib-test4.sh \ -+ run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \ -+ run-find-prologues.sh run-allregs.sh run-addrcfi.sh \ -+ run-nm-self.sh run-readelf-self.sh run-readelf-test1.sh \ -+ run-readelf-test2.sh run-readelf-test3.sh run-readelf-test4.sh \ - run-readelf-twofiles.sh run-readelf-macro.sh \ - run-readelf-loc.sh run-readelf-aranges.sh run-readelf-line.sh \ - run-readelf-z.sh run-native-test.sh run-bug1-test.sh \ -@@ -1046,7 +1046,7 @@ - run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ - run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \ - run-strip-test9.sh run-strip-test10.sh run-strip-test11.sh \ -- run-strip-nothing.sh \ -+ run-strip-nothing.sh run-strip-remove-keep.sh \ - run-strip-strmerge.sh run-strip-nobitsalign.sh \ - testfile-nobitsalign.bz2 testfile-nobitsalign.strip.bz2 \ - run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \ -@@ -2368,6 +2368,13 @@ - $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ -+ "$$tst" $(AM_TESTS_FD_REDIRECT) -+run-strip-remove-keep.sh.log: run-strip-remove-keep.sh -+ @p='run-strip-remove-keep.sh'; \ -+ b='run-strip-remove-keep.sh'; \ -+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ -+ --log-file $$b.log --trs-file $$b.trs \ -+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) - run-unstrip-test.sh.log: run-unstrip-test.sh - @p='run-unstrip-test.sh'; \ diff --git a/elfutils.spec b/elfutils.spec index ba49f32..6978ad4 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.169 -%global baserelease 8 +Version: 0.170 +%global baserelease 1 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -11,8 +11,8 @@ Release: %{baserelease}%{?dist} %global provide_yama_scope 0 -%if 0%{?fedora} -%global provide_yama_scope (%fedora >= 22) +%if 0%{?fedora} >= 22 || 0%{?rhel} >= 7 +%global provide_yama_scope 1 %endif %global depsuffix %{?_isa}%{!?_isa:-%{_arch}} @@ -20,14 +20,6 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -Patch1: elfutils-0.169-ppc64-fallback-unwinder.patch -Source1: backtrace.ppc64le.fp.exec.bz2 -Source2: backtrace.ppc64le.fp.core.bz2 -Patch2: elfutils-0.169-dup-shstrtab.patch -Patch3: elfutils-0.169-strip-empty.patch -Patch4: elfutils-0.169-strip-keep-remove-section.patch -Patch5: elfutils-0.169-s390x-ptrace.patch -Patch6: elfutils-0.169-strip-data-marker-symbols.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -178,13 +170,6 @@ profiling) of processes. %setup -q # Apply patches -%patch1 -p1 -b .ppc64_unwind -cp %SOURCE1 %SOURCE2 tests/ -%patch2 -p1 -b .shstrtab_dup -%patch3 -p1 -b .strip_empty -%patch4 -p1 -b .strip_keep_remove -%patch5 -p1 -b .s390_ptrace -%patch6 -p1 -b .data_markers find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -315,6 +300,10 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Thu Aug 3 2017 Mark Wielaard - 0.170-1 +- New upstream release. Remove upstreamed patches. +- provide_yama_scope for either fedora >= 22 and rhel >= 7. + * Wed Aug 02 2017 Fedora Release Engineering - 0.169-8 - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild diff --git a/sources b/sources index 6547a41..cc6dd59 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.169.tar.bz2) = 0a81a20bb2aff533d035d6b76f1403437b2e11bce390db57e34b8c26e4b9b3150346d83dddcbfbbdc58063f046ca3223508dba35c6ce88e375d201e7a777a8b9 +SHA512 (elfutils-0.170.tar.bz2) = bcfabe5fc500369bff72794bf060bfeef2f1a66a5bd7d2a1642adb7d54f6431bf48f13d0305433590539f3979188ce649d4fe70382f02c3be2ff24bf4c2d571a From 65aba6bdca1acdd5637665194a528ebbad0449f1 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 2 Nov 2017 16:57:11 +0100 Subject: [PATCH 041/216] 0.170-2 - Config files under /usr/lib/sysctl.d (_sysctldir) aren't %config. Resolves: #1506660 --- elfutils.spec | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 6978ad4..7ac278f 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.170 -%global baserelease 1 +%global baserelease 2 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -296,10 +296,14 @@ rm -rf ${RPM_BUILD_ROOT} %if %{provide_yama_scope} %files default-yama-scope %defattr(-,root,root) -%config(noreplace) %{_sysctldir}/10-default-yama-scope.conf +%{_sysctldir}/10-default-yama-scope.conf %endif %changelog +* Thu Nov 2 2017 Mark Wielaard - 0.170-2 +- Config files under /usr/lib/sysctl.d (_sysctldir) aren't %config (#1506660) + Admin can place the real config file under /etc/sysctl.d as override. + * Thu Aug 3 2017 Mark Wielaard - 0.170-1 - New upstream release. Remove upstreamed patches. - provide_yama_scope for either fedora >= 22 and rhel >= 7. From 8c64f0760d885f5d00e43d3a0acce362c2113539 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 8 Nov 2017 11:24:11 +0100 Subject: [PATCH 042/216] 0.170-3 - Rely on systemd_requires for sysctl_apply default-yama-scope. --- elfutils.spec | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 7ac278f..57f16e6 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.170 -%global baserelease 2 +%global baserelease 3 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -154,6 +154,7 @@ License: GPLv2+ or LGPLv3+ Provides: default-yama-scope BuildArch: noarch # For the sysctl_apply macro +%{?systemd_requires} BuildRequires: systemd >= 215 %description default-yama-scope @@ -216,7 +217,11 @@ rm -rf ${RPM_BUILD_ROOT} %if %{provide_yama_scope} %post default-yama-scope +# Due to circular dependencies might not be installed yet, so double check. +# (systemd -> elfutils-libs -> default-yama-scope -> systemd) +if [ -x /usr/lib/systemd/systemd-sysctl ] ; then %sysctl_apply 10-default-yama-scope.conf +fi %endif %files @@ -300,6 +305,9 @@ rm -rf ${RPM_BUILD_ROOT} %endif %changelog +* Wed Nov 8 2017 Mark Wielaard - 0.170-3 +- Rely on (and check) systemd_requires for sysctl_apply default-yama-scope. + * Thu Nov 2 2017 Mark Wielaard - 0.170-2 - Config files under /usr/lib/sysctl.d (_sysctldir) aren't %config (#1506660) Admin can place the real config file under /etc/sysctl.d as override. From a8d9e8f42f70fb8a761f4c5227bf1af17f72c2c4 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 20 Dec 2017 21:02:03 +0100 Subject: [PATCH 043/216] Add elfutils-0.170-dwarf_aggregate_size.patch. --- elfutils-0.170-dwarf_aggregate_size.patch | 170 ++++++++++++++++++++++ elfutils.spec | 9 +- testfile-sizes3.o.bz2 | Bin 0 -> 1208 bytes 3 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.170-dwarf_aggregate_size.patch create mode 100644 testfile-sizes3.o.bz2 diff --git a/elfutils-0.170-dwarf_aggregate_size.patch b/elfutils-0.170-dwarf_aggregate_size.patch new file mode 100644 index 0000000..895458e --- /dev/null +++ b/elfutils-0.170-dwarf_aggregate_size.patch @@ -0,0 +1,170 @@ +From a2246aaad96e062eb3bab55af9526aaa70adcfd0 Mon Sep 17 00:00:00 2001 +From: Dima Kogan +Date: Fri, 8 Dec 2017 01:45:10 -0800 +Subject: [PATCH 1/2] libdw: dwarf_aggregate_size() works with + multi-dimensional arrays + +If we have a multidimensional array of dimensions (a,b,c) the number of elements +should be a*b*c, but prior to this patch dwarf_aggregate_size() would report +a+b+c instead. + +This patch fixes the bug and adds a test that demonstrates the bug (the test +fails without the functional part of this patch). + +Fixes: https://sourceware.org/bugzilla/show_bug.cgi?id=22546 + +Signed-off-by: Dima Kogan +--- + libdw/ChangeLog | 5 +++++ + libdw/dwarf_aggregate_size.c | 43 ++++++++++++++++++++++--------------------- + tests/ChangeLog | 6 ++++++ + tests/run-aggregate-size.sh | 2 ++ + tests/run-peel-type.sh | 1 + + tests/testfile-sizes3.o.bz2 | Bin 1147 -> 1208 bytes + 6 files changed, 36 insertions(+), 21 deletions(-) + +diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c +index 838468d..3010c0a 100644 +--- a/libdw/dwarf_aggregate_size.c ++++ b/libdw/dwarf_aggregate_size.c +@@ -63,7 +63,7 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, + return -1; + + bool any = false; +- Dwarf_Word total = 0; ++ Dwarf_Word count_total = 1; + do + { + Dwarf_Word count; +@@ -134,34 +134,35 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, + continue; + } + +- /* This is a subrange_type or enumeration_type and we've set COUNT. +- Now determine the stride for this array dimension. */ +- Dwarf_Word stride = eltsize; +- if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_byte_stride, +- attr_mem) != NULL) +- { +- if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) +- return -1; +- } +- else if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_bit_stride, +- attr_mem) != NULL) +- { +- if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) +- return -1; +- if (stride % 8) /* XXX maybe compute in bits? */ +- return -1; +- stride /= 8; +- } ++ count_total *= count; + + any = true; +- total += stride * count; + } + while (INTUSE(dwarf_siblingof) (&child, &child) == 0); + + if (!any) + return -1; + +- *size = total; ++ /* This is a subrange_type or enumeration_type and we've set COUNT. ++ Now determine the stride for this array. */ ++ Dwarf_Word stride = eltsize; ++ if (INTUSE(dwarf_attr_integrate) (die, DW_AT_byte_stride, ++ attr_mem) != NULL) ++ { ++ if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) ++ return -1; ++ } ++ else if (INTUSE(dwarf_attr_integrate) (die, DW_AT_bit_stride, ++ attr_mem) != NULL) ++ { ++ if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) ++ return -1; ++ if (stride % 8) /* XXX maybe compute in bits? */ ++ return -1; ++ stride /= 8; ++ } ++ ++ *size = count_total * stride; + return 0; + } + +diff --git a/tests/run-aggregate-size.sh b/tests/run-aggregate-size.sh +index 42b0742..6d8aa24 100755 +--- a/tests/run-aggregate-size.sh ++++ b/tests/run-aggregate-size.sh +@@ -54,6 +54,7 @@ + # volatile int ia[32]; + # const volatile void * const volatile restrict va[64]; + # struct s sa[8]; ++# double d3d[3][4][5]; + # + # typedef const int foo; + # typedef volatile foo bar; +@@ -98,6 +99,7 @@ ca size 16 + ia size 128 + va size 512 + sa size 128 ++d3d size 480 + f size 4 + b size 4 + EOF +diff --git a/tests/run-peel-type.sh b/tests/run-peel-type.sh +index 7fd96e8..668e316 100755 +--- a/tests/run-peel-type.sh ++++ b/tests/run-peel-type.sh +@@ -55,6 +55,7 @@ ca raw type array_type + ia raw type array_type + va raw type array_type + sa raw type array_type ++d3d raw type array_type + f raw type base_type + b raw type base_type + EOF + +-- +1.8.3.1 + +From c25dc62e59dc42378370602b0d05415a42b051d6 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Mon, 11 Dec 2017 23:58:34 +0100 +Subject: [PATCH 2/2] libdw: dwarf_aggregate_size should not peel the given + DIE. + +Reserve memory for a new DIE first. The caller might not care, but it +isn't really nice to change the DIE the caller gave us. + +See also https://sourceware.org/bugzilla/show_bug.cgi?id=22546#c5 + +Signed-off-by: Mark Wielaard +--- + libdw/ChangeLog | 5 +++++ + libdw/dwarf_aggregate_size.c | 6 +++--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c +index 3010c0a..6e50185 100644 +--- a/libdw/dwarf_aggregate_size.c ++++ b/libdw/dwarf_aggregate_size.c +@@ -199,12 +199,12 @@ aggregate_size (Dwarf_Die *die, Dwarf_Word *size, Dwarf_Die *type_mem) + int + dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size) + { +- Dwarf_Die type_mem; ++ Dwarf_Die die_mem, type_mem; + +- if (INTUSE (dwarf_peel_type) (die, die) != 0) ++ if (INTUSE (dwarf_peel_type) (die, &die_mem) != 0) + return -1; + +- return aggregate_size (die, size, &type_mem); ++ return aggregate_size (&die_mem, size, &type_mem); + } + INTDEF (dwarf_aggregate_size) + OLD_VERSION (dwarf_aggregate_size, ELFUTILS_0.144) +-- +1.8.3.1 + diff --git a/elfutils.spec b/elfutils.spec index 57f16e6..635549e 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.170 -%global baserelease 3 +%global baserelease 4 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,6 +20,8 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches +Patch1: elfutils-0.170-dwarf_aggregate_size.patch +Source1: testfile-sizes3.o.bz2 Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -171,6 +173,8 @@ profiling) of processes. %setup -q # Apply patches +%patch1 -p1 -b .aggregate_size +cp %SOURCE1 tests/ find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -305,6 +309,9 @@ fi %endif %changelog +* Wed Dec 20 2017 Mark Wielaard - 0.170-4 +- Add elfutils-0.170-dwarf_aggregate_size.patch. + * Wed Nov 8 2017 Mark Wielaard - 0.170-3 - Rely on (and check) systemd_requires for sysctl_apply default-yama-scope. diff --git a/testfile-sizes3.o.bz2 b/testfile-sizes3.o.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..863338269bab61fb385344c489d48d1466915b61 GIT binary patch literal 1208 zcmV;p1V{TqT4*^jL0KkKS#6BOfdB+#|L_0*|Nrmj|NqbJ$0`5s-*CW0grxvV07V4= z#YuEo&;$O8fgmQKVWLd}XliXV4Jo|{$vjM$h||>3lRynJ4@5STKx7&K(@dIZ^*v4M zO&SQACR0r@JyX%5c}+CX000Jn00000000004FExt044!3GGxF2m=ggpFiZdd005a7 z34shC5M;m!fJ{u8FaRb5z)VaN00000CPo5aLkIyPA|TR1Jk->A4Npn6GJ1y8(7_rs z(V!328aANF8ZsJa^wA6v=#2sCEv>fvAEl-1JsnyijCVVn;F96iw5rqPe7fD8oTY%# zzkuFvwU@36G3K_Qb9Sag|zst|i=R^b=#SNyh%ugP6%%MroDY)>eBF2GVY8z>^ zA#zxcHJ~$H7_haaFxpbV8FL9XCW(Qu5ipQT9FWH50EP%nnyiM8k?@$e86)x5;K|ab zjRE)de=To@@M38Tdc;E#&wkd|ogxudAm_AcG^Zpl&8cWfutQ+j8P2|N;UJ?)WMH{j zkdUguXf=;74rRSb@MjvmMs8TC%hb};SB$d}XTE5h+iFFPJxFCbzy&paR@UwAE8I|a z>xv}SnwAD>pa%$y@(plQfgqr{x1+1G*MleHd-cI?2p3a%pSs%d=EyV)h8{65&x97d z>cDTWLv8Xn`g=akU54?c+i3h47%y-nOZ)e~&fmHUsODqv5K0UU8IB#yK_fyTqUYo+ z)d?A_7DlSo=IuV-hDwK$z_pp|ywWc)*!}X1qKo}@IdI`&akX%qVS+{otAS{>1hp0Y zbtneMFy6|*&|9z(0}COLj1K0FvK}l(J|&ecc3B9Bj{i?y%G7S#p%iNi46?!k>de^? z3Rs5G!w7B`gxJ+7U0I2THHuOQ(1_YGz6@iwwMq&Y2zO6EVh!zH9mMFImZ>*ZsuLy0 zn3@%twCb_%q@x}3@E3X|(lXKpMNGy8M6IZ*<}a>cyXYroi4JaIBJ!eQ3k4}8G!<+lI=Adwap=bECfTe( zW+rQEQP(u6ongYUT{QX6VtT7#Np6UV8Ib#0Si}K9g8qhj$h|~>RR>A#gn%ZG0P;rC zXb4sTR}i6mh^hs5)i70UnnMDF2qkUMOrr4^D7XnaV83=f7$B8Q&M?G4WL7l;K?{x` z{u*5F#e8Rgc*rV;5Ik9ip@F4bgtMYX0k#wg$ahLQc{34|8S4cHt2PcHrIj$$i66yu zQV^pm;)Dbq17r>Pa;eFUB?r>OOiJ&Q0|>(mpy5@cn3e0WYtS^ZjtF!vE8pbd@yJU2 WN)yF8Z)d&>{}*yaI8cynjKqQ37B1`n literal 0 HcmV?d00001 From 185c1c96978f6c58f6d3381332e4aee7e757fc58 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 3 Feb 2018 13:41:16 +0100 Subject: [PATCH 044/216] Switch to %ldconfig_scriptlets Signed-off-by: Igor Gnatenko --- elfutils.spec | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 635549e..3c4143b 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.170 -%global baserelease 4 +%global baserelease 5 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -208,16 +208,8 @@ install -Dm0644 config/10-default-yama-scope.conf ${RPM_BUILD_ROOT}%{_sysctldir} %check make -s %{?_smp_mflags} check || (cat tests/test-suite.log; false) -%clean -rm -rf ${RPM_BUILD_ROOT} - -%post libs -p /sbin/ldconfig - -%postun libs -p /sbin/ldconfig - -%post libelf -p /sbin/ldconfig - -%postun libelf -p /sbin/ldconfig +%ldconfig_scriptlets libs +%ldconfig_scriptlets libelf %if %{provide_yama_scope} %post default-yama-scope @@ -309,6 +301,9 @@ fi %endif %changelog +* Sat Feb 03 2018 Igor Gnatenko - 0.170-5 +- Switch to %%ldconfig_scriptlets + * Wed Dec 20 2017 Mark Wielaard - 0.170-4 - Add elfutils-0.170-dwarf_aggregate_size.patch. From 4f2489f437c8102516f047b587e4310da44a6997 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 7 Feb 2018 08:18:55 +0000 Subject: [PATCH 045/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_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 3c4143b..eb3b297 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.170 -%global baserelease 5 +%global baserelease 6 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -301,6 +301,9 @@ fi %endif %changelog +* Wed Feb 07 2018 Fedora Release Engineering - 0.170-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + * Sat Feb 03 2018 Igor Gnatenko - 0.170-5 - Switch to %%ldconfig_scriptlets From 58cc02f106f6a7f96c0bc53b79e9b83390eed253 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 9 Feb 2018 09:04:25 +0100 Subject: [PATCH 046/216] Escape macros in %changelog Reference: https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/Y2ZUKK2B7T2IKXPMODNF6HB2O5T5TS6H/ Signed-off-by: Igor Gnatenko --- elfutils.spec | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index eb3b297..e9b2077 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.170 -%global baserelease 6 +%global baserelease 7 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -301,6 +301,9 @@ fi %endif %changelog +* Fri Feb 09 2018 Igor Gnatenko - 0.170-7 +- Escape macros in %%changelog + * Wed Feb 07 2018 Fedora Release Engineering - 0.170-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild @@ -314,7 +317,7 @@ fi - Rely on (and check) systemd_requires for sysctl_apply default-yama-scope. * Thu Nov 2 2017 Mark Wielaard - 0.170-2 -- Config files under /usr/lib/sysctl.d (_sysctldir) aren't %config (#1506660) +- Config files under /usr/lib/sysctl.d (_sysctldir) aren't %%config (#1506660) Admin can place the real config file under /etc/sysctl.d as override. * Thu Aug 3 2017 Mark Wielaard - 0.170-1 @@ -574,7 +577,7 @@ fi * Mon Aug 27 2012 Mark Wielaard - 0.155-1 - Update to 0.155. - - #844270 - eu-nm invalid %N$ use detected. + - #844270 - eu-nm invalid %%N$ use detected. - #847454 - Ukrainian translation update. - Removed local ar 64-bit symbol patch, dwz support patch and xlatetom fix. From 9017c8b7aa76278b6ec74f7c6515e257cd329371 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 15 Feb 2018 16:13:19 +0100 Subject: [PATCH 047/216] Add elfutils-0.170-sys-ptrace.patch --- elfutils-0.170-sys-ptrace.patch | 113 ++++++++++++++++++++++++++++++++ elfutils.spec | 5 ++ 2 files changed, 118 insertions(+) create mode 100644 elfutils-0.170-sys-ptrace.patch diff --git a/elfutils-0.170-sys-ptrace.patch b/elfutils-0.170-sys-ptrace.patch new file mode 100644 index 0000000..68eb415 --- /dev/null +++ b/elfutils-0.170-sys-ptrace.patch @@ -0,0 +1,113 @@ +commit 4482d0009a99b1773f2426479b666b08f57af9d5 +Author: Mark Wielaard +Date: Thu Feb 15 14:44:18 2018 +0100 + + Include sys/ptrace.h as early as possible. + + On some systems, at least on Fedora 27 ppc64le with glibc 2.26-24 and + kernel 4.14.18-300, including sys/ptrace.h late (after signal.h or + sys/wait.h for example) will cause issues and produce errors like: + + In file included from /usr/include/asm/sigcontext.h:12:0, + from /usr/include/bits/sigcontext.h:30, + from /usr/include/signal.h:287, + from /usr/include/sys/wait.h:36, + from linux-pid-attach.c:38: + /usr/include/sys/ptrace.h:73:3: error: expected identifier before numeric constant + PTRACE_GETREGS = 12, + ^ + + Swapping the include order fixes these issues. + + Signed-off-by: Mark Wielaard + +diff --git a/backends/ppc_initreg.c b/backends/ppc_initreg.c +index 69d623b..3e4432f 100644 +--- a/backends/ppc_initreg.c ++++ b/backends/ppc_initreg.c +@@ -30,13 +30,14 @@ + # include + #endif + +-#include "system.h" + #include + #if defined(__powerpc__) && defined(__linux__) +-# include + # include ++# include + #endif + ++#include "system.h" ++ + #define BACKEND ppc_ + #include "libebl_CPU.h" + +diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c +index e6a5c41..2ab4109 100644 +--- a/libdwfl/linux-pid-attach.c ++++ b/libdwfl/linux-pid-attach.c +@@ -35,7 +35,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -43,6 +42,7 @@ + + #include + #include ++#include + + static bool + linux_proc_pid_is_stopped (pid_t pid) +diff --git a/tests/backtrace-child.c b/tests/backtrace-child.c +index 2c27414..9c6ba94 100644 +--- a/tests/backtrace-child.c ++++ b/tests/backtrace-child.c +@@ -81,7 +81,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -100,6 +99,7 @@ main (int argc __attribute__ ((unused)), char **argv) + + #else /* __linux__ */ + #include ++#include + + #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + #define NOINLINE_NOCLONE __attribute__ ((noinline, noclone)) +diff --git a/tests/backtrace-dwarf.c b/tests/backtrace-dwarf.c +index 2dc8a9a..7ff826c 100644 +--- a/tests/backtrace-dwarf.c ++++ b/tests/backtrace-dwarf.c +@@ -17,7 +17,6 @@ + + #include + #include +-#include + #include + #include + #include +@@ -25,7 +24,6 @@ + #include + #include + #include +-#include + #include ELFUTILS_HEADER(dwfl) + + #ifndef __linux__ +@@ -40,6 +38,8 @@ main (int argc __attribute__ ((unused)), char **argv) + + #else /* __linux__ */ + #include ++#include ++#include + + #define main cleanup_13_main + #include "cleanup-13.c" diff --git a/elfutils.spec b/elfutils.spec index e9b2077..95fb870 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -22,6 +22,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches Patch1: elfutils-0.170-dwarf_aggregate_size.patch Source1: testfile-sizes3.o.bz2 +Patch2: elfutils-0.170-sys-ptrace.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -175,6 +176,7 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .aggregate_size cp %SOURCE1 tests/ +%patch2 -p1 -b .sys_ptrace find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -301,6 +303,9 @@ fi %endif %changelog +* Thu Feb 15 2018 Mark Wielaard +- Add elfutils-0.170-sys-ptrace.patch + * Fri Feb 09 2018 Igor Gnatenko - 0.170-7 - Escape macros in %%changelog From 22ac7952177342aea0f0d4f0f783118b4884d242 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 15 Feb 2018 17:17:26 +0100 Subject: [PATCH 048/216] Make sure spec can be build even when ldconfig_scriplets aren't defined. --- elfutils.spec | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/elfutils.spec b/elfutils.spec index 95fb870..ae87dd9 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -210,8 +210,17 @@ install -Dm0644 config/10-default-yama-scope.conf ${RPM_BUILD_ROOT}%{_sysctldir} %check make -s %{?_smp_mflags} check || (cat tests/test-suite.log; false) +# Only the latest Fedora and EPEL have these scriptlets, +# older Fedora and plain RHEL don't. +%if 0%{?ldconfig_scriptlets:1} %ldconfig_scriptlets libs %ldconfig_scriptlets libelf +%else +%post libs -p /sbin/ldconfig +%postun libs -p /sbin/ldconfig +%post libelf -p /sbin/ldconfig +%postun libelf -p /sbin/ldconfig +%endif %if %{provide_yama_scope} %post default-yama-scope @@ -305,6 +314,7 @@ fi %changelog * Thu Feb 15 2018 Mark Wielaard - Add elfutils-0.170-sys-ptrace.patch +- Make sure spec can be build even when ldconfig_scriplets aren't defined. * Fri Feb 09 2018 Igor Gnatenko - 0.170-7 - Escape macros in %%changelog From 0f874e353de65e4d26833cf328a695359b0d41ba Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 15 Feb 2018 17:20:57 +0100 Subject: [PATCH 049/216] Add elfutils-0.170-m68k-packed-not-aligned.patch --- elfutils-0.170-m68k-packed-not-aligned.patch | 67 ++++++++++++++++++++ elfutils.spec | 3 + 2 files changed, 70 insertions(+) create mode 100644 elfutils-0.170-m68k-packed-not-aligned.patch diff --git a/elfutils-0.170-m68k-packed-not-aligned.patch b/elfutils-0.170-m68k-packed-not-aligned.patch new file mode 100644 index 0000000..d19426a --- /dev/null +++ b/elfutils-0.170-m68k-packed-not-aligned.patch @@ -0,0 +1,67 @@ +commit ab6b37ac32ddf2f2f11f800a770170814f5cbb8b +Author: Mark Wielaard +Date: Tue Oct 24 14:23:30 2017 +0200 + + backends: Ignore GCC8 -Wpacked-not-aligned for m68k_corenote.c. + + The GCC8 -Wpacked-not-aligned warns if a structure field with explicit + padding in a packed structure will be misaligned. m68k prstatus core + notes are described by a packed structure which has such aligned structure + fields. + + Signed-off-by: Mark Wielaard + +diff --git a/backends/Makefile.am b/backends/Makefile.am +index 0fde0cb..2c62add 100644 +--- a/backends/Makefile.am ++++ b/backends/Makefile.am +@@ -119,6 +119,13 @@ m68k_SRCS = m68k_init.c m68k_symbol.c m68k_regs.c \ + libebl_m68k_pic_a_SOURCES = $(m68k_SRCS) + am_libebl_m68k_pic_a_OBJECTS = $(m68k_SRCS:.c=.os) + ++# m68k prstatus core notes are described by a packed structure ++# which has not naturally aligned fields. Since we don't access ++# these fields directly, but take their offset to be used later ++# to extract the data through elfxx_xlatetom/memmove, this isn't ++# an issue. ++m68k_corenote_no_Wpacked_not_aligned = yes ++ + bpf_SRCS = bpf_init.c bpf_regs.c + cpu_bpf = ../libcpu/libcpu_bpf.a + libebl_bpf_pic_a_SOURCES = $(bpf_SRCS) +diff --git a/config/eu.am b/config/eu.am +index 796f388..05c27f0 100644 +--- a/config/eu.am ++++ b/config/eu.am +@@ -74,6 +74,7 @@ AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ + $(if $($(*F)_no_Werror),,-Werror) \ + $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ + $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ ++ $(if $($(*F)_no_Wpacked_not_aligned),-Wno-packed-not-aligned,) \ + $($(*F)_CFLAGS) + + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +--- elfutils-0.170/backends/Makefile.in.orig 2018-02-15 17:29:58.185213368 +0100 ++++ elfutils-0.170/backends/Makefile.in 2018-02-15 17:32:30.207695806 +0100 +@@ -421,6 +421,7 @@ + $(if $($(*F)_no_Werror),,-Werror) \ + $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ + $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ ++ $(if $($(*F)_no_Wpacked_not_aligned),-Wno-packed-not-aligned,) \ + $($(*F)_CFLAGS) + + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) +@@ -515,6 +516,13 @@ + + libebl_m68k_pic_a_SOURCES = $(m68k_SRCS) + am_libebl_m68k_pic_a_OBJECTS = $(m68k_SRCS:.c=.os) ++ ++# m68k prstatus core notes are described by a packed structure ++# which has not naturally aligned fields. Since we don't access ++# these fields directly, but take their offset to be used later ++# to extract the data through elfxx_xlatetom/memmove, this isn't ++# an issue. ++m68k_corenote_no_Wpacked_not_aligned = yes + bpf_SRCS = bpf_init.c bpf_regs.c + cpu_bpf = ../libcpu/libcpu_bpf.a + libebl_bpf_pic_a_SOURCES = $(bpf_SRCS) diff --git a/elfutils.spec b/elfutils.spec index ae87dd9..8f6b91d 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -23,6 +23,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: elfutils-0.170-dwarf_aggregate_size.patch Source1: testfile-sizes3.o.bz2 Patch2: elfutils-0.170-sys-ptrace.patch +Patch3: elfutils-0.170-m68k-packed-not-aligned.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -177,6 +178,7 @@ profiling) of processes. %patch1 -p1 -b .aggregate_size cp %SOURCE1 tests/ %patch2 -p1 -b .sys_ptrace +%patch3 -p1 -b .m68k_packed find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -315,6 +317,7 @@ fi * Thu Feb 15 2018 Mark Wielaard - Add elfutils-0.170-sys-ptrace.patch - Make sure spec can be build even when ldconfig_scriplets aren't defined. +- Add elfutils-0.170-m68k-packed-not-aligned.patch * Fri Feb 09 2018 Igor Gnatenko - 0.170-7 - Escape macros in %%changelog From 196e6e5ec70fa46eeb315814a4b9660c38b25e5c Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 16 Feb 2018 01:12:34 +0100 Subject: [PATCH 050/216] 0.170-8 --- elfutils.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 8f6b91d..b8fed73 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.170 -%global baserelease 7 +%global baserelease 8 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -314,7 +314,7 @@ fi %endif %changelog -* Thu Feb 15 2018 Mark Wielaard +* Thu Feb 15 2018 Mark Wielaard - 0.170-8 - Add elfutils-0.170-sys-ptrace.patch - Make sure spec can be build even when ldconfig_scriplets aren't defined. - Add elfutils-0.170-m68k-packed-not-aligned.patch From 5b63504170ad25e5a4dc0f822ff828bf5e5f746b Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 17 Feb 2018 00:57:00 +0100 Subject: [PATCH 051/216] Add elfutils-0.170-core-pid.patch --- elfutils-0.170-core-pid.patch | 120 ++++++++++++++++++++++++++++++++++ elfutils.spec | 5 ++ 2 files changed, 125 insertions(+) create mode 100644 elfutils-0.170-core-pid.patch diff --git a/elfutils-0.170-core-pid.patch b/elfutils-0.170-core-pid.patch new file mode 100644 index 0000000..6354f21 --- /dev/null +++ b/elfutils-0.170-core-pid.patch @@ -0,0 +1,120 @@ +commit 699a741b488010d56cc358a5f7b4d8a8f4886347 +Author: Mark Wielaard +Date: Sat Dec 23 23:16:24 2017 +0100 + + tests: Try to use coredumpctl to extract core files. + + If systemd-coredump is installed we have to use coredumpctl to extract + the core file to test. Unfortunately systemd-coredump/coredumpctl seem + to be somewhat fragile if multiple core dumps are generated/extracted + at the same time. So use a lock file to only run one core dump test at + a time (under make -j). + + Signed-off-by: Mark Wielaard + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index fca0072..64cb5bd 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -515,6 +515,9 @@ dwarf_default_lower_bound_LDADD = $(libdw) + system_elf_libelf_test_CPPFLAGS = + system_elf_libelf_test_LDADD = $(libelf) + ++# A lock file used to make sure only one test dumps core at a time ++CLEANFILES += core-dump-backtrace.lock ++ + if GCOV + check: check-am coverage + .PHONY: coverage +diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh +index c1f3156..e04a7ea 100644 +--- a/tests/backtrace-subr.sh ++++ b/tests/backtrace-subr.sh +@@ -137,19 +137,46 @@ check_native() + # Backtrace core file. + check_native_core() + { ++# systemd-coredump/coredumpctl doesn't seem to like concurrent core dumps ++# use a lock file (fd 200) tests/core-dump-backtrace.lock ++( + child=$1 + + # Disable valgrind while dumping core. + SAVED_VALGRIND_CMD="$VALGRIND_CMD" + unset VALGRIND_CMD + ++ # Wait for lock for 10 seconds or skip. ++ flock -x -w 10 200 || exit 77; ++ + # Skip the test if we cannot adjust core ulimit. +- core="core.`ulimit -c unlimited || exit 77; set +ex; testrun ${abs_builddir}/$child --gencore; true`" ++ pid="`ulimit -c unlimited || exit 77; set +ex; testrun ${abs_builddir}/$child --gencore; true`" ++ core="core.$pid" + # see if /proc/sys/kernel/core_uses_pid is set to 0 + if [ -f core ]; then + mv core "$core" + fi +- if [ ! -f "$core" ]; then echo "No $core file generated"; exit 77; fi ++ type -P coredumpctl && have_coredumpctl=1 || have_coredumpctl=0 ++ if [ ! -f "$core" -a $have_coredumpctl -eq 1 ]; then ++ # Maybe systemd-coredump took it. But give it some time to dump first... ++ sleep 1 ++ coredumpctl --output="$core" dump $pid || rm -f $core ++ ++ # Try a couple of times after waiting some more if something went wrong... ++ if [ ! -f "$core" ]; then ++ sleep 2 ++ coredumpctl --output="$core" dump $pid || rm -f $core ++ fi ++ ++ if [ ! -f "$core" ]; then ++ sleep 3 ++ coredumpctl --output="$core" dump $pid || rm -f $core ++ fi ++ fi ++ if [ ! -f "$core" ]; then ++ echo "No $core file generated"; ++ exit 77; ++ fi + + if [ "x$SAVED_VALGRIND_CMD" != "x" ]; then + VALGRIND_CMD="$SAVED_VALGRIND_CMD" +@@ -163,4 +190,6 @@ check_native_core() + cat $core.{bt,err} + check_native_unsupported $core.err $child-$core + check_all $core.{bt,err} $child-$core ++ rm $core{,.{bt,err}} ++) 200>${abs_builddir}/core-dump-backtrace.lock + } + +commit 61e33d72788c58467668b2f2ad44d5b95ebbee80 +Author: Mark Wielaard +Date: Fri Feb 16 20:34:25 2018 +0100 + + tests: Accept any core if no core with the "correct" pid can be found. + + In some containers our view of pids is confused. We see the container + pid namespace, but the core is generated using the host pid namespace. + Since tests are run in a new fresh directory any core here is most like + is ours. + + Signed-off-by: Mark Wielaard + +diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh +index e04a7ea..ff42c6f 100644 +--- a/tests/backtrace-subr.sh ++++ b/tests/backtrace-subr.sh +@@ -174,6 +174,13 @@ check_native_core() + fi + fi + if [ ! -f "$core" ]; then ++ # In some containers our view of pids is confused. Since tests are ++ # run in a new fresh directory any core here is most like is ours. ++ if ls core.[0-9]* 1> /dev/null 2>&1; then ++ mv core.[0-9]* "$core" ++ fi ++ fi ++ if [ ! -f "$core" ]; then + echo "No $core file generated"; + exit 77; + fi diff --git a/elfutils.spec b/elfutils.spec index b8fed73..9648c19 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -24,6 +24,7 @@ Patch1: elfutils-0.170-dwarf_aggregate_size.patch Source1: testfile-sizes3.o.bz2 Patch2: elfutils-0.170-sys-ptrace.patch Patch3: elfutils-0.170-m68k-packed-not-aligned.patch +Patch4: elfutils-0.170-core-pid.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -179,6 +180,7 @@ profiling) of processes. cp %SOURCE1 tests/ %patch2 -p1 -b .sys_ptrace %patch3 -p1 -b .m68k_packed +%patch4 -p1 -b .core_pid find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -314,6 +316,9 @@ fi %endif %changelog +* Fri Feb 16 2018 Mark Wielaard +- Add elfutils-0.170-core-pid.patch + * Thu Feb 15 2018 Mark Wielaard - 0.170-8 - Add elfutils-0.170-sys-ptrace.patch - Make sure spec can be build even when ldconfig_scriplets aren't defined. From c39ad136ab4b23e3eb47a31b65fb2711409ca497 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 17 Feb 2018 01:10:24 +0100 Subject: [PATCH 052/216] Add elfutils-0.170-elf_sync.patch --- elfutils-0.170-elf_sync.patch | 306 ++++++++++++++++++++++++++++++++++ elfutils.spec | 3 + 2 files changed, 309 insertions(+) create mode 100644 elfutils-0.170-elf_sync.patch diff --git a/elfutils-0.170-elf_sync.patch b/elfutils-0.170-elf_sync.patch new file mode 100644 index 0000000..1d116e2 --- /dev/null +++ b/elfutils-0.170-elf_sync.patch @@ -0,0 +1,306 @@ +commit 6d2e7e7100429df3d548251e9685a1eb7bb434cb +Author: Mark Wielaard +Date: Tue Aug 15 22:43:01 2017 +0200 + + libelf: Sync elf.h from glibc. + + Add new powerpc note descriptors. + + Signed-off-by: Mark Wielaard + +diff --git a/libelf/elf.h b/libelf/elf.h +index fa35203..84a7126 100644 +--- a/libelf/elf.h ++++ b/libelf/elf.h +@@ -1,5 +1,5 @@ + /* This file defines standard ELF types, structures, and macros. +- Copyright (C) 1995-2016 Free Software Foundation, Inc. ++ Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -762,8 +762,23 @@ typedef struct + #define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */ + #define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */ + #define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ ++#define NT_PPC_TAR 0x103 /* Target Address Register */ ++#define NT_PPC_PPR 0x104 /* Program Priority Register */ ++#define NT_PPC_DSCR 0x105 /* Data Stream Control Register */ ++#define NT_PPC_EBB 0x106 /* Event Based Branch Registers */ ++#define NT_PPC_PMU 0x107 /* Performance Monitor Registers */ ++#define NT_PPC_TM_CGPR 0x108 /* TM checkpointed GPR Registers */ ++#define NT_PPC_TM_CFPR 0x109 /* TM checkpointed FPR Registers */ ++#define NT_PPC_TM_CVMX 0x10a /* TM checkpointed VMX Registers */ ++#define NT_PPC_TM_CVSX 0x10b /* TM checkpointed VSX Registers */ ++#define NT_PPC_TM_SPR 0x10c /* TM Special Purpose Registers */ ++#define NT_PPC_TM_CTAR 0x10d /* TM checkpointed Target Address ++ Register */ ++#define NT_PPC_TM_CPPR 0x10e /* TM checkpointed Program Priority ++ Register */ ++#define NT_PPC_TM_CDSCR 0x10f /* TM checkpointed Data Stream Control ++ Register */ + #define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */ +-#define NT_PPC_TM_SPR 0x10c /* PowerPC HW Transactional Memory SPRs */ + #define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */ + #define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */ + #define NT_S390_HIGH_GPRS 0x300 /* s390 upper register halves */ +@@ -1171,6 +1186,18 @@ typedef struct + #define AT_L2_CACHESHAPE 36 + #define AT_L3_CACHESHAPE 37 + ++/* Shapes of the caches, with more room to describe them. ++ *GEOMETRY are comprised of cache line size in bytes in the bottom 16 bits ++ and the cache associativity in the next 16 bits. */ ++#define AT_L1I_CACHESIZE 40 ++#define AT_L1I_CACHEGEOMETRY 41 ++#define AT_L1D_CACHESIZE 42 ++#define AT_L1D_CACHEGEOMETRY 43 ++#define AT_L2_CACHESIZE 44 ++#define AT_L2_CACHEGEOMETRY 45 ++#define AT_L3_CACHESIZE 46 ++#define AT_L3_CACHEGEOMETRY 47 ++ + /* Note section contents. Each entry in the note section begins with + a header of a fixed form. */ + +@@ -2533,9 +2560,10 @@ enum + #define DT_PPC64_OPT (DT_LOPROC + 3) + #define DT_PPC64_NUM 4 + +-/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry. */ ++/* PowerPC64 specific bits in the DT_PPC64_OPT Dyn entry. */ + #define PPC64_OPT_TLS 1 + #define PPC64_OPT_MULTI_TOC 2 ++#define PPC64_OPT_LOCALENTRY 4 + + /* PowerPC64 specific values for the Elf64_Sym st_other field. */ + #define STO_PPC64_LOCAL_BIT 5 +@@ -3683,6 +3711,68 @@ enum + #define R_BPF_NONE 0 /* No reloc */ + #define R_BPF_MAP_FD 1 /* Map fd to pointer */ + ++/* Imagination Meta specific relocations. */ ++ ++#define R_METAG_HIADDR16 0 ++#define R_METAG_LOADDR16 1 ++#define R_METAG_ADDR32 2 /* 32bit absolute address */ ++#define R_METAG_NONE 3 /* No reloc */ ++#define R_METAG_RELBRANCH 4 ++#define R_METAG_GETSETOFF 5 ++ ++/* Backward compatability */ ++#define R_METAG_REG32OP1 6 ++#define R_METAG_REG32OP2 7 ++#define R_METAG_REG32OP3 8 ++#define R_METAG_REG16OP1 9 ++#define R_METAG_REG16OP2 10 ++#define R_METAG_REG16OP3 11 ++#define R_METAG_REG32OP4 12 ++ ++#define R_METAG_HIOG 13 ++#define R_METAG_LOOG 14 ++ ++#define R_METAG_REL8 15 ++#define R_METAG_REL16 16 ++ ++/* GNU */ ++#define R_METAG_GNU_VTINHERIT 30 ++#define R_METAG_GNU_VTENTRY 31 ++ ++/* PIC relocations */ ++#define R_METAG_HI16_GOTOFF 32 ++#define R_METAG_LO16_GOTOFF 33 ++#define R_METAG_GETSET_GOTOFF 34 ++#define R_METAG_GETSET_GOT 35 ++#define R_METAG_HI16_GOTPC 36 ++#define R_METAG_LO16_GOTPC 37 ++#define R_METAG_HI16_PLT 38 ++#define R_METAG_LO16_PLT 39 ++#define R_METAG_RELBRANCH_PLT 40 ++#define R_METAG_GOTOFF 41 ++#define R_METAG_PLT 42 ++#define R_METAG_COPY 43 ++#define R_METAG_JMP_SLOT 44 ++#define R_METAG_RELATIVE 45 ++#define R_METAG_GLOB_DAT 46 ++ ++/* TLS relocations */ ++#define R_METAG_TLS_GD 47 ++#define R_METAG_TLS_LDM 48 ++#define R_METAG_TLS_LDO_HI16 49 ++#define R_METAG_TLS_LDO_LO16 50 ++#define R_METAG_TLS_LDO 51 ++#define R_METAG_TLS_IE 52 ++#define R_METAG_TLS_IENONPIC 53 ++#define R_METAG_TLS_IENONPIC_HI16 54 ++#define R_METAG_TLS_IENONPIC_LO16 55 ++#define R_METAG_TLS_TPOFF 56 ++#define R_METAG_TLS_DTPMOD 57 ++#define R_METAG_TLS_DTPOFF 58 ++#define R_METAG_TLS_LE 59 ++#define R_METAG_TLS_LE_HI16 60 ++#define R_METAG_TLS_LE_LO16 61 ++ + __END_DECLS + + #endif /* elf.h */ +commit 88f3d2daa107b09fdba376a82bce7ed534c93645 +Author: Mark Wielaard +Date: Sat Feb 17 00:23:19 2018 +0100 + + libelf: Sync elf.h from glibc. + + Signed-off-by: Mark Wielaard + +diff --git a/libelf/elf.h b/libelf/elf.h +index 84a7126..4f43577 100644 +--- a/libelf/elf.h ++++ b/libelf/elf.h +@@ -1,5 +1,5 @@ + /* This file defines standard ELF types, structures, and macros. +- Copyright (C) 1995-2017 Free Software Foundation, Inc. ++ Copyright (C) 1995-2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -739,6 +739,8 @@ typedef struct + /* Legal values for note segment descriptor types for core files. */ + + #define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ ++#define NT_PRFPREG 2 /* Contains copy of fpregset ++ struct. */ + #define NT_FPREGSET 2 /* Contains copy of fpregset struct */ + #define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ + #define NT_PRXREG 4 /* Contains copy of prxregset struct */ +@@ -790,11 +792,20 @@ typedef struct + #define NT_S390_LAST_BREAK 0x306 /* s390 breaking event address */ + #define NT_S390_SYSTEM_CALL 0x307 /* s390 system call restart data */ + #define NT_S390_TDB 0x308 /* s390 transaction diagnostic block */ ++#define NT_S390_VXRS_LOW 0x309 /* s390 vector registers 0-15 ++ upper half. */ ++#define NT_S390_VXRS_HIGH 0x30a /* s390 vector registers 16-31. */ ++#define NT_S390_GS_CB 0x30b /* s390 guarded storage registers. */ ++#define NT_S390_GS_BC 0x30c /* s390 guarded storage ++ broadcast control block. */ ++#define NT_S390_RI_CB 0x30d /* s390 runtime instrumentation. */ + #define NT_ARM_VFP 0x400 /* ARM VFP/NEON registers */ + #define NT_ARM_TLS 0x401 /* ARM TLS register */ + #define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */ + #define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */ + #define NT_ARM_SYSTEM_CALL 0x404 /* ARM system call number */ ++#define NT_ARM_SVE 0x405 /* ARM Scalable Vector Extension ++ registers */ + + /* Legal values for the note segment descriptor types for object files. */ + +@@ -859,7 +870,8 @@ typedef struct + #define DT_ENCODING 32 /* Start of encoded range */ + #define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/ + #define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */ +-#define DT_NUM 34 /* Number used */ ++#define DT_SYMTAB_SHNDX 34 /* Address of SYMTAB_SHNDX section */ ++#define DT_NUM 35 /* Number used */ + #define DT_LOOS 0x6000000d /* Start of OS-specific */ + #define DT_HIOS 0x6ffff000 /* End of OS-specific */ + #define DT_LOPROC 0x70000000 /* Start of processor-specific */ +@@ -967,6 +979,8 @@ typedef struct + #define DF_1_SYMINTPOSE 0x00800000 /* Object has individual interposers. */ + #define DF_1_GLOBAUDIT 0x01000000 /* Global auditing required. */ + #define DF_1_SINGLETON 0x02000000 /* Singleton symbols are used. */ ++#define DF_1_STUB 0x04000000 ++#define DF_1_PIE 0x08000000 + + /* Flags for the feature selection in DT_FEATURE_1. */ + #define DTF_1_PARINIT 0x00000001 +@@ -1263,6 +1277,62 @@ typedef struct + /* Version note generated by GNU gold containing a version string. */ + #define NT_GNU_GOLD_VERSION 4 + ++/* Program property. */ ++#define NT_GNU_PROPERTY_TYPE_0 5 ++ ++/* Note section name of program property. */ ++#define NOTE_GNU_PROPERTY_SECTION_NAME ".note.gnu.property" ++ ++/* Values used in GNU .note.gnu.property notes (NT_GNU_PROPERTY_TYPE_0). */ ++ ++/* Stack size. */ ++#define GNU_PROPERTY_STACK_SIZE 1 ++/* No copy relocation on protected data symbol. */ ++#define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2 ++ ++/* Processor-specific semantics, lo */ ++#define GNU_PROPERTY_LOPROC 0xc0000000 ++/* Processor-specific semantics, hi */ ++#define GNU_PROPERTY_HIPROC 0xdfffffff ++/* Application-specific semantics, lo */ ++#define GNU_PROPERTY_LOUSER 0xe0000000 ++/* Application-specific semantics, hi */ ++#define GNU_PROPERTY_HIUSER 0xffffffff ++ ++/* The x86 instruction sets indicated by the corresponding bits are ++ used in program. Their support in the hardware is optional. */ ++#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000 ++/* The x86 instruction sets indicated by the corresponding bits are ++ used in program and they must be supported by the hardware. */ ++#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001 ++/* X86 processor-specific features used in program. */ ++#define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002 ++ ++#define GNU_PROPERTY_X86_ISA_1_486 (1U << 0) ++#define GNU_PROPERTY_X86_ISA_1_586 (1U << 1) ++#define GNU_PROPERTY_X86_ISA_1_686 (1U << 2) ++#define GNU_PROPERTY_X86_ISA_1_SSE (1U << 3) ++#define GNU_PROPERTY_X86_ISA_1_SSE2 (1U << 4) ++#define GNU_PROPERTY_X86_ISA_1_SSE3 (1U << 5) ++#define GNU_PROPERTY_X86_ISA_1_SSSE3 (1U << 6) ++#define GNU_PROPERTY_X86_ISA_1_SSE4_1 (1U << 7) ++#define GNU_PROPERTY_X86_ISA_1_SSE4_2 (1U << 8) ++#define GNU_PROPERTY_X86_ISA_1_AVX (1U << 9) ++#define GNU_PROPERTY_X86_ISA_1_AVX2 (1U << 10) ++#define GNU_PROPERTY_X86_ISA_1_AVX512F (1U << 11) ++#define GNU_PROPERTY_X86_ISA_1_AVX512CD (1U << 12) ++#define GNU_PROPERTY_X86_ISA_1_AVX512ER (1U << 13) ++#define GNU_PROPERTY_X86_ISA_1_AVX512PF (1U << 14) ++#define GNU_PROPERTY_X86_ISA_1_AVX512VL (1U << 15) ++#define GNU_PROPERTY_X86_ISA_1_AVX512DQ (1U << 16) ++#define GNU_PROPERTY_X86_ISA_1_AVX512BW (1U << 17) ++ ++/* This indicates that all executable sections are compatible with ++ IBT. */ ++#define GNU_PROPERTY_X86_FEATURE_1_IBT (1U << 0) ++/* This indicates that all executable sections are compatible with ++ SHSTK. */ ++#define GNU_PROPERTY_X86_FEATURE_1_SHSTK (1U << 1) + + /* Move records. */ + typedef struct +@@ -3706,6 +3776,28 @@ enum + + #define R_TILEGX_NUM 130 + ++/* RISC-V ELF Flags */ ++#define EF_RISCV_RVC 0x0001 ++#define EF_RISCV_FLOAT_ABI 0x0006 ++#define EF_RISCV_FLOAT_ABI_SOFT 0x0000 ++#define EF_RISCV_FLOAT_ABI_SINGLE 0x0002 ++#define EF_RISCV_FLOAT_ABI_DOUBLE 0x0004 ++#define EF_RISCV_FLOAT_ABI_QUAD 0x0006 ++ ++/* RISC-V relocations. */ ++#define R_RISCV_NONE 0 ++#define R_RISCV_32 1 ++#define R_RISCV_64 2 ++#define R_RISCV_RELATIVE 3 ++#define R_RISCV_COPY 4 ++#define R_RISCV_JUMP_SLOT 5 ++#define R_RISCV_TLS_DTPMOD32 6 ++#define R_RISCV_TLS_DTPMOD64 7 ++#define R_RISCV_TLS_DTPREL32 8 ++#define R_RISCV_TLS_DTPREL64 9 ++#define R_RISCV_TLS_TPREL32 10 ++#define R_RISCV_TLS_TPREL64 11 ++ + /* BPF specific declarations. */ + + #define R_BPF_NONE 0 /* No reloc */ diff --git a/elfutils.spec b/elfutils.spec index 9648c19..f62df30 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -25,6 +25,7 @@ Source1: testfile-sizes3.o.bz2 Patch2: elfutils-0.170-sys-ptrace.patch Patch3: elfutils-0.170-m68k-packed-not-aligned.patch Patch4: elfutils-0.170-core-pid.patch +Patch5: elfutils-0.170-elf_sync.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -181,6 +182,7 @@ cp %SOURCE1 tests/ %patch2 -p1 -b .sys_ptrace %patch3 -p1 -b .m68k_packed %patch4 -p1 -b .core_pid +%patch5 -p1 -b .elf_sync find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -318,6 +320,7 @@ fi %changelog * Fri Feb 16 2018 Mark Wielaard - Add elfutils-0.170-core-pid.patch +- Add elfutils-0.170-elf_sync.patch * Thu Feb 15 2018 Mark Wielaard - 0.170-8 - Add elfutils-0.170-sys-ptrace.patch From bdf00824d9913e30920010f93176c888db94c891 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 17 Feb 2018 01:13:46 +0100 Subject: [PATCH 053/216] Add elfutils-0.170-new-notes-hack.patch --- elfutils-0.170-new-notes-hack.patch | 25 +++++++++++++++++++++++++ elfutils.spec | 3 +++ 2 files changed, 28 insertions(+) create mode 100644 elfutils-0.170-new-notes-hack.patch diff --git a/elfutils-0.170-new-notes-hack.patch b/elfutils-0.170-new-notes-hack.patch new file mode 100644 index 0000000..1785617 --- /dev/null +++ b/elfutils-0.170-new-notes-hack.patch @@ -0,0 +1,25 @@ +diff --git a/libebl/eblcheckreloctargettype.c b/libebl/eblcheckreloctargettype.c +index e0d57c1..068ad8f 100644 +--- a/libebl/eblcheckreloctargettype.c ++++ b/libebl/eblcheckreloctargettype.c +@@ -46,6 +46,7 @@ ebl_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type) + case SHT_INIT_ARRAY: + case SHT_FINI_ARRAY: + case SHT_PREINIT_ARRAY: ++ case SHT_NOTE: + return true; + + default: +diff --git a/src/elflint.c b/src/elflint.c +index df1b3a0..f4d82d9 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -4329,6 +4329,8 @@ section [%2d] '%s': unknown core file note type %" PRIu32 + case NT_GNU_HWCAP: + case NT_GNU_BUILD_ID: + case NT_GNU_GOLD_VERSION: ++ case NT_GNU_PROPERTY_TYPE_0: ++ case 256: + break; + + case 0: diff --git a/elfutils.spec b/elfutils.spec index f62df30..de727ff 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -26,6 +26,7 @@ Patch2: elfutils-0.170-sys-ptrace.patch Patch3: elfutils-0.170-m68k-packed-not-aligned.patch Patch4: elfutils-0.170-core-pid.patch Patch5: elfutils-0.170-elf_sync.patch +Patch6: elfutils-0.170-new-notes-hack.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -183,6 +184,7 @@ cp %SOURCE1 tests/ %patch3 -p1 -b .m68k_packed %patch4 -p1 -b .core_pid %patch5 -p1 -b .elf_sync +%patch6 -p1 -b .notes_hack find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -321,6 +323,7 @@ fi * Fri Feb 16 2018 Mark Wielaard - Add elfutils-0.170-core-pid.patch - Add elfutils-0.170-elf_sync.patch +- Add elfutils-0.170-new-notes-hack.patch * Thu Feb 15 2018 Mark Wielaard - 0.170-8 - Add elfutils-0.170-sys-ptrace.patch From 874d6578e503e8d815d838ac350aa85e1f3f74e2 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 17 Feb 2018 01:36:49 +0100 Subject: [PATCH 054/216] 0.170-9 --- elfutils.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index de727ff..911109e 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.170 -%global baserelease 8 +%global baserelease 9 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -320,7 +320,7 @@ fi %endif %changelog -* Fri Feb 16 2018 Mark Wielaard +* Fri Feb 16 2018 Mark Wielaard - 0.170-9 - Add elfutils-0.170-core-pid.patch - Add elfutils-0.170-elf_sync.patch - Add elfutils-0.170-new-notes-hack.patch From bef5d1d463ef7a6b19b74ea653003bbdc6d82fe4 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 1 Mar 2018 17:13:19 +0100 Subject: [PATCH 055/216] Add elfutils-0.170-GNU_variable_value.patch --- elfutils-0.170-GNU_variable_value.patch | 46 +++++++++++++++++++++++++ elfutils.spec | 5 +++ 2 files changed, 51 insertions(+) create mode 100644 elfutils-0.170-GNU_variable_value.patch diff --git a/elfutils-0.170-GNU_variable_value.patch b/elfutils-0.170-GNU_variable_value.patch new file mode 100644 index 0000000..8ff5f5c --- /dev/null +++ b/elfutils-0.170-GNU_variable_value.patch @@ -0,0 +1,46 @@ +commit e23c71330c3b332d19fdf9e48ca8b03680d9ad34 +Author: Mark Wielaard +Date: Thu Nov 2 16:23:24 2017 +0100 + + readelf: Handle DW_OP_GNU_variable_value. + + Also format both DW_OP_call_ref and DW_OP_GNU_variable_value argument + as a normal DIE reference. + + Signed-off-by: Mark Wielaard + +diff --git a/libdw/dwarf.h b/libdw/dwarf.h +index 902d261..8edf719 100644 +--- a/libdw/dwarf.h ++++ b/libdw/dwarf.h +@@ -545,6 +545,7 @@ enum + DW_OP_GNU_convert = 0xf7, + DW_OP_GNU_reinterpret = 0xf9, + DW_OP_GNU_parameter_ref = 0xfa, ++ DW_OP_GNU_variable_value = 0xfd, + + DW_OP_lo_user = 0xe0, /* Implementation-defined range start. */ + DW_OP_hi_user = 0xff /* Implementation-defined range end. */ +diff --git a/src/readelf.c b/src/readelf.c +index 5e2f3fc..833884b 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -4160,6 +4160,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + break; + + case DW_OP_call_ref: ++ case DW_OP_GNU_variable_value: + /* Offset operand. */ + if (ref_size != 4 && ref_size != 8) + goto invalid; /* Cannot be used in CFA. */ +@@ -4170,8 +4171,8 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + addr = read_8ubyte_unaligned (dbg, data); + data += ref_size; + CONSUME (ref_size); +- +- printf ("%*s[%4" PRIuMAX "] %s %#" PRIxMAX "\n", ++ /* addr is a DIE offset, so format it as one. */ ++ printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, + op_name, (uintmax_t) addr); + offset += 1 + ref_size; diff --git a/elfutils.spec b/elfutils.spec index 911109e..ad00720 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -27,6 +27,7 @@ Patch3: elfutils-0.170-m68k-packed-not-aligned.patch Patch4: elfutils-0.170-core-pid.patch Patch5: elfutils-0.170-elf_sync.patch Patch6: elfutils-0.170-new-notes-hack.patch +Patch7: elfutils-0.170-GNU_variable_value.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -185,6 +186,7 @@ cp %SOURCE1 tests/ %patch4 -p1 -b .core_pid %patch5 -p1 -b .elf_sync %patch6 -p1 -b .notes_hack +%patch7 -p1 -b .variable_value find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -320,6 +322,9 @@ fi %endif %changelog +* Thu Mar 01 2018 Mark Wielaard +- Add elfutils-0.170-GNU_variable_value.patch + * Fri Feb 16 2018 Mark Wielaard - 0.170-9 - Add elfutils-0.170-core-pid.patch - Add elfutils-0.170-elf_sync.patch From 230537c0c56ed3f63dc12fd542e3adaa6336cd40 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 1 Mar 2018 17:22:33 +0100 Subject: [PATCH 056/216] 0.170-10 - Add elfutils-0.170-locviews.patch --- elfutils-0.170-locviews.patch | 1270 +++++++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 1275 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.170-locviews.patch diff --git a/elfutils-0.170-locviews.patch b/elfutils-0.170-locviews.patch new file mode 100644 index 0000000..3709e7b --- /dev/null +++ b/elfutils-0.170-locviews.patch @@ -0,0 +1,1270 @@ +commit 704f5fc477efaf120980449e677deb563da8491f +Author: Mark Wielaard +Date: Wed Nov 29 15:43:26 2017 +0100 + + readelf: Adjust print_ops formatting. + + Use only 2 spaces for index (there are never 10000, the most seen in the + wild is 64). Adjust re-indenting after GNU_entry_value. + + Signed-off-by: Mark Wielaard + +diff --git a/src/readelf.c b/src/readelf.c +index a9168d1..2faa1d5 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -1,5 +1,5 @@ + /* Print information from ELF file in human-readable form. +- Copyright (C) 1999-2016 Red Hat, Inc. ++ Copyright (C) 1999-2017 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 1999. + +@@ -4152,7 +4152,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + CONSUME (addrsize); + + char *a = format_dwarf_addr (dwflmod, 0, addr, addr); +- printf ("%*s[%4" PRIuMAX "] %s %s\n", ++ printf ("%*s[%2" PRIuMAX "] %s %s\n", + indent, "", (uintmax_t) offset, op_name, a); + free (a); + +@@ -4172,7 +4172,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + data += ref_size; + CONSUME (ref_size); + /* addr is a DIE offset, so format it as one. */ +- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", ++ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, + op_name, (uintmax_t) addr); + offset += 1 + ref_size; +@@ -4184,7 +4184,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const1u: + // XXX value might be modified by relocation + NEED (1); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu8 "\n", + indent, "", (uintmax_t) offset, + op_name, *((uint8_t *) data)); + ++data; +@@ -4195,7 +4195,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const2u: + NEED (2); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu16 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu16 "\n", + indent, "", (uintmax_t) offset, + op_name, read_2ubyte_unaligned (dbg, data)); + CONSUME (2); +@@ -4206,7 +4206,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const4u: + NEED (4); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu32 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu32 "\n", + indent, "", (uintmax_t) offset, + op_name, read_4ubyte_unaligned (dbg, data)); + CONSUME (4); +@@ -4217,7 +4217,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const8u: + NEED (8); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 "\n", + indent, "", (uintmax_t) offset, + op_name, (uint64_t) read_8ubyte_unaligned (dbg, data)); + CONSUME (8); +@@ -4228,7 +4228,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const1s: + NEED (1); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRId8 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRId8 "\n", + indent, "", (uintmax_t) offset, + op_name, *((int8_t *) data)); + ++data; +@@ -4239,7 +4239,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const2s: + NEED (2); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRId16 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRId16 "\n", + indent, "", (uintmax_t) offset, + op_name, read_2sbyte_unaligned (dbg, data)); + CONSUME (2); +@@ -4250,7 +4250,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const4s: + NEED (4); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRId32 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRId32 "\n", + indent, "", (uintmax_t) offset, + op_name, read_4sbyte_unaligned (dbg, data)); + CONSUME (4); +@@ -4261,7 +4261,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_const8s: + NEED (8); + // XXX value might be modified by relocation +- printf ("%*s[%4" PRIuMAX "] %s %" PRId64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRId64 "\n", + indent, "", (uintmax_t) offset, + op_name, read_8sbyte_unaligned (dbg, data)); + CONSUME (8); +@@ -4277,7 +4277,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + uint64_t uleb; + NEED (1); + get_uleb128 (uleb, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 "\n", + indent, "", (uintmax_t) offset, op_name, uleb); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4290,7 +4290,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + get_uleb128 (uleb, data, data + len); + NEED (1); + get_uleb128 (uleb2, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 ", %" PRIu64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 ", %" PRIu64 "\n", + indent, "", (uintmax_t) offset, op_name, uleb, uleb2); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4303,7 +4303,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + int64_t sleb; + NEED (1); + get_sleb128 (sleb, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s %" PRId64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRId64 "\n", + indent, "", (uintmax_t) offset, op_name, sleb); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4315,7 +4315,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + get_uleb128 (uleb, data, data + len); + NEED (1); + get_sleb128 (sleb, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 " %" PRId64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 " %" PRId64 "\n", + indent, "", (uintmax_t) offset, op_name, uleb, sleb); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4323,7 +4323,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + + case DW_OP_call2: + NEED (2); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu16 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu16 "\n", + indent, "", (uintmax_t) offset, op_name, + read_2ubyte_unaligned (dbg, data)); + CONSUME (2); +@@ -4332,7 +4332,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + + case DW_OP_call4: + NEED (4); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu32 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu32 "\n", + indent, "", (uintmax_t) offset, op_name, + read_4ubyte_unaligned (dbg, data)); + CONSUME (4); +@@ -4342,7 +4342,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + case DW_OP_skip: + case DW_OP_bra: + NEED (2); +- printf ("%*s[%4" PRIuMAX "] %s %" PRIuMAX "\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIuMAX "\n", + indent, "", (uintmax_t) offset, op_name, + (uintmax_t) (offset + read_2sbyte_unaligned (dbg, data) + 3)); + CONSUME (2); +@@ -4354,7 +4354,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + start = data; + NEED (1); + get_uleb128 (uleb, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s: ", ++ printf ("%*s[%2" PRIuMAX "] %s: ", + indent, "", (uintmax_t) offset, op_name); + NEED (uleb); + print_block (uleb, data); +@@ -4378,7 +4378,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + NEED (1); + get_sleb128 (sleb, data, data + len); + +- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "] %+" PRId64 "\n", ++ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "] %+" PRId64 "\n", + indent, "", (intmax_t) offset, + op_name, (uintmax_t) addr, sleb); + CONSUME (data - start); +@@ -4390,10 +4390,10 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + start = data; + NEED (1); + get_uleb128 (uleb, data, data + len); +- printf ("%*s[%4" PRIuMAX "] %s:\n", ++ printf ("%*s[%2" PRIuMAX "] %s:\n", + indent, "", (uintmax_t) offset, op_name); + NEED (uleb); +- print_ops (dwflmod, dbg, indent + 6, indent + 6, vers, ++ print_ops (dwflmod, dbg, indent + 5, indent + 5, vers, + addrsize, offset_size, cu, uleb, data); + data += uleb; + CONSUME (data - start); +@@ -4411,7 +4411,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + NEED (1); + uint8_t usize = *(uint8_t *) data++; + NEED (usize); +- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "] ", ++ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "] ", + indent, "", (uintmax_t) offset, op_name, uleb); + print_block (usize, data); + data += usize; +@@ -4429,7 +4429,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + get_uleb128 (uleb2, data, data + len); + if (! print_unresolved_addresses && cu != NULL) + uleb2 += cu->start; +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 " [%6" PRIx64 "]\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 " [%6" PRIx64 "]\n", + indent, "", (uintmax_t) offset, op_name, uleb, uleb2); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4445,7 +4445,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + get_uleb128 (uleb, data, data + len); + if (! print_unresolved_addresses && cu != NULL) + uleb += cu->start; +- printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 " [%6" PRIxMAX "]\n", ++ printf ("%*s[%2" PRIuMAX "] %s %" PRIu8 " [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, + op_name, usize, uleb); + CONSUME (data - start); +@@ -4461,7 +4461,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + get_uleb128 (uleb, data, data + len); + if (uleb != 0 && ! print_unresolved_addresses && cu != NULL) + uleb += cu->start; +- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", ++ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, op_name, uleb); + CONSUME (data - start); + offset += 1 + (data - start); +@@ -4474,7 +4474,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + uintmax_t param_off = (uintmax_t) read_4ubyte_unaligned (dbg, data); + if (! print_unresolved_addresses && cu != NULL) + param_off += cu->start; +- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", ++ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n", + indent, "", (uintmax_t) offset, op_name, param_off); + CONSUME (4); + data += 4; +@@ -4483,7 +4483,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + + default: + /* No Operand. */ +- printf ("%*s[%4" PRIuMAX "] %s\n", ++ printf ("%*s[%2" PRIuMAX "] %s\n", + indent, "", (uintmax_t) offset, op_name); + ++offset; + break; +@@ -4493,7 +4493,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, + continue; + + invalid: +- printf (gettext ("%*s[%4" PRIuMAX "] %s \n"), ++ printf (gettext ("%*s[%2" PRIuMAX "] %s \n"), + indent, "", (uintmax_t) offset, op_name); + break; + } +diff --git a/tests/run-readelf-dwz-multi.sh b/tests/run-readelf-dwz-multi.sh +index 23ca944..139b8c1 100755 +--- a/tests/run-readelf-dwz-multi.sh ++++ b/tests/run-readelf-dwz-multi.sh +@@ -107,7 +107,7 @@ DWARF section [28] '.debug_info' at offset 0x1078: + low_pc (addr) 0x00000000004006ac

+ high_pc (udata) 44 (0x00000000004006d8) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_tail_call_sites (flag_present) yes + sibling (ref_udata) [ 6e] + [ 48] formal_parameter +@@ -116,21 +116,21 @@ DWARF section [28] '.debug_info' at offset 0x1078: + decl_line (data1) 3 + type (GNU_ref_alt) [ 3e] + location (exprloc) +- [ 0] fbreg -36 ++ [ 0] fbreg -36 + [ 56] formal_parameter + name (strp) "argv" + decl_file (data1) 1 + decl_line (data1) 3 + type (ref_udata) [ 6e] + location (exprloc) +- [ 0] fbreg -48 ++ [ 0] fbreg -48 + [ 61] variable + name (string) "b" + decl_file (data1) 1 + decl_line (data1) 5 + type (GNU_ref_alt) [ 5a] + location (exprloc) +- [ 0] fbreg -32 ++ [ 0] fbreg -32 + [ 6e] pointer_type + byte_size (data1) 8 + type (ref_udata) [ 2b] +@@ -168,7 +168,7 @@ DWARF section [28] '.debug_info' at offset 0x1078: + low_pc (addr) 0x00000000004006ac
+ high_pc (udata) 44 (0x00000000004006d8) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_tail_call_sites (flag_present) yes + sibling (ref_udata) [ 6e] + [ 48] formal_parameter +@@ -177,21 +177,21 @@ DWARF section [28] '.debug_info' at offset 0x1078: + decl_line (data1) 3 + type (GNU_ref_alt) [ 3e] + location (exprloc) +- [ 0] fbreg -36 ++ [ 0] fbreg -36 + [ 56] formal_parameter + name (strp) "argv" + decl_file (data1) 1 + decl_line (data1) 3 + type (ref_udata) [ 6e] + location (exprloc) +- [ 0] fbreg -48 ++ [ 0] fbreg -48 + [ 61] variable + name (string) "b" + decl_file (data1) 1 + decl_line (data1) 5 + type (GNU_ref_alt) [ 5a] + location (exprloc) +- [ 0] fbreg -32 ++ [ 0] fbreg -32 + [ 6e] pointer_type + byte_size (data1) 8 + type (ref_udata) [ 2b] +@@ -225,7 +225,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: + low_pc (addr) +0x0000000000000670 + high_pc (udata) 23 (+0x0000000000000687) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_call_sites (flag_present) yes + [ 41] formal_parameter + name (string) "fb" +@@ -233,7 +233,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: + decl_line (data1) 3 + type (GNU_ref_alt) [ 76] + location (exprloc) +- [ 0] fbreg -24 ++ [ 0] fbreg -24 + EOF + + # Same as above, but find alt debug file in a .dwz subdir. +@@ -265,7 +265,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: + low_pc (addr) +0x0000000000000670 + high_pc (udata) 23 (+0x0000000000000687) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_call_sites (flag_present) yes + [ 41] formal_parameter + name (string) "fb" +@@ -273,7 +273,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: + decl_line (data1) 3 + type (GNU_ref_alt) [ 76] + location (exprloc) +- [ 0] fbreg -24 ++ [ 0] fbreg -24 + EOF + mv .dwz/testfile_multi.dwz . + rmdir .dwz +@@ -304,7 +304,7 @@ DWARF section [28] '.debug_info' at offset 0x1088: + low_pc (addr) 0x00000000004004ec
+ high_pc (udata) 18 (0x00000000004004fe) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_call_sites (flag_present) yes + [ 41] formal_parameter + name (GNU_strp_alt) "argc" +@@ -312,21 +312,21 @@ DWARF section [28] '.debug_info' at offset 0x1088: + decl_line (data1) 8 + type (GNU_ref_alt) [ 30] + location (exprloc) +- [ 0] fbreg -36 ++ [ 0] fbreg -36 + [ 4f] formal_parameter + name (GNU_strp_alt) "argv" + decl_file (data1) 1 + decl_line (data1) 8 + type (GNU_ref_alt) [ 41] + location (exprloc) +- [ 0] fbreg -48 ++ [ 0] fbreg -48 + [ 5d] variable + name (string) "fbb" + decl_file (data1) 1 + decl_line (data1) 10 + type (GNU_ref_alt) [ 14] + location (exprloc) +- [ 0] fbreg -32 ++ [ 0] fbreg -32 + EOF + + exit 0 +diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh +index 98870fc..3959d3d 100755 +--- a/tests/run-readelf-loc.sh ++++ b/tests/run-readelf-loc.sh +@@ -63,9 +63,9 @@ testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=loc --debug-dump=ra + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 0x0000000000400480
..0x000000000040048d [ 0] reg5 +- [ 23] 0x0000000000400485 ..0x000000000040048d [ 0] reg5 +- [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 ++ [ 0] 0x0000000000400480
..0x000000000040048d [ 0] reg5 ++ [ 23] 0x0000000000400485 ..0x000000000040048d [ 0] reg5 ++ [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + [ 0] 0x0000000000400480
..0x0000000000400482 +@@ -79,9 +79,9 @@ testrun_compare ${abs_top_builddir}/src/readelf -N --debug-dump=loc --debug-dump + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 0x0000000000400480..0x000000000040048d [ 0] reg5 +- [ 23] 0x0000000000400485..0x000000000040048d [ 0] reg5 +- [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 ++ [ 0] 0x0000000000400480..0x000000000040048d [ 0] reg5 ++ [ 23] 0x0000000000400485..0x000000000040048d [ 0] reg5 ++ [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + [ 0] 0x0000000000400480..0x0000000000400482 +@@ -95,9 +95,9 @@ testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc --debug-dump + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 000000000000000000..0x000000000000000d [ 0] reg5 +- [ 23] 0x0000000000000005..0x000000000000000d [ 0] reg5 +- [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 ++ [ 0] 000000000000000000..0x000000000000000d [ 0] reg5 ++ [ 23] 0x0000000000000005..0x000000000000000d [ 0] reg5 ++ [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + [ 0] 000000000000000000..0x0000000000000002 +diff --git a/tests/run-readelf-zdebug-rel.sh b/tests/run-readelf-zdebug-rel.sh +index 1232d63..082971e 100755 +--- a/tests/run-readelf-zdebug-rel.sh ++++ b/tests/run-readelf-zdebug-rel.sh +@@ -69,7 +69,7 @@ DWARF section [ 4] '.debug_info' at offset 0x58: + low_pc (addr) 000000000000000000 + high_pc (data8) 24 (0x0000000000000018) + frame_base (exprloc) +- [ 0] call_frame_cfa ++ [ 0] call_frame_cfa + GNU_all_call_sites (flag_present) yes + sibling (ref4) [ 80] + [ 4e] formal_parameter +@@ -84,7 +84,7 @@ DWARF section [ 4] '.debug_info' at offset 0x58: + decl_line (data1) 4 + type (ref4) [ 87] + location (exprloc) +- [ 0] reg4 ++ [ 0] reg4 + [ 6a] variable + name (string) "a" + decl_file (data1) 1 +@@ -97,7 +97,7 @@ DWARF section [ 4] '.debug_info' at offset 0x58: + decl_line (data1) 7 + type (ref4) [ 9a] + location (exprloc) +- [ 0] reg5 ++ [ 0] reg5 + [ 80] base_type + byte_size (data1) 4 + encoding (data1) signed (5) +@@ -127,12 +127,12 @@ cat info.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=i + cat > loc.out << \EOF + + DWARF section [ 7] '.debug_loc' at offset 0x185: +- [ 0] 000000000000000000..0x0000000000000003 [ 0] reg5 +- 0x0000000000000003..0x0000000000000010 [ 0] breg5 -42 +- [ 2] stack_value +- 0x0000000000000010..0x0000000000000018 [ 0] GNU_entry_value: +- [ 0] reg5 +- [ 3] stack_value ++ [ 0] 000000000000000000..0x0000000000000003 [ 0] reg5 ++ 0x0000000000000003..0x0000000000000010 [ 0] breg5 -42 ++ [ 2] stack_value ++ 0x0000000000000010..0x0000000000000018 [ 0] GNU_entry_value: ++ [ 0] reg5 ++ [ 3] stack_value + EOF + + cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug-rel.o +diff --git a/tests/run-readelf-zdebug.sh b/tests/run-readelf-zdebug.sh +index 37cf7ea..fc666fd 100755 +--- a/tests/run-readelf-zdebug.sh ++++ b/tests/run-readelf-zdebug.sh +@@ -46,12 +46,12 @@ tempfiles loc.out aranges.out ranges.out macro.out line.out frame.out + cat > loc.out << \EOF + + DWARF section [30] '.debug_loc' at offset 0xa17: +- [ 0] 0x00000000004003c0..0x00000000004003c3 [ 0] reg5 +- 0x00000000004003c3..0x00000000004003d6 [ 0] breg5 -42 +- [ 2] stack_value +- 0x00000000004003d6..0x00000000004003d9 [ 0] GNU_entry_value: +- [ 0] reg5 +- [ 3] stack_value ++ [ 0] 0x00000000004003c0..0x00000000004003c3 [ 0] reg5 ++ 0x00000000004003c3..0x00000000004003d6 [ 0] breg5 -42 ++ [ 2] stack_value ++ 0x00000000004003d6..0x00000000004003d9 [ 0] GNU_entry_value: ++ [ 0] reg5 ++ [ 3] stack_value + EOF + + cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug +@@ -476,15 +476,15 @@ Call frame information section [16] '.eh_frame' at offset 0x5b8: + def_cfa_offset 24 + advance_loc 10 to 0x3b0 + def_cfa_expression 11 +- [ 0] breg7 8 +- [ 2] breg16 0 +- [ 4] lit15 +- [ 5] and +- [ 6] lit11 +- [ 7] ge +- [ 8] lit3 +- [ 9] shl +- [ 10] plus ++ [ 0] breg7 8 ++ [ 2] breg16 0 ++ [ 4] lit15 ++ [ 5] and ++ [ 6] lit11 ++ [ 7] ge ++ [ 8] lit3 ++ [ 9] shl ++ [10] plus + nop + nop + nop + +commit 36eabdb739b16b934afe318c786a97c94b47bbf6 +Author: Mark Wielaard +Date: Wed Nov 29 16:27:33 2017 +0100 + + readelf: Print CU, base address and unresolved .debug_range entries. + + Also adjust the formatting for the resolved addresses to print them + on separate lines so they nicely line up even when the addresses are + resolved to symbol+offset names. + + Signed-off-by: Mark Wielaard + +diff --git a/src/readelf.c b/src/readelf.c +index 8661ba8..8e13462 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -5007,15 +5007,33 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, + Dwarf_Addr base = 0; + unsigned char *const endp = (unsigned char *) data->d_buf + data->d_size; + unsigned char *readp = data->d_buf; ++ Dwarf_CU *last_cu = NULL; + while (readp < endp) + { + ptrdiff_t offset = readp - (unsigned char *) data->d_buf; ++ Dwarf_CU *cu; + + if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx, +- &address_size, NULL, &base, NULL, ++ &address_size, NULL, &base, &cu, + offset, &readp, endp)) + continue; + ++ if (last_cu != cu) ++ { ++ char *basestr = format_dwarf_addr (dwflmod, address_size, ++ base, base); ++ Dwarf_Die cudie; ++ if (dwarf_cu_die (cu, &cudie, ++ NULL, NULL, NULL, NULL, ++ NULL, NULL) == NULL) ++ printf (gettext ("\n Unknown CU base: %s\n"), basestr); ++ else ++ printf (gettext ("\n CU [%6" PRIx64 "] base: %s\n"), ++ dwarf_dieoffset (&cudie), basestr); ++ free (basestr); ++ } ++ last_cu = cu; ++ + if (unlikely (data->d_size - offset < (size_t) address_size * 2)) + { + printf (gettext (" [%6tx] \n"), offset); +@@ -5040,29 +5058,36 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, + if (begin == (Dwarf_Addr) -1l) /* Base address entry. */ + { + char *b = format_dwarf_addr (dwflmod, address_size, end, end); +- printf (gettext (" [%6tx] base address %s\n"), offset, b); ++ printf (gettext (" [%6tx] base address\n %s\n"), offset, b); + free (b); + base = end; + } + else if (begin == 0 && end == 0) /* End of list entry. */ + { + if (first) +- printf (gettext (" [%6tx] empty list\n"), offset); ++ printf (gettext (" [%6tx] empty list\n"), offset); + first = true; + } + else + { +- char *b = format_dwarf_addr (dwflmod, address_size, base + begin, +- begin); +- char *e = format_dwarf_addr (dwflmod, address_size, base + end, +- end); + /* We have an address range entry. */ + if (first) /* First address range entry in a list. */ +- printf (gettext (" [%6tx] %s..%s\n"), offset, b, e); ++ printf (" [%6tx] ", offset); + else +- printf (gettext (" %s..%s\n"), b, e); +- free (b); +- free (e); ++ printf (" "); ++ ++ printf ("range %" PRIx64 ", %" PRIx64 "\n", begin, end); ++ if (! print_unresolved_addresses) ++ { ++ char *b = format_dwarf_addr (dwflmod, address_size, base + begin, ++ base + begin); ++ char *e = format_dwarf_addr (dwflmod, address_size, ++ base + end - 1, base + end); ++ printf (" %s..\n", b); ++ printf (" %s\n", e); ++ free (b); ++ free (e); ++ } + + first = false; + } +diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh +index 3959d3d..4b666cf 100755 +--- a/tests/run-readelf-loc.sh ++++ b/tests/run-readelf-loc.sh +@@ -68,10 +68,22 @@ DWARF section [33] '.debug_loc' at offset 0xd2a: + [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: +- [ 0] 0x0000000000400480
..0x0000000000400482 +- 0x0000000000400485 ..0x000000000040048d +- [ 30] 0x00000000004004ad ..0x00000000004004af +- 0x00000000004004b2 ..0x00000000004004ba ++ ++ CU [ b] base: 0x0000000000400480
++ [ 0] range 0, 2 ++ 0x0000000000400480
.. ++ 0x0000000000400481 ++ range 5, d ++ 0x0000000000400485 .. ++ 0x000000000040048c ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 30] range d, f ++ 0x00000000004004ad .. ++ 0x00000000004004ae ++ range 12, 1a ++ 0x00000000004004b2 .. ++ 0x00000000004004b9 + EOF + + # Don't resolve addresses to symbols. +@@ -84,10 +96,22 @@ DWARF section [33] '.debug_loc' at offset 0xd2a: + [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: +- [ 0] 0x0000000000400480..0x0000000000400482 +- 0x0000000000400485..0x000000000040048d +- [ 30] 0x00000000004004ad..0x00000000004004af +- 0x00000000004004b2..0x00000000004004ba ++ ++ CU [ b] base: 0x0000000000400480 ++ [ 0] range 0, 2 ++ 0x0000000000400480.. ++ 0x0000000000400481 ++ range 5, d ++ 0x0000000000400485.. ++ 0x000000000040048c ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 30] range d, f ++ 0x00000000004004ad.. ++ 0x00000000004004ae ++ range 12, 1a ++ 0x00000000004004b2.. ++ 0x00000000004004b9 + EOF + + # Produce "raw" unprocessed content. +@@ -100,10 +124,14 @@ DWARF section [33] '.debug_loc' at offset 0xd2a: + [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: +- [ 0] 000000000000000000..0x0000000000000002 +- 0x0000000000000005..0x000000000000000d +- [ 30] 0x000000000000000d..0x000000000000000f +- 0x0000000000000012..0x000000000000001a ++ ++ CU [ b] base: 0x0000000000400480 ++ [ 0] range 0, 2 ++ range 5, d ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 30] range d, f ++ range 12, 1a + EOF + + exit 0 +diff --git a/tests/run-readelf-zdebug.sh b/tests/run-readelf-zdebug.sh +index fc666fd..7be9bee 100755 +--- a/tests/run-readelf-zdebug.sh ++++ b/tests/run-readelf-zdebug.sh +@@ -80,7 +80,9 @@ cat aranges.out | sed -e "s/.debug_aranges' at offset 0xa65/.zdebug_aranges' at + cat > ranges.out << \EOF + + DWARF section [32] '.debug_ranges' at offset 0xa95: +- [ 0] 0x00000000004003c0..0x00000000004003d9 ++ ++ CU [ b] base: 000000000000000000 ++ [ 0] range 4003c0, 4003d9 + EOF + + cat ranges.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=ranges testfile-debug + +commit fbb6c932e3ff74d4fb8bc54b72d9c9bdc4513f69 +Author: Mark Wielaard +Date: Wed Nov 29 16:37:50 2017 +0100 + + readelf: Print CU, base address and unresolved .debug_loc entries. + + Also adjust the formatting for the resolved addresses to print them + on separate lines so they nicely line up even when the addresses are + resolved to symbol+offset names. And print the operands starting on + a new line. + + Signed-off-by: Mark Wielaard + +diff --git a/src/readelf.c b/src/readelf.c +index 8e13462..bb48af9 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -7130,19 +7130,36 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + uint_fast8_t offset_size = 4; + + bool first = true; +- struct Dwarf_CU *cu = NULL; + Dwarf_Addr base = 0; + unsigned char *readp = data->d_buf; + unsigned char *const endp = (unsigned char *) data->d_buf + data->d_size; ++ Dwarf_CU *last_cu = NULL; + while (readp < endp) + { + ptrdiff_t offset = readp - (unsigned char *) data->d_buf; ++ Dwarf_CU *cu; + + if (first && skip_listptr_hole (&known_loclistptr, &listptr_idx, + &address_size, &offset_size, &base, + &cu, offset, &readp, endp)) + continue; + ++ if (last_cu != cu) ++ { ++ char *basestr = format_dwarf_addr (dwflmod, address_size, ++ base, base); ++ Dwarf_Die cudie; ++ if (dwarf_cu_die (cu, &cudie, ++ NULL, NULL, NULL, NULL, ++ NULL, NULL) == NULL) ++ printf (gettext ("\n Unknown CU base: %s\n"), basestr); ++ else ++ printf (gettext ("\n CU [%6" PRIx64 "] base: %s\n"), ++ dwarf_dieoffset (&cudie), basestr); ++ free (basestr); ++ } ++ last_cu = cu; ++ + if (unlikely (data->d_size - offset < (size_t) address_size * 2)) + { + printf (gettext (" [%6tx] \n"), offset); +@@ -7167,14 +7184,14 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + if (begin == (Dwarf_Addr) -1l) /* Base address entry. */ + { + char *b = format_dwarf_addr (dwflmod, address_size, end, end); +- printf (gettext (" [%6tx] base address %s\n"), offset, b); ++ printf (gettext (" [%6tx] base address\n %s\n"), offset, b); + free (b); + base = end; + } + else if (begin == 0 && end == 0) /* End of list entry. */ + { + if (first) +- printf (gettext (" [%6tx] empty list\n"), offset); ++ printf (gettext (" [%6tx] empty list\n"), offset); + first = true; + } + else +@@ -7182,18 +7199,23 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + /* We have a location expression entry. */ + uint_fast16_t len = read_2ubyte_unaligned_inc (dbg, readp); + +- char *b = format_dwarf_addr (dwflmod, address_size, base + begin, +- begin); +- char *e = format_dwarf_addr (dwflmod, address_size, base + end, +- end); +- + if (first) /* First entry in a list. */ +- printf (gettext (" [%6tx] %s..%s"), offset, b, e); ++ printf (" [%6tx] ", offset); + else +- printf (gettext (" %s..%s"), b, e); ++ printf (" "); + +- free (b); +- free (e); ++ printf ("range %" PRIx64 ", %" PRIx64 "\n", begin, end); ++ if (! print_unresolved_addresses) ++ { ++ char *b = format_dwarf_addr (dwflmod, address_size, base + begin, ++ base + begin); ++ char *e = format_dwarf_addr (dwflmod, address_size, ++ base + end - 1, base + end); ++ printf (" %s..\n", b); ++ printf (" %s\n", e); ++ free (b); ++ free (e); ++ } + + if (endp - readp <= (ptrdiff_t) len) + { +@@ -7201,8 +7223,9 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + break; + } + +- print_ops (dwflmod, dbg, 1, 18 + (address_size * 4), +- 3 /*XXX*/, address_size, offset_size, cu, len, readp); ++ print_ops (dwflmod, dbg, 11, 11, ++ cu != NULL ? cu->version : 3, ++ address_size, offset_size, cu, len, readp); + + first = false; + readp += len; +diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh +index 4b666cf..e5152df 100755 +--- a/tests/run-readelf-loc.sh ++++ b/tests/run-readelf-loc.sh +@@ -63,9 +63,22 @@ testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=loc --debug-dump=ra + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 0x0000000000400480
..0x000000000040048d [ 0] reg5 +- [ 23] 0x0000000000400485 ..0x000000000040048d [ 0] reg5 +- [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 ++ ++ CU [ b] base: 0x0000000000400480
++ [ 0] range 0, d ++ 0x0000000000400480
.. ++ 0x000000000040048c ++ [ 0] reg5 ++ [ 23] range 5, d ++ 0x0000000000400485 .. ++ 0x000000000040048c ++ [ 0] reg5 ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 46] range 12, 1a ++ 0x00000000004004b2 .. ++ 0x00000000004004b9 ++ [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + +@@ -91,9 +104,22 @@ testrun_compare ${abs_top_builddir}/src/readelf -N --debug-dump=loc --debug-dump + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 0x0000000000400480..0x000000000040048d [ 0] reg5 +- [ 23] 0x0000000000400485..0x000000000040048d [ 0] reg5 +- [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 ++ ++ CU [ b] base: 0x0000000000400480 ++ [ 0] range 0, d ++ 0x0000000000400480.. ++ 0x000000000040048c ++ [ 0] reg5 ++ [ 23] range 5, d ++ 0x0000000000400485.. ++ 0x000000000040048c ++ [ 0] reg5 ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 46] range 12, 1a ++ 0x00000000004004b2.. ++ 0x00000000004004b9 ++ [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + +@@ -119,9 +145,16 @@ testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc --debug-dump + testfileloc<<\EOF + + DWARF section [33] '.debug_loc' at offset 0xd2a: +- [ 0] 000000000000000000..0x000000000000000d [ 0] reg5 +- [ 23] 0x0000000000000005..0x000000000000000d [ 0] reg5 +- [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 ++ ++ CU [ b] base: 0x0000000000400480 ++ [ 0] range 0, d ++ [ 0] reg5 ++ [ 23] range 5, d ++ [ 0] reg5 ++ ++ CU [ e0] base: 0x00000000004004a0 ++ [ 46] range 12, 1a ++ [ 0] breg5 0 + + DWARF section [34] '.debug_ranges' at offset 0xd94: + +diff --git a/tests/run-readelf-zdebug-rel.sh b/tests/run-readelf-zdebug-rel.sh +index 2b57d05..ccccd82 100755 +--- a/tests/run-readelf-zdebug-rel.sh ++++ b/tests/run-readelf-zdebug-rel.sh +@@ -127,12 +127,17 @@ cat info.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=i + cat > loc.out << \EOF + + DWARF section [ 7] '.debug_loc' at offset 0x185: +- [ 0] 000000000000000000..0x0000000000000003 [ 0] reg5 +- 0x0000000000000003..0x0000000000000010 [ 0] breg5 -42 +- [ 2] stack_value +- 0x0000000000000010..0x0000000000000018 [ 0] GNU_entry_value: +- [ 0] reg5 +- [ 3] stack_value ++ ++ CU [ b] base: 000000000000000000 ++ [ 0] range 0, 3 ++ [ 0] reg5 ++ range 3, 10 ++ [ 0] breg5 -42 ++ [ 2] stack_value ++ range 10, 18 ++ [ 0] GNU_entry_value: ++ [ 0] reg5 ++ [ 3] stack_value + EOF + + cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug-rel.o +diff --git a/tests/run-readelf-zdebug.sh b/tests/run-readelf-zdebug.sh +index 7be9bee..28128ad 100755 +--- a/tests/run-readelf-zdebug.sh ++++ b/tests/run-readelf-zdebug.sh +@@ -46,12 +46,17 @@ tempfiles loc.out aranges.out ranges.out macro.out line.out frame.out + cat > loc.out << \EOF + + DWARF section [30] '.debug_loc' at offset 0xa17: +- [ 0] 0x00000000004003c0..0x00000000004003c3 [ 0] reg5 +- 0x00000000004003c3..0x00000000004003d6 [ 0] breg5 -42 +- [ 2] stack_value +- 0x00000000004003d6..0x00000000004003d9 [ 0] GNU_entry_value: +- [ 0] reg5 +- [ 3] stack_value ++ ++ CU [ b] base: 000000000000000000 ++ [ 0] range 4003c0, 4003c3 ++ [ 0] reg5 ++ range 4003c3, 4003d6 ++ [ 0] breg5 -42 ++ [ 2] stack_value ++ range 4003d6, 4003d9 ++ [ 0] GNU_entry_value: ++ [ 0] reg5 ++ [ 3] stack_value + EOF + + cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug + +commit e98f032d293a8ea8ea2b25949d7f452603e644d9 +Author: Mark Wielaard +Date: Thu Jan 25 13:24:19 2018 +0100 + + readelf: Fix crash on reading loc data or range data with bad/no CUs. + + In print_debug_ranges_section and print_debug_loc_section we try to + get the associated CU through skip_listptr_hole for the first data data. + If no CU at all can be found (because the .debug_info section was bogus) + this would keep the Dwarf_CU uninitialized causing a crash later on + when it was compared to the last_cu and used because it was unequal. + Fix this by explicitly initializing cu to last_cu (which is NULL on + first use). + + Signed-off-by: Mark Wielaard + +diff --git a/src/readelf.c b/src/readelf.c +index 4bdaef2..6c49d30 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -5014,7 +5014,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, + while (readp < endp) + { + ptrdiff_t offset = readp - (unsigned char *) data->d_buf; +- Dwarf_CU *cu; ++ Dwarf_CU *cu = last_cu; + + if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx, + &address_size, NULL, &base, &cu, +@@ -7140,7 +7140,7 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + while (readp < endp) + { + ptrdiff_t offset = readp - (unsigned char *) data->d_buf; +- Dwarf_CU *cu; ++ Dwarf_CU *cu = last_cu; + + if (first && skip_listptr_hole (&known_loclistptr, &listptr_idx, + &address_size, &offset_size, &base, + +commit 0f1d3389f18887ff4ef411812e95deab3e8dfb7c +Author: Mark Wielaard +Date: Thu Mar 1 00:14:52 2018 +0100 + + readelf: Add some support for locviews. + + This adds minimal support for locviews as output by GCC8. + It changes readelf to keep track of loclistptrs from DW_AT_GNU_locviews + and prints the locview pairs for those. Since there is no terminator + we have to keep track of where the next loclist entry starts. + The --debug-dump=loc output looks as follows: + + CU [ 714] base: +0x0000000000003020 + [ b4] view pair 1, 2 + [ b6] range 4, 7f + +0x0000000000003024 .. + +0x000000000000309e + [ 0] reg5 + [ d9] view pair 3, 1 + view pair 1, 2 + [ dd] range 4, 4c + +0x0000000000003024 .. + +0x000000000000306b + [ 0] reg5 + range 4c, 7f + +0x000000000000306c .. + +0x000000000000309e + [ 0] reg2 + + Note that in the above output the view pairs correspond to the ranges + immediately following in the loc list. This is how GCC8 currently + outputs the locview pairs and ranges, but this is not guaranteed and + you'll need to look at the location and GNU_locviews attributes of the + DIE to know which really match up together. We might want to adjust the + output to make this more clear. + + This does not yet add an locview accessor to libdw. It just recognizes + the DW_AT_GNU_locviews attribute as a loclistptr when encoded as a + sec_offset form. + + Signed-off-by: Mark Wielaard + +diff --git a/libdw/dwarf.h b/libdw/dwarf.h +index 4f36206..d53a30d 100644 +--- a/libdw/dwarf.h ++++ b/libdw/dwarf.h +@@ -339,6 +339,8 @@ enum + DW_AT_GNU_all_tail_call_sites = 0x2116, + DW_AT_GNU_all_call_sites = 0x2117, + DW_AT_GNU_all_source_call_sites = 0x2118, ++ DW_AT_GNU_locviews = 0x2137, ++ DW_AT_GNU_entry_view = 0x2138, + DW_AT_GNU_macros = 0x2119, + DW_AT_GNU_deleted = 0x211a, + +diff --git a/libdw/dwarf_formudata.c b/libdw/dwarf_formudata.c +index 9c1644e..95872d6 100644 +--- a/libdw/dwarf_formudata.c ++++ b/libdw/dwarf_formudata.c +@@ -141,6 +141,7 @@ dwarf_formudata (Dwarf_Attribute *attr, Dwarf_Word *return_uval) + case DW_AT_string_length: + case DW_AT_use_location: + case DW_AT_vtable_elem_location: ++ case DW_AT_GNU_locviews: + /* loclistptr */ + if (__libdw_formptr (attr, IDX_debug_loc, + DWARF_E_NO_LOCLIST, NULL, +diff --git a/src/readelf.c b/src/readelf.c +index 2d49af3..098209f 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -4532,6 +4532,7 @@ struct listptr + bool dwarf64:1; + bool warned:1; + struct Dwarf_CU *cu; ++ unsigned int attr; + }; + + #define listptr_offset_size(p) ((p)->dwarf64 ? 8 : 4) +@@ -4592,6 +4593,15 @@ compare_listptr (const void *a, const void *b, void *arg) + gettext ("%s %#" PRIx64 " used with different base addresses"), + name, (uint64_t) p1->offset); + } ++ if (p1->attr != p2 ->attr) ++ { ++ p1->warned = p2->warned = true; ++ error (0, 0, ++ gettext ("%s %#" PRIx64 ++ " used with different attribute %s and %s"), ++ name, (uint64_t) p1->offset, dwarf_attr_name (p2->attr), ++ dwarf_attr_name (p2->attr)); ++ } + } + + return 0; +@@ -4619,7 +4629,7 @@ reset_listptr (struct listptr_table *table) + static bool + notice_listptr (enum section_e section, struct listptr_table *table, + uint_fast8_t address_size, uint_fast8_t offset_size, +- struct Dwarf_CU *cu, Dwarf_Off offset) ++ struct Dwarf_CU *cu, Dwarf_Off offset, unsigned int attr) + { + if (print_debug_sections & section) + { +@@ -4640,7 +4650,8 @@ notice_listptr (enum section_e section, struct listptr_table *table, + .addr64 = address_size == 8, + .dwarf64 = offset_size == 8, + .offset = offset, +- .cu = cu ++ .cu = cu, ++ .attr = attr + }; + + if (p->offset != offset) +@@ -4664,7 +4675,8 @@ static bool + skip_listptr_hole (struct listptr_table *table, size_t *idxp, + uint_fast8_t *address_sizep, uint_fast8_t *offset_sizep, + Dwarf_Addr *base, struct Dwarf_CU **cu, ptrdiff_t offset, +- unsigned char **readp, unsigned char *endp) ++ unsigned char **readp, unsigned char *endp, ++ unsigned int *attr) + { + if (table->n == 0) + return false; +@@ -4699,10 +4711,27 @@ skip_listptr_hole (struct listptr_table *table, size_t *idxp, + *base = listptr_base (p); + if (cu != NULL) + *cu = p->cu; ++ if (attr != NULL) ++ *attr = p->attr; + + return false; + } + ++static Dwarf_Off ++next_listptr_offset (struct listptr_table *table, size_t idx) ++{ ++ /* Note that multiple attributes could in theory point to the same loclist ++ offset, so make sure we pick one that is bigger than the current one. ++ The table is sorted on offset. */ ++ Dwarf_Off offset = table->table[idx].offset; ++ while (++idx < table->n) ++ { ++ Dwarf_Off next = table->table[idx].offset; ++ if (next > offset) ++ return next; ++ } ++ return 0; ++} + + static void + print_debug_abbrev_section (Dwfl_Module *dwflmod __attribute__ ((unused)), +@@ -5042,7 +5071,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, + + if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx, + &address_size, NULL, &base, &cu, +- offset, &readp, endp)) ++ offset, &readp, endp, NULL)) + continue; + + if (last_cu != cu) +@@ -6121,10 +6150,11 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) + case DW_AT_GNU_call_site_data_value: + case DW_AT_GNU_call_site_target: + case DW_AT_GNU_call_site_target_clobbered: ++ case DW_AT_GNU_locviews: + { + bool nlpt = notice_listptr (section_loc, &known_loclistptr, + cbargs->addrsize, cbargs->offset_size, +- cbargs->cu, num); ++ cbargs->cu, num, attr); + if (!cbargs->silent) + printf (" %*s%-20s (%s) location list [%6" PRIxMAX "]%s\n", + (int) (level * 2), "", dwarf_attr_name (attr), +@@ -6137,7 +6167,7 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) + { + bool nlpt = notice_listptr (section_ranges, &known_rangelistptr, + cbargs->addrsize, cbargs->offset_size, +- cbargs->cu, num); ++ cbargs->cu, num, attr); + if (!cbargs->silent) + printf (" %*s%-20s (%s) range list [%6" PRIxMAX "]%s\n", + (int) (level * 2), "", dwarf_attr_name (attr), +@@ -7215,10 +7245,11 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + { + ptrdiff_t offset = readp - (unsigned char *) data->d_buf; + Dwarf_CU *cu = last_cu; ++ unsigned int attr = 0; + + if (first && skip_listptr_hole (&known_loclistptr, &listptr_idx, + &address_size, &offset_size, &base, +- &cu, offset, &readp, endp)) ++ &cu, offset, &readp, endp, &attr)) + continue; + + if (last_cu != cu) +@@ -7237,6 +7268,40 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + } + last_cu = cu; + ++ if (attr == DW_AT_GNU_locviews) ++ { ++ Dwarf_Off next_off = next_listptr_offset (&known_loclistptr, ++ listptr_idx); ++ const unsigned char *locp = readp; ++ const unsigned char *locendp; ++ if (next_off == 0) ++ locendp = endp; ++ else ++ locendp = (const unsigned char *) data->d_buf + next_off; ++ ++ while (locp < locendp) ++ { ++ uint64_t v1, v2; ++ get_uleb128 (v1, locp, locendp); ++ if (locp >= locendp) ++ { ++ printf (gettext (" [%6tx] \n"), offset); ++ break; ++ } ++ get_uleb128 (v2, locp, locendp); ++ if (first) /* First view pair in a list. */ ++ printf (" [%6tx] ", offset); ++ else ++ printf (" "); ++ printf ("view pair %" PRId64 ", %" PRId64 "\n", v1, v2); ++ first = false; ++ } ++ ++ first = true; ++ readp = (unsigned char *) locendp; ++ continue; ++ } ++ + if (unlikely (data->d_size - offset < (size_t) address_size * 2)) + { + printf (gettext (" [%6tx] \n"), offset); diff --git a/elfutils.spec b/elfutils.spec index ad00720..8bbc3d8 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.170 -%global baserelease 9 +%global baserelease 10 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -28,6 +28,7 @@ Patch4: elfutils-0.170-core-pid.patch Patch5: elfutils-0.170-elf_sync.patch Patch6: elfutils-0.170-new-notes-hack.patch Patch7: elfutils-0.170-GNU_variable_value.patch +Patch8: elfutils-0.170-locviews.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -187,6 +188,7 @@ cp %SOURCE1 tests/ %patch5 -p1 -b .elf_sync %patch6 -p1 -b .notes_hack %patch7 -p1 -b .variable_value +%patch8 -p1 -b .locviews find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -322,8 +324,9 @@ fi %endif %changelog -* Thu Mar 01 2018 Mark Wielaard +* Thu Mar 01 2018 Mark Wielaard - 0.170-10 - Add elfutils-0.170-GNU_variable_value.patch +- Add elfutils-0.170-locviews.patch * Fri Feb 16 2018 Mark Wielaard - 0.170-9 - Add elfutils-0.170-core-pid.patch From b4219e8099b75e6c34d11cf561c5d867c0374cc4 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 10 Apr 2018 20:41:36 +0200 Subject: [PATCH 057/216] Add explict libstdc++-devel BuildRequires for demangle support. --- elfutils.spec | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/elfutils.spec b/elfutils.spec index 8bbc3d8..ee3ce8a 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -38,6 +38,8 @@ BuildRequires: bison >= 1.875 BuildRequires: flex >= 2.5.4a BuildRequires: bzip2 BuildRequires: gcc >= 4.4 +# For libstdc++ demangle support +BuildRequires: libstdc++-devel BuildRequires: zlib-devel >= 1.2.2.3 BuildRequires: bzip2-devel @@ -324,6 +326,9 @@ fi %endif %changelog +* Thu Apr 10 2018 Mark Wielaard +- Add explict libstdc++-devel BuildRequires for demangle support. + * Thu Mar 01 2018 Mark Wielaard - 0.170-10 - Add elfutils-0.170-GNU_variable_value.patch - Add elfutils-0.170-locviews.patch From 142394ed11d9e716a23d1b3bfbbf93d6b610b9d3 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 11 Apr 2018 10:56:22 +0200 Subject: [PATCH 058/216] 0.170-11 - Add elfutils-0.170-unwind.patch. (#1555726) --- elfutils-0.170-unwind.patch | 128 ++++++++++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.170-unwind.patch diff --git a/elfutils-0.170-unwind.patch b/elfutils-0.170-unwind.patch new file mode 100644 index 0000000..bbadc1b --- /dev/null +++ b/elfutils-0.170-unwind.patch @@ -0,0 +1,128 @@ +commit c049419d96d82e4f5834133d5f68f6054e46f789 +Author: Mark Wielaard +Date: Tue Apr 10 16:13:34 2018 +0200 + + libdwfl: Handle unwind frame when the return address register isn't set. + + When we have unwound the frame and then cannot set the return address + we wouldn't set any error. That meant that a dwfl_thread_getframes () + call could end in an error, but without any dwfl_errno set, producing + the "no error" error message. + + If we cannot set the return address at the end of unwinding the frame + that means that either the return address register is bogus (error), + or that the return address is undefined (end of the call stack). + + This fixes the run-backtrace-native-biarch.sh testcase for me on an + i386 on x86_64 setup with gcc 7.2.1 and glibc 2.17. + + Signed-off-by: Mark Wielaard + +diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c +index eaea495..8da691e 100644 +--- a/libdwfl/frame_unwind.c ++++ b/libdwfl/frame_unwind.c +@@ -632,24 +632,38 @@ handle_cfi (Dwfl_Frame *state, Dwarf_Addr pc, Dwarf_CFI *cfi, Dwarf_Addr bias) + ra_set = true; + } + } +- if (unwound->pc_state == DWFL_FRAME_STATE_ERROR +- && __libdwfl_frame_reg_get (unwound, +- frame->fde->cie->return_address_register, +- &unwound->pc)) ++ if (unwound->pc_state == DWFL_FRAME_STATE_ERROR) + { +- /* PPC32 __libc_start_main properly CFI-unwinds PC as zero. Currently +- none of the archs supported for unwinding have zero as a valid PC. */ +- if (unwound->pc == 0) +- unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED; ++ if (__libdwfl_frame_reg_get (unwound, ++ frame->fde->cie->return_address_register, ++ &unwound->pc)) ++ { ++ /* PPC32 __libc_start_main properly CFI-unwinds PC as zero. ++ Currently none of the archs supported for unwinding have ++ zero as a valid PC. */ ++ if (unwound->pc == 0) ++ unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED; ++ else ++ { ++ unwound->pc_state = DWFL_FRAME_STATE_PC_SET; ++ /* In SPARC the return address register actually contains ++ the address of the call instruction instead of the return ++ address. Therefore we add here an offset defined by the ++ backend. Most likely 0. */ ++ unwound->pc += ebl_ra_offset (ebl); ++ } ++ } + else +- { +- unwound->pc_state = DWFL_FRAME_STATE_PC_SET; +- /* In SPARC the return address register actually contains +- the address of the call instruction instead of the return +- address. Therefore we add here an offset defined by the +- backend. Most likely 0. */ +- unwound->pc += ebl_ra_offset (ebl); +- } ++ { ++ /* We couldn't set the return register, either it was bogus, ++ or the return pc is undefined, maybe end of call stack. */ ++ unsigned pcreg = frame->fde->cie->return_address_register; ++ if (! ebl_dwarf_to_regno (ebl, &pcreg) ++ || pcreg >= ebl_frame_nregs (ebl)) ++ __libdwfl_seterrno (DWFL_E_INVALID_REGISTER); ++ else ++ unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED; ++ } + } + free (frame); + } + +commit 7be459fa531b1284408bf16616422b8dbf193278 +Author: Mark Wielaard +Date: Wed Apr 11 10:37:45 2018 +0200 + + aarch64: Add default cfi rule to restore SP from CFA address. + + The CFA is set by default to the stack pointer of the previous frame. + So that is also how we can always restore the SP. This default aarch64 + CFI rule is necessary on Fedora 28 with GCC8 to make the run-deleted.sh + and run-backtrace-dwarf.sh testcases work. + + Signed-off-by: Mark Wielaard + +diff --git a/backends/aarch64_cfi.c b/backends/aarch64_cfi.c +index acbb9b6..a5579ab 100644 +--- a/backends/aarch64_cfi.c ++++ b/backends/aarch64_cfi.c +@@ -1,5 +1,5 @@ +-/* arm ABI-specified defaults for DWARF CFI. +- Copyright (C) 2013 Red Hat, Inc. ++/* arm64 ABI-specified defaults for DWARF CFI. ++ Copyright (C) 2013, 2018 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -62,6 +62,9 @@ aarch64_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info) + /* The Frame Pointer (FP, r29) and Link Register (LR, r30). */ + SV (29), SV (30), + ++ /* The Stack Pointer (r31) is restored from CFA address by default. */ ++ DW_CFA_val_offset, ULEB128_7 (31), ULEB128_7 (0), ++ + /* Callee-saved fpregs v8-v15. v0 == 64. */ + SV (72), SV (73), SV (74), SV (75), + SV (76), SV (77), SV (78), SV (79), +diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh +index 376a6dc..fd89d02 100755 +--- a/tests/run-addrcfi.sh ++++ b/tests/run-addrcfi.sh +@@ -3637,7 +3637,7 @@ dwarf_cfi_addrframe (.eh_frame): no matching address range + integer reg28 (x28): same_value + integer reg29 (x29): same_value + integer reg30 (x30): same_value +- integer reg31 (sp): undefined ++ integer reg31 (sp): location expression: call_frame_cfa stack_value + integer reg33 (elr): undefined + FP/SIMD reg64 (v0): undefined + FP/SIMD reg65 (v1): undefined diff --git a/elfutils.spec b/elfutils.spec index ee3ce8a..946e02f 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.170 -%global baserelease 10 +%global baserelease 11 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -29,6 +29,7 @@ Patch5: elfutils-0.170-elf_sync.patch Patch6: elfutils-0.170-new-notes-hack.patch Patch7: elfutils-0.170-GNU_variable_value.patch Patch8: elfutils-0.170-locviews.patch +Patch9: elfutils-0.170-unwind.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -191,6 +192,7 @@ cp %SOURCE1 tests/ %patch6 -p1 -b .notes_hack %patch7 -p1 -b .variable_value %patch8 -p1 -b .locviews +%patch9 -p1 -b .unwind find . -name \*.sh ! -perm -0100 -print | xargs chmod +x @@ -326,8 +328,9 @@ fi %endif %changelog -* Thu Apr 10 2018 Mark Wielaard +* Wed Apr 11 2018 Mark Wielaard - 0.170-11 - Add explict libstdc++-devel BuildRequires for demangle support. +- Add elfutils-0.170-unwind.patch. (#1555726) * Thu Mar 01 2018 Mark Wielaard - 0.170-10 - Add elfutils-0.170-GNU_variable_value.patch From f7f48060a60cc7d4237785975039ca5e8e59d179 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 2 Jun 2018 00:09:02 +0200 Subject: [PATCH 059/216] 0.171-1 - New upstream release. - DWARF5 and split dwarf, including GNU DebugFission, support. - readelf: Handle all new DWARF5 sections. --debug-dump=info+ will show split unit DIEs when found. --dwarf-skeleton can be used when inspecting a .dwo file. Recognizes GNU locviews with --debug-dump=loc. - libdw: New functions dwarf_die_addr_die, dwarf_get_units, dwarf_getabbrevattr_data and dwarf_cu_info. libdw will now try to resolve the alt file on first use when not set yet with dwarf_set_alt. dwarf_aggregate_size() now works with multi-dimensional arrays. - libdwfl: Use process_vm_readv when available instead of ptrace. - backends: Add a RISC-V backend. --- .gitignore | 1 + elfutils-0.170-GNU_variable_value.patch | 46 - elfutils-0.170-core-pid.patch | 120 -- elfutils-0.170-dwarf_aggregate_size.patch | 170 --- elfutils-0.170-elf_sync.patch | 306 ----- elfutils-0.170-locviews.patch | 1270 ------------------ elfutils-0.170-m68k-packed-not-aligned.patch | 67 - elfutils-0.170-new-notes-hack.patch | 25 - elfutils-0.170-sys-ptrace.patch | 113 -- elfutils-0.170-unwind.patch | 128 -- elfutils-0.171-new-notes-hack.patch | 30 + elfutils.spec | 43 +- sources | 2 +- testfile-sizes3.o.bz2 | Bin 1208 -> 0 bytes 14 files changed, 53 insertions(+), 2268 deletions(-) delete mode 100644 elfutils-0.170-GNU_variable_value.patch delete mode 100644 elfutils-0.170-core-pid.patch delete mode 100644 elfutils-0.170-dwarf_aggregate_size.patch delete mode 100644 elfutils-0.170-elf_sync.patch delete mode 100644 elfutils-0.170-locviews.patch delete mode 100644 elfutils-0.170-m68k-packed-not-aligned.patch delete mode 100644 elfutils-0.170-new-notes-hack.patch delete mode 100644 elfutils-0.170-sys-ptrace.patch delete mode 100644 elfutils-0.170-unwind.patch create mode 100644 elfutils-0.171-new-notes-hack.patch delete mode 100644 testfile-sizes3.o.bz2 diff --git a/.gitignore b/.gitignore index a5b5128..55cd66b 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ /elfutils-0.168.tar.bz2 /elfutils-0.169.tar.bz2 /elfutils-0.170.tar.bz2 +/elfutils-0.171.tar.bz2 diff --git a/elfutils-0.170-GNU_variable_value.patch b/elfutils-0.170-GNU_variable_value.patch deleted file mode 100644 index 8ff5f5c..0000000 --- a/elfutils-0.170-GNU_variable_value.patch +++ /dev/null @@ -1,46 +0,0 @@ -commit e23c71330c3b332d19fdf9e48ca8b03680d9ad34 -Author: Mark Wielaard -Date: Thu Nov 2 16:23:24 2017 +0100 - - readelf: Handle DW_OP_GNU_variable_value. - - Also format both DW_OP_call_ref and DW_OP_GNU_variable_value argument - as a normal DIE reference. - - Signed-off-by: Mark Wielaard - -diff --git a/libdw/dwarf.h b/libdw/dwarf.h -index 902d261..8edf719 100644 ---- a/libdw/dwarf.h -+++ b/libdw/dwarf.h -@@ -545,6 +545,7 @@ enum - DW_OP_GNU_convert = 0xf7, - DW_OP_GNU_reinterpret = 0xf9, - DW_OP_GNU_parameter_ref = 0xfa, -+ DW_OP_GNU_variable_value = 0xfd, - - DW_OP_lo_user = 0xe0, /* Implementation-defined range start. */ - DW_OP_hi_user = 0xff /* Implementation-defined range end. */ -diff --git a/src/readelf.c b/src/readelf.c -index 5e2f3fc..833884b 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -4160,6 +4160,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - break; - - case DW_OP_call_ref: -+ case DW_OP_GNU_variable_value: - /* Offset operand. */ - if (ref_size != 4 && ref_size != 8) - goto invalid; /* Cannot be used in CFA. */ -@@ -4170,8 +4171,8 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - addr = read_8ubyte_unaligned (dbg, data); - data += ref_size; - CONSUME (ref_size); -- -- printf ("%*s[%4" PRIuMAX "] %s %#" PRIxMAX "\n", -+ /* addr is a DIE offset, so format it as one. */ -+ printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", - indent, "", (uintmax_t) offset, - op_name, (uintmax_t) addr); - offset += 1 + ref_size; diff --git a/elfutils-0.170-core-pid.patch b/elfutils-0.170-core-pid.patch deleted file mode 100644 index 6354f21..0000000 --- a/elfutils-0.170-core-pid.patch +++ /dev/null @@ -1,120 +0,0 @@ -commit 699a741b488010d56cc358a5f7b4d8a8f4886347 -Author: Mark Wielaard -Date: Sat Dec 23 23:16:24 2017 +0100 - - tests: Try to use coredumpctl to extract core files. - - If systemd-coredump is installed we have to use coredumpctl to extract - the core file to test. Unfortunately systemd-coredump/coredumpctl seem - to be somewhat fragile if multiple core dumps are generated/extracted - at the same time. So use a lock file to only run one core dump test at - a time (under make -j). - - Signed-off-by: Mark Wielaard - -diff --git a/tests/Makefile.am b/tests/Makefile.am -index fca0072..64cb5bd 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -515,6 +515,9 @@ dwarf_default_lower_bound_LDADD = $(libdw) - system_elf_libelf_test_CPPFLAGS = - system_elf_libelf_test_LDADD = $(libelf) - -+# A lock file used to make sure only one test dumps core at a time -+CLEANFILES += core-dump-backtrace.lock -+ - if GCOV - check: check-am coverage - .PHONY: coverage -diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh -index c1f3156..e04a7ea 100644 ---- a/tests/backtrace-subr.sh -+++ b/tests/backtrace-subr.sh -@@ -137,19 +137,46 @@ check_native() - # Backtrace core file. - check_native_core() - { -+# systemd-coredump/coredumpctl doesn't seem to like concurrent core dumps -+# use a lock file (fd 200) tests/core-dump-backtrace.lock -+( - child=$1 - - # Disable valgrind while dumping core. - SAVED_VALGRIND_CMD="$VALGRIND_CMD" - unset VALGRIND_CMD - -+ # Wait for lock for 10 seconds or skip. -+ flock -x -w 10 200 || exit 77; -+ - # Skip the test if we cannot adjust core ulimit. -- core="core.`ulimit -c unlimited || exit 77; set +ex; testrun ${abs_builddir}/$child --gencore; true`" -+ pid="`ulimit -c unlimited || exit 77; set +ex; testrun ${abs_builddir}/$child --gencore; true`" -+ core="core.$pid" - # see if /proc/sys/kernel/core_uses_pid is set to 0 - if [ -f core ]; then - mv core "$core" - fi -- if [ ! -f "$core" ]; then echo "No $core file generated"; exit 77; fi -+ type -P coredumpctl && have_coredumpctl=1 || have_coredumpctl=0 -+ if [ ! -f "$core" -a $have_coredumpctl -eq 1 ]; then -+ # Maybe systemd-coredump took it. But give it some time to dump first... -+ sleep 1 -+ coredumpctl --output="$core" dump $pid || rm -f $core -+ -+ # Try a couple of times after waiting some more if something went wrong... -+ if [ ! -f "$core" ]; then -+ sleep 2 -+ coredumpctl --output="$core" dump $pid || rm -f $core -+ fi -+ -+ if [ ! -f "$core" ]; then -+ sleep 3 -+ coredumpctl --output="$core" dump $pid || rm -f $core -+ fi -+ fi -+ if [ ! -f "$core" ]; then -+ echo "No $core file generated"; -+ exit 77; -+ fi - - if [ "x$SAVED_VALGRIND_CMD" != "x" ]; then - VALGRIND_CMD="$SAVED_VALGRIND_CMD" -@@ -163,4 +190,6 @@ check_native_core() - cat $core.{bt,err} - check_native_unsupported $core.err $child-$core - check_all $core.{bt,err} $child-$core -+ rm $core{,.{bt,err}} -+) 200>${abs_builddir}/core-dump-backtrace.lock - } - -commit 61e33d72788c58467668b2f2ad44d5b95ebbee80 -Author: Mark Wielaard -Date: Fri Feb 16 20:34:25 2018 +0100 - - tests: Accept any core if no core with the "correct" pid can be found. - - In some containers our view of pids is confused. We see the container - pid namespace, but the core is generated using the host pid namespace. - Since tests are run in a new fresh directory any core here is most like - is ours. - - Signed-off-by: Mark Wielaard - -diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh -index e04a7ea..ff42c6f 100644 ---- a/tests/backtrace-subr.sh -+++ b/tests/backtrace-subr.sh -@@ -174,6 +174,13 @@ check_native_core() - fi - fi - if [ ! -f "$core" ]; then -+ # In some containers our view of pids is confused. Since tests are -+ # run in a new fresh directory any core here is most like is ours. -+ if ls core.[0-9]* 1> /dev/null 2>&1; then -+ mv core.[0-9]* "$core" -+ fi -+ fi -+ if [ ! -f "$core" ]; then - echo "No $core file generated"; - exit 77; - fi diff --git a/elfutils-0.170-dwarf_aggregate_size.patch b/elfutils-0.170-dwarf_aggregate_size.patch deleted file mode 100644 index 895458e..0000000 --- a/elfutils-0.170-dwarf_aggregate_size.patch +++ /dev/null @@ -1,170 +0,0 @@ -From a2246aaad96e062eb3bab55af9526aaa70adcfd0 Mon Sep 17 00:00:00 2001 -From: Dima Kogan -Date: Fri, 8 Dec 2017 01:45:10 -0800 -Subject: [PATCH 1/2] libdw: dwarf_aggregate_size() works with - multi-dimensional arrays - -If we have a multidimensional array of dimensions (a,b,c) the number of elements -should be a*b*c, but prior to this patch dwarf_aggregate_size() would report -a+b+c instead. - -This patch fixes the bug and adds a test that demonstrates the bug (the test -fails without the functional part of this patch). - -Fixes: https://sourceware.org/bugzilla/show_bug.cgi?id=22546 - -Signed-off-by: Dima Kogan ---- - libdw/ChangeLog | 5 +++++ - libdw/dwarf_aggregate_size.c | 43 ++++++++++++++++++++++--------------------- - tests/ChangeLog | 6 ++++++ - tests/run-aggregate-size.sh | 2 ++ - tests/run-peel-type.sh | 1 + - tests/testfile-sizes3.o.bz2 | Bin 1147 -> 1208 bytes - 6 files changed, 36 insertions(+), 21 deletions(-) - -diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c -index 838468d..3010c0a 100644 ---- a/libdw/dwarf_aggregate_size.c -+++ b/libdw/dwarf_aggregate_size.c -@@ -63,7 +63,7 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, - return -1; - - bool any = false; -- Dwarf_Word total = 0; -+ Dwarf_Word count_total = 1; - do - { - Dwarf_Word count; -@@ -134,34 +134,35 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, - continue; - } - -- /* This is a subrange_type or enumeration_type and we've set COUNT. -- Now determine the stride for this array dimension. */ -- Dwarf_Word stride = eltsize; -- if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_byte_stride, -- attr_mem) != NULL) -- { -- if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) -- return -1; -- } -- else if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_bit_stride, -- attr_mem) != NULL) -- { -- if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) -- return -1; -- if (stride % 8) /* XXX maybe compute in bits? */ -- return -1; -- stride /= 8; -- } -+ count_total *= count; - - any = true; -- total += stride * count; - } - while (INTUSE(dwarf_siblingof) (&child, &child) == 0); - - if (!any) - return -1; - -- *size = total; -+ /* This is a subrange_type or enumeration_type and we've set COUNT. -+ Now determine the stride for this array. */ -+ Dwarf_Word stride = eltsize; -+ if (INTUSE(dwarf_attr_integrate) (die, DW_AT_byte_stride, -+ attr_mem) != NULL) -+ { -+ if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) -+ return -1; -+ } -+ else if (INTUSE(dwarf_attr_integrate) (die, DW_AT_bit_stride, -+ attr_mem) != NULL) -+ { -+ if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) -+ return -1; -+ if (stride % 8) /* XXX maybe compute in bits? */ -+ return -1; -+ stride /= 8; -+ } -+ -+ *size = count_total * stride; - return 0; - } - -diff --git a/tests/run-aggregate-size.sh b/tests/run-aggregate-size.sh -index 42b0742..6d8aa24 100755 ---- a/tests/run-aggregate-size.sh -+++ b/tests/run-aggregate-size.sh -@@ -54,6 +54,7 @@ - # volatile int ia[32]; - # const volatile void * const volatile restrict va[64]; - # struct s sa[8]; -+# double d3d[3][4][5]; - # - # typedef const int foo; - # typedef volatile foo bar; -@@ -98,6 +99,7 @@ ca size 16 - ia size 128 - va size 512 - sa size 128 -+d3d size 480 - f size 4 - b size 4 - EOF -diff --git a/tests/run-peel-type.sh b/tests/run-peel-type.sh -index 7fd96e8..668e316 100755 ---- a/tests/run-peel-type.sh -+++ b/tests/run-peel-type.sh -@@ -55,6 +55,7 @@ ca raw type array_type - ia raw type array_type - va raw type array_type - sa raw type array_type -+d3d raw type array_type - f raw type base_type - b raw type base_type - EOF - --- -1.8.3.1 - -From c25dc62e59dc42378370602b0d05415a42b051d6 Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Mon, 11 Dec 2017 23:58:34 +0100 -Subject: [PATCH 2/2] libdw: dwarf_aggregate_size should not peel the given - DIE. - -Reserve memory for a new DIE first. The caller might not care, but it -isn't really nice to change the DIE the caller gave us. - -See also https://sourceware.org/bugzilla/show_bug.cgi?id=22546#c5 - -Signed-off-by: Mark Wielaard ---- - libdw/ChangeLog | 5 +++++ - libdw/dwarf_aggregate_size.c | 6 +++--- - 2 files changed, 8 insertions(+), 3 deletions(-) - -diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c -index 3010c0a..6e50185 100644 ---- a/libdw/dwarf_aggregate_size.c -+++ b/libdw/dwarf_aggregate_size.c -@@ -199,12 +199,12 @@ aggregate_size (Dwarf_Die *die, Dwarf_Word *size, Dwarf_Die *type_mem) - int - dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size) - { -- Dwarf_Die type_mem; -+ Dwarf_Die die_mem, type_mem; - -- if (INTUSE (dwarf_peel_type) (die, die) != 0) -+ if (INTUSE (dwarf_peel_type) (die, &die_mem) != 0) - return -1; - -- return aggregate_size (die, size, &type_mem); -+ return aggregate_size (&die_mem, size, &type_mem); - } - INTDEF (dwarf_aggregate_size) - OLD_VERSION (dwarf_aggregate_size, ELFUTILS_0.144) --- -1.8.3.1 - diff --git a/elfutils-0.170-elf_sync.patch b/elfutils-0.170-elf_sync.patch deleted file mode 100644 index 1d116e2..0000000 --- a/elfutils-0.170-elf_sync.patch +++ /dev/null @@ -1,306 +0,0 @@ -commit 6d2e7e7100429df3d548251e9685a1eb7bb434cb -Author: Mark Wielaard -Date: Tue Aug 15 22:43:01 2017 +0200 - - libelf: Sync elf.h from glibc. - - Add new powerpc note descriptors. - - Signed-off-by: Mark Wielaard - -diff --git a/libelf/elf.h b/libelf/elf.h -index fa35203..84a7126 100644 ---- a/libelf/elf.h -+++ b/libelf/elf.h -@@ -1,5 +1,5 @@ - /* This file defines standard ELF types, structures, and macros. -- Copyright (C) 1995-2016 Free Software Foundation, Inc. -+ Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or -@@ -762,8 +762,23 @@ typedef struct - #define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */ - #define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */ - #define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ -+#define NT_PPC_TAR 0x103 /* Target Address Register */ -+#define NT_PPC_PPR 0x104 /* Program Priority Register */ -+#define NT_PPC_DSCR 0x105 /* Data Stream Control Register */ -+#define NT_PPC_EBB 0x106 /* Event Based Branch Registers */ -+#define NT_PPC_PMU 0x107 /* Performance Monitor Registers */ -+#define NT_PPC_TM_CGPR 0x108 /* TM checkpointed GPR Registers */ -+#define NT_PPC_TM_CFPR 0x109 /* TM checkpointed FPR Registers */ -+#define NT_PPC_TM_CVMX 0x10a /* TM checkpointed VMX Registers */ -+#define NT_PPC_TM_CVSX 0x10b /* TM checkpointed VSX Registers */ -+#define NT_PPC_TM_SPR 0x10c /* TM Special Purpose Registers */ -+#define NT_PPC_TM_CTAR 0x10d /* TM checkpointed Target Address -+ Register */ -+#define NT_PPC_TM_CPPR 0x10e /* TM checkpointed Program Priority -+ Register */ -+#define NT_PPC_TM_CDSCR 0x10f /* TM checkpointed Data Stream Control -+ Register */ - #define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */ --#define NT_PPC_TM_SPR 0x10c /* PowerPC HW Transactional Memory SPRs */ - #define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */ - #define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */ - #define NT_S390_HIGH_GPRS 0x300 /* s390 upper register halves */ -@@ -1171,6 +1186,18 @@ typedef struct - #define AT_L2_CACHESHAPE 36 - #define AT_L3_CACHESHAPE 37 - -+/* Shapes of the caches, with more room to describe them. -+ *GEOMETRY are comprised of cache line size in bytes in the bottom 16 bits -+ and the cache associativity in the next 16 bits. */ -+#define AT_L1I_CACHESIZE 40 -+#define AT_L1I_CACHEGEOMETRY 41 -+#define AT_L1D_CACHESIZE 42 -+#define AT_L1D_CACHEGEOMETRY 43 -+#define AT_L2_CACHESIZE 44 -+#define AT_L2_CACHEGEOMETRY 45 -+#define AT_L3_CACHESIZE 46 -+#define AT_L3_CACHEGEOMETRY 47 -+ - /* Note section contents. Each entry in the note section begins with - a header of a fixed form. */ - -@@ -2533,9 +2560,10 @@ enum - #define DT_PPC64_OPT (DT_LOPROC + 3) - #define DT_PPC64_NUM 4 - --/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry. */ -+/* PowerPC64 specific bits in the DT_PPC64_OPT Dyn entry. */ - #define PPC64_OPT_TLS 1 - #define PPC64_OPT_MULTI_TOC 2 -+#define PPC64_OPT_LOCALENTRY 4 - - /* PowerPC64 specific values for the Elf64_Sym st_other field. */ - #define STO_PPC64_LOCAL_BIT 5 -@@ -3683,6 +3711,68 @@ enum - #define R_BPF_NONE 0 /* No reloc */ - #define R_BPF_MAP_FD 1 /* Map fd to pointer */ - -+/* Imagination Meta specific relocations. */ -+ -+#define R_METAG_HIADDR16 0 -+#define R_METAG_LOADDR16 1 -+#define R_METAG_ADDR32 2 /* 32bit absolute address */ -+#define R_METAG_NONE 3 /* No reloc */ -+#define R_METAG_RELBRANCH 4 -+#define R_METAG_GETSETOFF 5 -+ -+/* Backward compatability */ -+#define R_METAG_REG32OP1 6 -+#define R_METAG_REG32OP2 7 -+#define R_METAG_REG32OP3 8 -+#define R_METAG_REG16OP1 9 -+#define R_METAG_REG16OP2 10 -+#define R_METAG_REG16OP3 11 -+#define R_METAG_REG32OP4 12 -+ -+#define R_METAG_HIOG 13 -+#define R_METAG_LOOG 14 -+ -+#define R_METAG_REL8 15 -+#define R_METAG_REL16 16 -+ -+/* GNU */ -+#define R_METAG_GNU_VTINHERIT 30 -+#define R_METAG_GNU_VTENTRY 31 -+ -+/* PIC relocations */ -+#define R_METAG_HI16_GOTOFF 32 -+#define R_METAG_LO16_GOTOFF 33 -+#define R_METAG_GETSET_GOTOFF 34 -+#define R_METAG_GETSET_GOT 35 -+#define R_METAG_HI16_GOTPC 36 -+#define R_METAG_LO16_GOTPC 37 -+#define R_METAG_HI16_PLT 38 -+#define R_METAG_LO16_PLT 39 -+#define R_METAG_RELBRANCH_PLT 40 -+#define R_METAG_GOTOFF 41 -+#define R_METAG_PLT 42 -+#define R_METAG_COPY 43 -+#define R_METAG_JMP_SLOT 44 -+#define R_METAG_RELATIVE 45 -+#define R_METAG_GLOB_DAT 46 -+ -+/* TLS relocations */ -+#define R_METAG_TLS_GD 47 -+#define R_METAG_TLS_LDM 48 -+#define R_METAG_TLS_LDO_HI16 49 -+#define R_METAG_TLS_LDO_LO16 50 -+#define R_METAG_TLS_LDO 51 -+#define R_METAG_TLS_IE 52 -+#define R_METAG_TLS_IENONPIC 53 -+#define R_METAG_TLS_IENONPIC_HI16 54 -+#define R_METAG_TLS_IENONPIC_LO16 55 -+#define R_METAG_TLS_TPOFF 56 -+#define R_METAG_TLS_DTPMOD 57 -+#define R_METAG_TLS_DTPOFF 58 -+#define R_METAG_TLS_LE 59 -+#define R_METAG_TLS_LE_HI16 60 -+#define R_METAG_TLS_LE_LO16 61 -+ - __END_DECLS - - #endif /* elf.h */ -commit 88f3d2daa107b09fdba376a82bce7ed534c93645 -Author: Mark Wielaard -Date: Sat Feb 17 00:23:19 2018 +0100 - - libelf: Sync elf.h from glibc. - - Signed-off-by: Mark Wielaard - -diff --git a/libelf/elf.h b/libelf/elf.h -index 84a7126..4f43577 100644 ---- a/libelf/elf.h -+++ b/libelf/elf.h -@@ -1,5 +1,5 @@ - /* This file defines standard ELF types, structures, and macros. -- Copyright (C) 1995-2017 Free Software Foundation, Inc. -+ Copyright (C) 1995-2018 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or -@@ -739,6 +739,8 @@ typedef struct - /* Legal values for note segment descriptor types for core files. */ - - #define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ -+#define NT_PRFPREG 2 /* Contains copy of fpregset -+ struct. */ - #define NT_FPREGSET 2 /* Contains copy of fpregset struct */ - #define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ - #define NT_PRXREG 4 /* Contains copy of prxregset struct */ -@@ -790,11 +792,20 @@ typedef struct - #define NT_S390_LAST_BREAK 0x306 /* s390 breaking event address */ - #define NT_S390_SYSTEM_CALL 0x307 /* s390 system call restart data */ - #define NT_S390_TDB 0x308 /* s390 transaction diagnostic block */ -+#define NT_S390_VXRS_LOW 0x309 /* s390 vector registers 0-15 -+ upper half. */ -+#define NT_S390_VXRS_HIGH 0x30a /* s390 vector registers 16-31. */ -+#define NT_S390_GS_CB 0x30b /* s390 guarded storage registers. */ -+#define NT_S390_GS_BC 0x30c /* s390 guarded storage -+ broadcast control block. */ -+#define NT_S390_RI_CB 0x30d /* s390 runtime instrumentation. */ - #define NT_ARM_VFP 0x400 /* ARM VFP/NEON registers */ - #define NT_ARM_TLS 0x401 /* ARM TLS register */ - #define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */ - #define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */ - #define NT_ARM_SYSTEM_CALL 0x404 /* ARM system call number */ -+#define NT_ARM_SVE 0x405 /* ARM Scalable Vector Extension -+ registers */ - - /* Legal values for the note segment descriptor types for object files. */ - -@@ -859,7 +870,8 @@ typedef struct - #define DT_ENCODING 32 /* Start of encoded range */ - #define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/ - #define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */ --#define DT_NUM 34 /* Number used */ -+#define DT_SYMTAB_SHNDX 34 /* Address of SYMTAB_SHNDX section */ -+#define DT_NUM 35 /* Number used */ - #define DT_LOOS 0x6000000d /* Start of OS-specific */ - #define DT_HIOS 0x6ffff000 /* End of OS-specific */ - #define DT_LOPROC 0x70000000 /* Start of processor-specific */ -@@ -967,6 +979,8 @@ typedef struct - #define DF_1_SYMINTPOSE 0x00800000 /* Object has individual interposers. */ - #define DF_1_GLOBAUDIT 0x01000000 /* Global auditing required. */ - #define DF_1_SINGLETON 0x02000000 /* Singleton symbols are used. */ -+#define DF_1_STUB 0x04000000 -+#define DF_1_PIE 0x08000000 - - /* Flags for the feature selection in DT_FEATURE_1. */ - #define DTF_1_PARINIT 0x00000001 -@@ -1263,6 +1277,62 @@ typedef struct - /* Version note generated by GNU gold containing a version string. */ - #define NT_GNU_GOLD_VERSION 4 - -+/* Program property. */ -+#define NT_GNU_PROPERTY_TYPE_0 5 -+ -+/* Note section name of program property. */ -+#define NOTE_GNU_PROPERTY_SECTION_NAME ".note.gnu.property" -+ -+/* Values used in GNU .note.gnu.property notes (NT_GNU_PROPERTY_TYPE_0). */ -+ -+/* Stack size. */ -+#define GNU_PROPERTY_STACK_SIZE 1 -+/* No copy relocation on protected data symbol. */ -+#define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2 -+ -+/* Processor-specific semantics, lo */ -+#define GNU_PROPERTY_LOPROC 0xc0000000 -+/* Processor-specific semantics, hi */ -+#define GNU_PROPERTY_HIPROC 0xdfffffff -+/* Application-specific semantics, lo */ -+#define GNU_PROPERTY_LOUSER 0xe0000000 -+/* Application-specific semantics, hi */ -+#define GNU_PROPERTY_HIUSER 0xffffffff -+ -+/* The x86 instruction sets indicated by the corresponding bits are -+ used in program. Their support in the hardware is optional. */ -+#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000 -+/* The x86 instruction sets indicated by the corresponding bits are -+ used in program and they must be supported by the hardware. */ -+#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001 -+/* X86 processor-specific features used in program. */ -+#define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002 -+ -+#define GNU_PROPERTY_X86_ISA_1_486 (1U << 0) -+#define GNU_PROPERTY_X86_ISA_1_586 (1U << 1) -+#define GNU_PROPERTY_X86_ISA_1_686 (1U << 2) -+#define GNU_PROPERTY_X86_ISA_1_SSE (1U << 3) -+#define GNU_PROPERTY_X86_ISA_1_SSE2 (1U << 4) -+#define GNU_PROPERTY_X86_ISA_1_SSE3 (1U << 5) -+#define GNU_PROPERTY_X86_ISA_1_SSSE3 (1U << 6) -+#define GNU_PROPERTY_X86_ISA_1_SSE4_1 (1U << 7) -+#define GNU_PROPERTY_X86_ISA_1_SSE4_2 (1U << 8) -+#define GNU_PROPERTY_X86_ISA_1_AVX (1U << 9) -+#define GNU_PROPERTY_X86_ISA_1_AVX2 (1U << 10) -+#define GNU_PROPERTY_X86_ISA_1_AVX512F (1U << 11) -+#define GNU_PROPERTY_X86_ISA_1_AVX512CD (1U << 12) -+#define GNU_PROPERTY_X86_ISA_1_AVX512ER (1U << 13) -+#define GNU_PROPERTY_X86_ISA_1_AVX512PF (1U << 14) -+#define GNU_PROPERTY_X86_ISA_1_AVX512VL (1U << 15) -+#define GNU_PROPERTY_X86_ISA_1_AVX512DQ (1U << 16) -+#define GNU_PROPERTY_X86_ISA_1_AVX512BW (1U << 17) -+ -+/* This indicates that all executable sections are compatible with -+ IBT. */ -+#define GNU_PROPERTY_X86_FEATURE_1_IBT (1U << 0) -+/* This indicates that all executable sections are compatible with -+ SHSTK. */ -+#define GNU_PROPERTY_X86_FEATURE_1_SHSTK (1U << 1) - - /* Move records. */ - typedef struct -@@ -3706,6 +3776,28 @@ enum - - #define R_TILEGX_NUM 130 - -+/* RISC-V ELF Flags */ -+#define EF_RISCV_RVC 0x0001 -+#define EF_RISCV_FLOAT_ABI 0x0006 -+#define EF_RISCV_FLOAT_ABI_SOFT 0x0000 -+#define EF_RISCV_FLOAT_ABI_SINGLE 0x0002 -+#define EF_RISCV_FLOAT_ABI_DOUBLE 0x0004 -+#define EF_RISCV_FLOAT_ABI_QUAD 0x0006 -+ -+/* RISC-V relocations. */ -+#define R_RISCV_NONE 0 -+#define R_RISCV_32 1 -+#define R_RISCV_64 2 -+#define R_RISCV_RELATIVE 3 -+#define R_RISCV_COPY 4 -+#define R_RISCV_JUMP_SLOT 5 -+#define R_RISCV_TLS_DTPMOD32 6 -+#define R_RISCV_TLS_DTPMOD64 7 -+#define R_RISCV_TLS_DTPREL32 8 -+#define R_RISCV_TLS_DTPREL64 9 -+#define R_RISCV_TLS_TPREL32 10 -+#define R_RISCV_TLS_TPREL64 11 -+ - /* BPF specific declarations. */ - - #define R_BPF_NONE 0 /* No reloc */ diff --git a/elfutils-0.170-locviews.patch b/elfutils-0.170-locviews.patch deleted file mode 100644 index 3709e7b..0000000 --- a/elfutils-0.170-locviews.patch +++ /dev/null @@ -1,1270 +0,0 @@ -commit 704f5fc477efaf120980449e677deb563da8491f -Author: Mark Wielaard -Date: Wed Nov 29 15:43:26 2017 +0100 - - readelf: Adjust print_ops formatting. - - Use only 2 spaces for index (there are never 10000, the most seen in the - wild is 64). Adjust re-indenting after GNU_entry_value. - - Signed-off-by: Mark Wielaard - -diff --git a/src/readelf.c b/src/readelf.c -index a9168d1..2faa1d5 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -1,5 +1,5 @@ - /* Print information from ELF file in human-readable form. -- Copyright (C) 1999-2016 Red Hat, Inc. -+ Copyright (C) 1999-2017 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 1999. - -@@ -4152,7 +4152,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - CONSUME (addrsize); - - char *a = format_dwarf_addr (dwflmod, 0, addr, addr); -- printf ("%*s[%4" PRIuMAX "] %s %s\n", -+ printf ("%*s[%2" PRIuMAX "] %s %s\n", - indent, "", (uintmax_t) offset, op_name, a); - free (a); - -@@ -4172,7 +4172,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - data += ref_size; - CONSUME (ref_size); - /* addr is a DIE offset, so format it as one. */ -- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", -+ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n", - indent, "", (uintmax_t) offset, - op_name, (uintmax_t) addr); - offset += 1 + ref_size; -@@ -4184,7 +4184,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - case DW_OP_const1u: - // XXX value might be modified by relocation - NEED (1); -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu8 "\n", - indent, "", (uintmax_t) offset, - op_name, *((uint8_t *) data)); - ++data; -@@ -4195,7 +4195,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - case DW_OP_const2u: - NEED (2); - // XXX value might be modified by relocation -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu16 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu16 "\n", - indent, "", (uintmax_t) offset, - op_name, read_2ubyte_unaligned (dbg, data)); - CONSUME (2); -@@ -4206,7 +4206,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - case DW_OP_const4u: - NEED (4); - // XXX value might be modified by relocation -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu32 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu32 "\n", - indent, "", (uintmax_t) offset, - op_name, read_4ubyte_unaligned (dbg, data)); - CONSUME (4); -@@ -4217,7 +4217,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - case DW_OP_const8u: - NEED (8); - // XXX value might be modified by relocation -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 "\n", - indent, "", (uintmax_t) offset, - op_name, (uint64_t) read_8ubyte_unaligned (dbg, data)); - CONSUME (8); -@@ -4228,7 +4228,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - case DW_OP_const1s: - NEED (1); - // XXX value might be modified by relocation -- printf ("%*s[%4" PRIuMAX "] %s %" PRId8 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRId8 "\n", - indent, "", (uintmax_t) offset, - op_name, *((int8_t *) data)); - ++data; -@@ -4239,7 +4239,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - case DW_OP_const2s: - NEED (2); - // XXX value might be modified by relocation -- printf ("%*s[%4" PRIuMAX "] %s %" PRId16 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRId16 "\n", - indent, "", (uintmax_t) offset, - op_name, read_2sbyte_unaligned (dbg, data)); - CONSUME (2); -@@ -4250,7 +4250,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - case DW_OP_const4s: - NEED (4); - // XXX value might be modified by relocation -- printf ("%*s[%4" PRIuMAX "] %s %" PRId32 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRId32 "\n", - indent, "", (uintmax_t) offset, - op_name, read_4sbyte_unaligned (dbg, data)); - CONSUME (4); -@@ -4261,7 +4261,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - case DW_OP_const8s: - NEED (8); - // XXX value might be modified by relocation -- printf ("%*s[%4" PRIuMAX "] %s %" PRId64 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRId64 "\n", - indent, "", (uintmax_t) offset, - op_name, read_8sbyte_unaligned (dbg, data)); - CONSUME (8); -@@ -4277,7 +4277,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - uint64_t uleb; - NEED (1); - get_uleb128 (uleb, data, data + len); -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 "\n", - indent, "", (uintmax_t) offset, op_name, uleb); - CONSUME (data - start); - offset += 1 + (data - start); -@@ -4290,7 +4290,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - get_uleb128 (uleb, data, data + len); - NEED (1); - get_uleb128 (uleb2, data, data + len); -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 ", %" PRIu64 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 ", %" PRIu64 "\n", - indent, "", (uintmax_t) offset, op_name, uleb, uleb2); - CONSUME (data - start); - offset += 1 + (data - start); -@@ -4303,7 +4303,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - int64_t sleb; - NEED (1); - get_sleb128 (sleb, data, data + len); -- printf ("%*s[%4" PRIuMAX "] %s %" PRId64 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRId64 "\n", - indent, "", (uintmax_t) offset, op_name, sleb); - CONSUME (data - start); - offset += 1 + (data - start); -@@ -4315,7 +4315,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - get_uleb128 (uleb, data, data + len); - NEED (1); - get_sleb128 (sleb, data, data + len); -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 " %" PRId64 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 " %" PRId64 "\n", - indent, "", (uintmax_t) offset, op_name, uleb, sleb); - CONSUME (data - start); - offset += 1 + (data - start); -@@ -4323,7 +4323,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - - case DW_OP_call2: - NEED (2); -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu16 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu16 "\n", - indent, "", (uintmax_t) offset, op_name, - read_2ubyte_unaligned (dbg, data)); - CONSUME (2); -@@ -4332,7 +4332,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - - case DW_OP_call4: - NEED (4); -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu32 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu32 "\n", - indent, "", (uintmax_t) offset, op_name, - read_4ubyte_unaligned (dbg, data)); - CONSUME (4); -@@ -4342,7 +4342,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - case DW_OP_skip: - case DW_OP_bra: - NEED (2); -- printf ("%*s[%4" PRIuMAX "] %s %" PRIuMAX "\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIuMAX "\n", - indent, "", (uintmax_t) offset, op_name, - (uintmax_t) (offset + read_2sbyte_unaligned (dbg, data) + 3)); - CONSUME (2); -@@ -4354,7 +4354,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - start = data; - NEED (1); - get_uleb128 (uleb, data, data + len); -- printf ("%*s[%4" PRIuMAX "] %s: ", -+ printf ("%*s[%2" PRIuMAX "] %s: ", - indent, "", (uintmax_t) offset, op_name); - NEED (uleb); - print_block (uleb, data); -@@ -4378,7 +4378,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - NEED (1); - get_sleb128 (sleb, data, data + len); - -- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "] %+" PRId64 "\n", -+ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "] %+" PRId64 "\n", - indent, "", (intmax_t) offset, - op_name, (uintmax_t) addr, sleb); - CONSUME (data - start); -@@ -4390,10 +4390,10 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - start = data; - NEED (1); - get_uleb128 (uleb, data, data + len); -- printf ("%*s[%4" PRIuMAX "] %s:\n", -+ printf ("%*s[%2" PRIuMAX "] %s:\n", - indent, "", (uintmax_t) offset, op_name); - NEED (uleb); -- print_ops (dwflmod, dbg, indent + 6, indent + 6, vers, -+ print_ops (dwflmod, dbg, indent + 5, indent + 5, vers, - addrsize, offset_size, cu, uleb, data); - data += uleb; - CONSUME (data - start); -@@ -4411,7 +4411,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - NEED (1); - uint8_t usize = *(uint8_t *) data++; - NEED (usize); -- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "] ", -+ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "] ", - indent, "", (uintmax_t) offset, op_name, uleb); - print_block (usize, data); - data += usize; -@@ -4429,7 +4429,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - get_uleb128 (uleb2, data, data + len); - if (! print_unresolved_addresses && cu != NULL) - uleb2 += cu->start; -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 " [%6" PRIx64 "]\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu64 " [%6" PRIx64 "]\n", - indent, "", (uintmax_t) offset, op_name, uleb, uleb2); - CONSUME (data - start); - offset += 1 + (data - start); -@@ -4445,7 +4445,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - get_uleb128 (uleb, data, data + len); - if (! print_unresolved_addresses && cu != NULL) - uleb += cu->start; -- printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 " [%6" PRIxMAX "]\n", -+ printf ("%*s[%2" PRIuMAX "] %s %" PRIu8 " [%6" PRIxMAX "]\n", - indent, "", (uintmax_t) offset, - op_name, usize, uleb); - CONSUME (data - start); -@@ -4461,7 +4461,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - get_uleb128 (uleb, data, data + len); - if (uleb != 0 && ! print_unresolved_addresses && cu != NULL) - uleb += cu->start; -- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", -+ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n", - indent, "", (uintmax_t) offset, op_name, uleb); - CONSUME (data - start); - offset += 1 + (data - start); -@@ -4474,7 +4474,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - uintmax_t param_off = (uintmax_t) read_4ubyte_unaligned (dbg, data); - if (! print_unresolved_addresses && cu != NULL) - param_off += cu->start; -- printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n", -+ printf ("%*s[%2" PRIuMAX "] %s [%6" PRIxMAX "]\n", - indent, "", (uintmax_t) offset, op_name, param_off); - CONSUME (4); - data += 4; -@@ -4483,7 +4483,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - - default: - /* No Operand. */ -- printf ("%*s[%4" PRIuMAX "] %s\n", -+ printf ("%*s[%2" PRIuMAX "] %s\n", - indent, "", (uintmax_t) offset, op_name); - ++offset; - break; -@@ -4493,7 +4493,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, - continue; - - invalid: -- printf (gettext ("%*s[%4" PRIuMAX "] %s \n"), -+ printf (gettext ("%*s[%2" PRIuMAX "] %s \n"), - indent, "", (uintmax_t) offset, op_name); - break; - } -diff --git a/tests/run-readelf-dwz-multi.sh b/tests/run-readelf-dwz-multi.sh -index 23ca944..139b8c1 100755 ---- a/tests/run-readelf-dwz-multi.sh -+++ b/tests/run-readelf-dwz-multi.sh -@@ -107,7 +107,7 @@ DWARF section [28] '.debug_info' at offset 0x1078: - low_pc (addr) 0x00000000004006ac
- high_pc (udata) 44 (0x00000000004006d8) - frame_base (exprloc) -- [ 0] call_frame_cfa -+ [ 0] call_frame_cfa - GNU_all_tail_call_sites (flag_present) yes - sibling (ref_udata) [ 6e] - [ 48] formal_parameter -@@ -116,21 +116,21 @@ DWARF section [28] '.debug_info' at offset 0x1078: - decl_line (data1) 3 - type (GNU_ref_alt) [ 3e] - location (exprloc) -- [ 0] fbreg -36 -+ [ 0] fbreg -36 - [ 56] formal_parameter - name (strp) "argv" - decl_file (data1) 1 - decl_line (data1) 3 - type (ref_udata) [ 6e] - location (exprloc) -- [ 0] fbreg -48 -+ [ 0] fbreg -48 - [ 61] variable - name (string) "b" - decl_file (data1) 1 - decl_line (data1) 5 - type (GNU_ref_alt) [ 5a] - location (exprloc) -- [ 0] fbreg -32 -+ [ 0] fbreg -32 - [ 6e] pointer_type - byte_size (data1) 8 - type (ref_udata) [ 2b] -@@ -168,7 +168,7 @@ DWARF section [28] '.debug_info' at offset 0x1078: - low_pc (addr) 0x00000000004006ac
- high_pc (udata) 44 (0x00000000004006d8) - frame_base (exprloc) -- [ 0] call_frame_cfa -+ [ 0] call_frame_cfa - GNU_all_tail_call_sites (flag_present) yes - sibling (ref_udata) [ 6e] - [ 48] formal_parameter -@@ -177,21 +177,21 @@ DWARF section [28] '.debug_info' at offset 0x1078: - decl_line (data1) 3 - type (GNU_ref_alt) [ 3e] - location (exprloc) -- [ 0] fbreg -36 -+ [ 0] fbreg -36 - [ 56] formal_parameter - name (strp) "argv" - decl_file (data1) 1 - decl_line (data1) 3 - type (ref_udata) [ 6e] - location (exprloc) -- [ 0] fbreg -48 -+ [ 0] fbreg -48 - [ 61] variable - name (string) "b" - decl_file (data1) 1 - decl_line (data1) 5 - type (GNU_ref_alt) [ 5a] - location (exprloc) -- [ 0] fbreg -32 -+ [ 0] fbreg -32 - [ 6e] pointer_type - byte_size (data1) 8 - type (ref_udata) [ 2b] -@@ -225,7 +225,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: - low_pc (addr) +0x0000000000000670 - high_pc (udata) 23 (+0x0000000000000687) - frame_base (exprloc) -- [ 0] call_frame_cfa -+ [ 0] call_frame_cfa - GNU_all_call_sites (flag_present) yes - [ 41] formal_parameter - name (string) "fb" -@@ -233,7 +233,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: - decl_line (data1) 3 - type (GNU_ref_alt) [ 76] - location (exprloc) -- [ 0] fbreg -24 -+ [ 0] fbreg -24 - EOF - - # Same as above, but find alt debug file in a .dwz subdir. -@@ -265,7 +265,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: - low_pc (addr) +0x0000000000000670 - high_pc (udata) 23 (+0x0000000000000687) - frame_base (exprloc) -- [ 0] call_frame_cfa -+ [ 0] call_frame_cfa - GNU_all_call_sites (flag_present) yes - [ 41] formal_parameter - name (string) "fb" -@@ -273,7 +273,7 @@ DWARF section [25] '.debug_info' at offset 0x106c: - decl_line (data1) 3 - type (GNU_ref_alt) [ 76] - location (exprloc) -- [ 0] fbreg -24 -+ [ 0] fbreg -24 - EOF - mv .dwz/testfile_multi.dwz . - rmdir .dwz -@@ -304,7 +304,7 @@ DWARF section [28] '.debug_info' at offset 0x1088: - low_pc (addr) 0x00000000004004ec
- high_pc (udata) 18 (0x00000000004004fe) - frame_base (exprloc) -- [ 0] call_frame_cfa -+ [ 0] call_frame_cfa - GNU_all_call_sites (flag_present) yes - [ 41] formal_parameter - name (GNU_strp_alt) "argc" -@@ -312,21 +312,21 @@ DWARF section [28] '.debug_info' at offset 0x1088: - decl_line (data1) 8 - type (GNU_ref_alt) [ 30] - location (exprloc) -- [ 0] fbreg -36 -+ [ 0] fbreg -36 - [ 4f] formal_parameter - name (GNU_strp_alt) "argv" - decl_file (data1) 1 - decl_line (data1) 8 - type (GNU_ref_alt) [ 41] - location (exprloc) -- [ 0] fbreg -48 -+ [ 0] fbreg -48 - [ 5d] variable - name (string) "fbb" - decl_file (data1) 1 - decl_line (data1) 10 - type (GNU_ref_alt) [ 14] - location (exprloc) -- [ 0] fbreg -32 -+ [ 0] fbreg -32 - EOF - - exit 0 -diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh -index 98870fc..3959d3d 100755 ---- a/tests/run-readelf-loc.sh -+++ b/tests/run-readelf-loc.sh -@@ -63,9 +63,9 @@ testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=loc --debug-dump=ra - testfileloc<<\EOF - - DWARF section [33] '.debug_loc' at offset 0xd2a: -- [ 0] 0x0000000000400480
..0x000000000040048d [ 0] reg5 -- [ 23] 0x0000000000400485 ..0x000000000040048d [ 0] reg5 -- [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 -+ [ 0] 0x0000000000400480
..0x000000000040048d [ 0] reg5 -+ [ 23] 0x0000000000400485 ..0x000000000040048d [ 0] reg5 -+ [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 - - DWARF section [34] '.debug_ranges' at offset 0xd94: - [ 0] 0x0000000000400480
..0x0000000000400482 -@@ -79,9 +79,9 @@ testrun_compare ${abs_top_builddir}/src/readelf -N --debug-dump=loc --debug-dump - testfileloc<<\EOF - - DWARF section [33] '.debug_loc' at offset 0xd2a: -- [ 0] 0x0000000000400480..0x000000000040048d [ 0] reg5 -- [ 23] 0x0000000000400485..0x000000000040048d [ 0] reg5 -- [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 -+ [ 0] 0x0000000000400480..0x000000000040048d [ 0] reg5 -+ [ 23] 0x0000000000400485..0x000000000040048d [ 0] reg5 -+ [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 - - DWARF section [34] '.debug_ranges' at offset 0xd94: - [ 0] 0x0000000000400480..0x0000000000400482 -@@ -95,9 +95,9 @@ testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc --debug-dump - testfileloc<<\EOF - - DWARF section [33] '.debug_loc' at offset 0xd2a: -- [ 0] 000000000000000000..0x000000000000000d [ 0] reg5 -- [ 23] 0x0000000000000005..0x000000000000000d [ 0] reg5 -- [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 -+ [ 0] 000000000000000000..0x000000000000000d [ 0] reg5 -+ [ 23] 0x0000000000000005..0x000000000000000d [ 0] reg5 -+ [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 - - DWARF section [34] '.debug_ranges' at offset 0xd94: - [ 0] 000000000000000000..0x0000000000000002 -diff --git a/tests/run-readelf-zdebug-rel.sh b/tests/run-readelf-zdebug-rel.sh -index 1232d63..082971e 100755 ---- a/tests/run-readelf-zdebug-rel.sh -+++ b/tests/run-readelf-zdebug-rel.sh -@@ -69,7 +69,7 @@ DWARF section [ 4] '.debug_info' at offset 0x58: - low_pc (addr) 000000000000000000 - high_pc (data8) 24 (0x0000000000000018) - frame_base (exprloc) -- [ 0] call_frame_cfa -+ [ 0] call_frame_cfa - GNU_all_call_sites (flag_present) yes - sibling (ref4) [ 80] - [ 4e] formal_parameter -@@ -84,7 +84,7 @@ DWARF section [ 4] '.debug_info' at offset 0x58: - decl_line (data1) 4 - type (ref4) [ 87] - location (exprloc) -- [ 0] reg4 -+ [ 0] reg4 - [ 6a] variable - name (string) "a" - decl_file (data1) 1 -@@ -97,7 +97,7 @@ DWARF section [ 4] '.debug_info' at offset 0x58: - decl_line (data1) 7 - type (ref4) [ 9a] - location (exprloc) -- [ 0] reg5 -+ [ 0] reg5 - [ 80] base_type - byte_size (data1) 4 - encoding (data1) signed (5) -@@ -127,12 +127,12 @@ cat info.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=i - cat > loc.out << \EOF - - DWARF section [ 7] '.debug_loc' at offset 0x185: -- [ 0] 000000000000000000..0x0000000000000003 [ 0] reg5 -- 0x0000000000000003..0x0000000000000010 [ 0] breg5 -42 -- [ 2] stack_value -- 0x0000000000000010..0x0000000000000018 [ 0] GNU_entry_value: -- [ 0] reg5 -- [ 3] stack_value -+ [ 0] 000000000000000000..0x0000000000000003 [ 0] reg5 -+ 0x0000000000000003..0x0000000000000010 [ 0] breg5 -42 -+ [ 2] stack_value -+ 0x0000000000000010..0x0000000000000018 [ 0] GNU_entry_value: -+ [ 0] reg5 -+ [ 3] stack_value - EOF - - cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug-rel.o -diff --git a/tests/run-readelf-zdebug.sh b/tests/run-readelf-zdebug.sh -index 37cf7ea..fc666fd 100755 ---- a/tests/run-readelf-zdebug.sh -+++ b/tests/run-readelf-zdebug.sh -@@ -46,12 +46,12 @@ tempfiles loc.out aranges.out ranges.out macro.out line.out frame.out - cat > loc.out << \EOF - - DWARF section [30] '.debug_loc' at offset 0xa17: -- [ 0] 0x00000000004003c0..0x00000000004003c3 [ 0] reg5 -- 0x00000000004003c3..0x00000000004003d6 [ 0] breg5 -42 -- [ 2] stack_value -- 0x00000000004003d6..0x00000000004003d9 [ 0] GNU_entry_value: -- [ 0] reg5 -- [ 3] stack_value -+ [ 0] 0x00000000004003c0..0x00000000004003c3 [ 0] reg5 -+ 0x00000000004003c3..0x00000000004003d6 [ 0] breg5 -42 -+ [ 2] stack_value -+ 0x00000000004003d6..0x00000000004003d9 [ 0] GNU_entry_value: -+ [ 0] reg5 -+ [ 3] stack_value - EOF - - cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug -@@ -476,15 +476,15 @@ Call frame information section [16] '.eh_frame' at offset 0x5b8: - def_cfa_offset 24 - advance_loc 10 to 0x3b0 - def_cfa_expression 11 -- [ 0] breg7 8 -- [ 2] breg16 0 -- [ 4] lit15 -- [ 5] and -- [ 6] lit11 -- [ 7] ge -- [ 8] lit3 -- [ 9] shl -- [ 10] plus -+ [ 0] breg7 8 -+ [ 2] breg16 0 -+ [ 4] lit15 -+ [ 5] and -+ [ 6] lit11 -+ [ 7] ge -+ [ 8] lit3 -+ [ 9] shl -+ [10] plus - nop - nop - nop - -commit 36eabdb739b16b934afe318c786a97c94b47bbf6 -Author: Mark Wielaard -Date: Wed Nov 29 16:27:33 2017 +0100 - - readelf: Print CU, base address and unresolved .debug_range entries. - - Also adjust the formatting for the resolved addresses to print them - on separate lines so they nicely line up even when the addresses are - resolved to symbol+offset names. - - Signed-off-by: Mark Wielaard - -diff --git a/src/readelf.c b/src/readelf.c -index 8661ba8..8e13462 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -5007,15 +5007,33 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, - Dwarf_Addr base = 0; - unsigned char *const endp = (unsigned char *) data->d_buf + data->d_size; - unsigned char *readp = data->d_buf; -+ Dwarf_CU *last_cu = NULL; - while (readp < endp) - { - ptrdiff_t offset = readp - (unsigned char *) data->d_buf; -+ Dwarf_CU *cu; - - if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx, -- &address_size, NULL, &base, NULL, -+ &address_size, NULL, &base, &cu, - offset, &readp, endp)) - continue; - -+ if (last_cu != cu) -+ { -+ char *basestr = format_dwarf_addr (dwflmod, address_size, -+ base, base); -+ Dwarf_Die cudie; -+ if (dwarf_cu_die (cu, &cudie, -+ NULL, NULL, NULL, NULL, -+ NULL, NULL) == NULL) -+ printf (gettext ("\n Unknown CU base: %s\n"), basestr); -+ else -+ printf (gettext ("\n CU [%6" PRIx64 "] base: %s\n"), -+ dwarf_dieoffset (&cudie), basestr); -+ free (basestr); -+ } -+ last_cu = cu; -+ - if (unlikely (data->d_size - offset < (size_t) address_size * 2)) - { - printf (gettext (" [%6tx] \n"), offset); -@@ -5040,29 +5058,36 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, - if (begin == (Dwarf_Addr) -1l) /* Base address entry. */ - { - char *b = format_dwarf_addr (dwflmod, address_size, end, end); -- printf (gettext (" [%6tx] base address %s\n"), offset, b); -+ printf (gettext (" [%6tx] base address\n %s\n"), offset, b); - free (b); - base = end; - } - else if (begin == 0 && end == 0) /* End of list entry. */ - { - if (first) -- printf (gettext (" [%6tx] empty list\n"), offset); -+ printf (gettext (" [%6tx] empty list\n"), offset); - first = true; - } - else - { -- char *b = format_dwarf_addr (dwflmod, address_size, base + begin, -- begin); -- char *e = format_dwarf_addr (dwflmod, address_size, base + end, -- end); - /* We have an address range entry. */ - if (first) /* First address range entry in a list. */ -- printf (gettext (" [%6tx] %s..%s\n"), offset, b, e); -+ printf (" [%6tx] ", offset); - else -- printf (gettext (" %s..%s\n"), b, e); -- free (b); -- free (e); -+ printf (" "); -+ -+ printf ("range %" PRIx64 ", %" PRIx64 "\n", begin, end); -+ if (! print_unresolved_addresses) -+ { -+ char *b = format_dwarf_addr (dwflmod, address_size, base + begin, -+ base + begin); -+ char *e = format_dwarf_addr (dwflmod, address_size, -+ base + end - 1, base + end); -+ printf (" %s..\n", b); -+ printf (" %s\n", e); -+ free (b); -+ free (e); -+ } - - first = false; - } -diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh -index 3959d3d..4b666cf 100755 ---- a/tests/run-readelf-loc.sh -+++ b/tests/run-readelf-loc.sh -@@ -68,10 +68,22 @@ DWARF section [33] '.debug_loc' at offset 0xd2a: - [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 - - DWARF section [34] '.debug_ranges' at offset 0xd94: -- [ 0] 0x0000000000400480
..0x0000000000400482 -- 0x0000000000400485 ..0x000000000040048d -- [ 30] 0x00000000004004ad ..0x00000000004004af -- 0x00000000004004b2 ..0x00000000004004ba -+ -+ CU [ b] base: 0x0000000000400480
-+ [ 0] range 0, 2 -+ 0x0000000000400480
.. -+ 0x0000000000400481 -+ range 5, d -+ 0x0000000000400485 .. -+ 0x000000000040048c -+ -+ CU [ e0] base: 0x00000000004004a0 -+ [ 30] range d, f -+ 0x00000000004004ad .. -+ 0x00000000004004ae -+ range 12, 1a -+ 0x00000000004004b2 .. -+ 0x00000000004004b9 - EOF - - # Don't resolve addresses to symbols. -@@ -84,10 +96,22 @@ DWARF section [33] '.debug_loc' at offset 0xd2a: - [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 - - DWARF section [34] '.debug_ranges' at offset 0xd94: -- [ 0] 0x0000000000400480..0x0000000000400482 -- 0x0000000000400485..0x000000000040048d -- [ 30] 0x00000000004004ad..0x00000000004004af -- 0x00000000004004b2..0x00000000004004ba -+ -+ CU [ b] base: 0x0000000000400480 -+ [ 0] range 0, 2 -+ 0x0000000000400480.. -+ 0x0000000000400481 -+ range 5, d -+ 0x0000000000400485.. -+ 0x000000000040048c -+ -+ CU [ e0] base: 0x00000000004004a0 -+ [ 30] range d, f -+ 0x00000000004004ad.. -+ 0x00000000004004ae -+ range 12, 1a -+ 0x00000000004004b2.. -+ 0x00000000004004b9 - EOF - - # Produce "raw" unprocessed content. -@@ -100,10 +124,14 @@ DWARF section [33] '.debug_loc' at offset 0xd2a: - [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 - - DWARF section [34] '.debug_ranges' at offset 0xd94: -- [ 0] 000000000000000000..0x0000000000000002 -- 0x0000000000000005..0x000000000000000d -- [ 30] 0x000000000000000d..0x000000000000000f -- 0x0000000000000012..0x000000000000001a -+ -+ CU [ b] base: 0x0000000000400480 -+ [ 0] range 0, 2 -+ range 5, d -+ -+ CU [ e0] base: 0x00000000004004a0 -+ [ 30] range d, f -+ range 12, 1a - EOF - - exit 0 -diff --git a/tests/run-readelf-zdebug.sh b/tests/run-readelf-zdebug.sh -index fc666fd..7be9bee 100755 ---- a/tests/run-readelf-zdebug.sh -+++ b/tests/run-readelf-zdebug.sh -@@ -80,7 +80,9 @@ cat aranges.out | sed -e "s/.debug_aranges' at offset 0xa65/.zdebug_aranges' at - cat > ranges.out << \EOF - - DWARF section [32] '.debug_ranges' at offset 0xa95: -- [ 0] 0x00000000004003c0..0x00000000004003d9 -+ -+ CU [ b] base: 000000000000000000 -+ [ 0] range 4003c0, 4003d9 - EOF - - cat ranges.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=ranges testfile-debug - -commit fbb6c932e3ff74d4fb8bc54b72d9c9bdc4513f69 -Author: Mark Wielaard -Date: Wed Nov 29 16:37:50 2017 +0100 - - readelf: Print CU, base address and unresolved .debug_loc entries. - - Also adjust the formatting for the resolved addresses to print them - on separate lines so they nicely line up even when the addresses are - resolved to symbol+offset names. And print the operands starting on - a new line. - - Signed-off-by: Mark Wielaard - -diff --git a/src/readelf.c b/src/readelf.c -index 8e13462..bb48af9 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -7130,19 +7130,36 @@ print_debug_loc_section (Dwfl_Module *dwflmod, - uint_fast8_t offset_size = 4; - - bool first = true; -- struct Dwarf_CU *cu = NULL; - Dwarf_Addr base = 0; - unsigned char *readp = data->d_buf; - unsigned char *const endp = (unsigned char *) data->d_buf + data->d_size; -+ Dwarf_CU *last_cu = NULL; - while (readp < endp) - { - ptrdiff_t offset = readp - (unsigned char *) data->d_buf; -+ Dwarf_CU *cu; - - if (first && skip_listptr_hole (&known_loclistptr, &listptr_idx, - &address_size, &offset_size, &base, - &cu, offset, &readp, endp)) - continue; - -+ if (last_cu != cu) -+ { -+ char *basestr = format_dwarf_addr (dwflmod, address_size, -+ base, base); -+ Dwarf_Die cudie; -+ if (dwarf_cu_die (cu, &cudie, -+ NULL, NULL, NULL, NULL, -+ NULL, NULL) == NULL) -+ printf (gettext ("\n Unknown CU base: %s\n"), basestr); -+ else -+ printf (gettext ("\n CU [%6" PRIx64 "] base: %s\n"), -+ dwarf_dieoffset (&cudie), basestr); -+ free (basestr); -+ } -+ last_cu = cu; -+ - if (unlikely (data->d_size - offset < (size_t) address_size * 2)) - { - printf (gettext (" [%6tx] \n"), offset); -@@ -7167,14 +7184,14 @@ print_debug_loc_section (Dwfl_Module *dwflmod, - if (begin == (Dwarf_Addr) -1l) /* Base address entry. */ - { - char *b = format_dwarf_addr (dwflmod, address_size, end, end); -- printf (gettext (" [%6tx] base address %s\n"), offset, b); -+ printf (gettext (" [%6tx] base address\n %s\n"), offset, b); - free (b); - base = end; - } - else if (begin == 0 && end == 0) /* End of list entry. */ - { - if (first) -- printf (gettext (" [%6tx] empty list\n"), offset); -+ printf (gettext (" [%6tx] empty list\n"), offset); - first = true; - } - else -@@ -7182,18 +7199,23 @@ print_debug_loc_section (Dwfl_Module *dwflmod, - /* We have a location expression entry. */ - uint_fast16_t len = read_2ubyte_unaligned_inc (dbg, readp); - -- char *b = format_dwarf_addr (dwflmod, address_size, base + begin, -- begin); -- char *e = format_dwarf_addr (dwflmod, address_size, base + end, -- end); -- - if (first) /* First entry in a list. */ -- printf (gettext (" [%6tx] %s..%s"), offset, b, e); -+ printf (" [%6tx] ", offset); - else -- printf (gettext (" %s..%s"), b, e); -+ printf (" "); - -- free (b); -- free (e); -+ printf ("range %" PRIx64 ", %" PRIx64 "\n", begin, end); -+ if (! print_unresolved_addresses) -+ { -+ char *b = format_dwarf_addr (dwflmod, address_size, base + begin, -+ base + begin); -+ char *e = format_dwarf_addr (dwflmod, address_size, -+ base + end - 1, base + end); -+ printf (" %s..\n", b); -+ printf (" %s\n", e); -+ free (b); -+ free (e); -+ } - - if (endp - readp <= (ptrdiff_t) len) - { -@@ -7201,8 +7223,9 @@ print_debug_loc_section (Dwfl_Module *dwflmod, - break; - } - -- print_ops (dwflmod, dbg, 1, 18 + (address_size * 4), -- 3 /*XXX*/, address_size, offset_size, cu, len, readp); -+ print_ops (dwflmod, dbg, 11, 11, -+ cu != NULL ? cu->version : 3, -+ address_size, offset_size, cu, len, readp); - - first = false; - readp += len; -diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh -index 4b666cf..e5152df 100755 ---- a/tests/run-readelf-loc.sh -+++ b/tests/run-readelf-loc.sh -@@ -63,9 +63,22 @@ testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=loc --debug-dump=ra - testfileloc<<\EOF - - DWARF section [33] '.debug_loc' at offset 0xd2a: -- [ 0] 0x0000000000400480
..0x000000000040048d [ 0] reg5 -- [ 23] 0x0000000000400485 ..0x000000000040048d [ 0] reg5 -- [ 46] 0x00000000004004b2 ..0x00000000004004ba [ 0] breg5 0 -+ -+ CU [ b] base: 0x0000000000400480
-+ [ 0] range 0, d -+ 0x0000000000400480
.. -+ 0x000000000040048c -+ [ 0] reg5 -+ [ 23] range 5, d -+ 0x0000000000400485 .. -+ 0x000000000040048c -+ [ 0] reg5 -+ -+ CU [ e0] base: 0x00000000004004a0 -+ [ 46] range 12, 1a -+ 0x00000000004004b2 .. -+ 0x00000000004004b9 -+ [ 0] breg5 0 - - DWARF section [34] '.debug_ranges' at offset 0xd94: - -@@ -91,9 +104,22 @@ testrun_compare ${abs_top_builddir}/src/readelf -N --debug-dump=loc --debug-dump - testfileloc<<\EOF - - DWARF section [33] '.debug_loc' at offset 0xd2a: -- [ 0] 0x0000000000400480..0x000000000040048d [ 0] reg5 -- [ 23] 0x0000000000400485..0x000000000040048d [ 0] reg5 -- [ 46] 0x00000000004004b2..0x00000000004004ba [ 0] breg5 0 -+ -+ CU [ b] base: 0x0000000000400480 -+ [ 0] range 0, d -+ 0x0000000000400480.. -+ 0x000000000040048c -+ [ 0] reg5 -+ [ 23] range 5, d -+ 0x0000000000400485.. -+ 0x000000000040048c -+ [ 0] reg5 -+ -+ CU [ e0] base: 0x00000000004004a0 -+ [ 46] range 12, 1a -+ 0x00000000004004b2.. -+ 0x00000000004004b9 -+ [ 0] breg5 0 - - DWARF section [34] '.debug_ranges' at offset 0xd94: - -@@ -119,9 +145,16 @@ testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc --debug-dump - testfileloc<<\EOF - - DWARF section [33] '.debug_loc' at offset 0xd2a: -- [ 0] 000000000000000000..0x000000000000000d [ 0] reg5 -- [ 23] 0x0000000000000005..0x000000000000000d [ 0] reg5 -- [ 46] 0x0000000000000012..0x000000000000001a [ 0] breg5 0 -+ -+ CU [ b] base: 0x0000000000400480 -+ [ 0] range 0, d -+ [ 0] reg5 -+ [ 23] range 5, d -+ [ 0] reg5 -+ -+ CU [ e0] base: 0x00000000004004a0 -+ [ 46] range 12, 1a -+ [ 0] breg5 0 - - DWARF section [34] '.debug_ranges' at offset 0xd94: - -diff --git a/tests/run-readelf-zdebug-rel.sh b/tests/run-readelf-zdebug-rel.sh -index 2b57d05..ccccd82 100755 ---- a/tests/run-readelf-zdebug-rel.sh -+++ b/tests/run-readelf-zdebug-rel.sh -@@ -127,12 +127,17 @@ cat info.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=i - cat > loc.out << \EOF - - DWARF section [ 7] '.debug_loc' at offset 0x185: -- [ 0] 000000000000000000..0x0000000000000003 [ 0] reg5 -- 0x0000000000000003..0x0000000000000010 [ 0] breg5 -42 -- [ 2] stack_value -- 0x0000000000000010..0x0000000000000018 [ 0] GNU_entry_value: -- [ 0] reg5 -- [ 3] stack_value -+ -+ CU [ b] base: 000000000000000000 -+ [ 0] range 0, 3 -+ [ 0] reg5 -+ range 3, 10 -+ [ 0] breg5 -42 -+ [ 2] stack_value -+ range 10, 18 -+ [ 0] GNU_entry_value: -+ [ 0] reg5 -+ [ 3] stack_value - EOF - - cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug-rel.o -diff --git a/tests/run-readelf-zdebug.sh b/tests/run-readelf-zdebug.sh -index 7be9bee..28128ad 100755 ---- a/tests/run-readelf-zdebug.sh -+++ b/tests/run-readelf-zdebug.sh -@@ -46,12 +46,17 @@ tempfiles loc.out aranges.out ranges.out macro.out line.out frame.out - cat > loc.out << \EOF - - DWARF section [30] '.debug_loc' at offset 0xa17: -- [ 0] 0x00000000004003c0..0x00000000004003c3 [ 0] reg5 -- 0x00000000004003c3..0x00000000004003d6 [ 0] breg5 -42 -- [ 2] stack_value -- 0x00000000004003d6..0x00000000004003d9 [ 0] GNU_entry_value: -- [ 0] reg5 -- [ 3] stack_value -+ -+ CU [ b] base: 000000000000000000 -+ [ 0] range 4003c0, 4003c3 -+ [ 0] reg5 -+ range 4003c3, 4003d6 -+ [ 0] breg5 -42 -+ [ 2] stack_value -+ range 4003d6, 4003d9 -+ [ 0] GNU_entry_value: -+ [ 0] reg5 -+ [ 3] stack_value - EOF - - cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug - -commit e98f032d293a8ea8ea2b25949d7f452603e644d9 -Author: Mark Wielaard -Date: Thu Jan 25 13:24:19 2018 +0100 - - readelf: Fix crash on reading loc data or range data with bad/no CUs. - - In print_debug_ranges_section and print_debug_loc_section we try to - get the associated CU through skip_listptr_hole for the first data data. - If no CU at all can be found (because the .debug_info section was bogus) - this would keep the Dwarf_CU uninitialized causing a crash later on - when it was compared to the last_cu and used because it was unequal. - Fix this by explicitly initializing cu to last_cu (which is NULL on - first use). - - Signed-off-by: Mark Wielaard - -diff --git a/src/readelf.c b/src/readelf.c -index 4bdaef2..6c49d30 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -5014,7 +5014,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, - while (readp < endp) - { - ptrdiff_t offset = readp - (unsigned char *) data->d_buf; -- Dwarf_CU *cu; -+ Dwarf_CU *cu = last_cu; - - if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx, - &address_size, NULL, &base, &cu, -@@ -7140,7 +7140,7 @@ print_debug_loc_section (Dwfl_Module *dwflmod, - while (readp < endp) - { - ptrdiff_t offset = readp - (unsigned char *) data->d_buf; -- Dwarf_CU *cu; -+ Dwarf_CU *cu = last_cu; - - if (first && skip_listptr_hole (&known_loclistptr, &listptr_idx, - &address_size, &offset_size, &base, - -commit 0f1d3389f18887ff4ef411812e95deab3e8dfb7c -Author: Mark Wielaard -Date: Thu Mar 1 00:14:52 2018 +0100 - - readelf: Add some support for locviews. - - This adds minimal support for locviews as output by GCC8. - It changes readelf to keep track of loclistptrs from DW_AT_GNU_locviews - and prints the locview pairs for those. Since there is no terminator - we have to keep track of where the next loclist entry starts. - The --debug-dump=loc output looks as follows: - - CU [ 714] base: +0x0000000000003020 - [ b4] view pair 1, 2 - [ b6] range 4, 7f - +0x0000000000003024 .. - +0x000000000000309e - [ 0] reg5 - [ d9] view pair 3, 1 - view pair 1, 2 - [ dd] range 4, 4c - +0x0000000000003024 .. - +0x000000000000306b - [ 0] reg5 - range 4c, 7f - +0x000000000000306c .. - +0x000000000000309e - [ 0] reg2 - - Note that in the above output the view pairs correspond to the ranges - immediately following in the loc list. This is how GCC8 currently - outputs the locview pairs and ranges, but this is not guaranteed and - you'll need to look at the location and GNU_locviews attributes of the - DIE to know which really match up together. We might want to adjust the - output to make this more clear. - - This does not yet add an locview accessor to libdw. It just recognizes - the DW_AT_GNU_locviews attribute as a loclistptr when encoded as a - sec_offset form. - - Signed-off-by: Mark Wielaard - -diff --git a/libdw/dwarf.h b/libdw/dwarf.h -index 4f36206..d53a30d 100644 ---- a/libdw/dwarf.h -+++ b/libdw/dwarf.h -@@ -339,6 +339,8 @@ enum - DW_AT_GNU_all_tail_call_sites = 0x2116, - DW_AT_GNU_all_call_sites = 0x2117, - DW_AT_GNU_all_source_call_sites = 0x2118, -+ DW_AT_GNU_locviews = 0x2137, -+ DW_AT_GNU_entry_view = 0x2138, - DW_AT_GNU_macros = 0x2119, - DW_AT_GNU_deleted = 0x211a, - -diff --git a/libdw/dwarf_formudata.c b/libdw/dwarf_formudata.c -index 9c1644e..95872d6 100644 ---- a/libdw/dwarf_formudata.c -+++ b/libdw/dwarf_formudata.c -@@ -141,6 +141,7 @@ dwarf_formudata (Dwarf_Attribute *attr, Dwarf_Word *return_uval) - case DW_AT_string_length: - case DW_AT_use_location: - case DW_AT_vtable_elem_location: -+ case DW_AT_GNU_locviews: - /* loclistptr */ - if (__libdw_formptr (attr, IDX_debug_loc, - DWARF_E_NO_LOCLIST, NULL, -diff --git a/src/readelf.c b/src/readelf.c -index 2d49af3..098209f 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -4532,6 +4532,7 @@ struct listptr - bool dwarf64:1; - bool warned:1; - struct Dwarf_CU *cu; -+ unsigned int attr; - }; - - #define listptr_offset_size(p) ((p)->dwarf64 ? 8 : 4) -@@ -4592,6 +4593,15 @@ compare_listptr (const void *a, const void *b, void *arg) - gettext ("%s %#" PRIx64 " used with different base addresses"), - name, (uint64_t) p1->offset); - } -+ if (p1->attr != p2 ->attr) -+ { -+ p1->warned = p2->warned = true; -+ error (0, 0, -+ gettext ("%s %#" PRIx64 -+ " used with different attribute %s and %s"), -+ name, (uint64_t) p1->offset, dwarf_attr_name (p2->attr), -+ dwarf_attr_name (p2->attr)); -+ } - } - - return 0; -@@ -4619,7 +4629,7 @@ reset_listptr (struct listptr_table *table) - static bool - notice_listptr (enum section_e section, struct listptr_table *table, - uint_fast8_t address_size, uint_fast8_t offset_size, -- struct Dwarf_CU *cu, Dwarf_Off offset) -+ struct Dwarf_CU *cu, Dwarf_Off offset, unsigned int attr) - { - if (print_debug_sections & section) - { -@@ -4640,7 +4650,8 @@ notice_listptr (enum section_e section, struct listptr_table *table, - .addr64 = address_size == 8, - .dwarf64 = offset_size == 8, - .offset = offset, -- .cu = cu -+ .cu = cu, -+ .attr = attr - }; - - if (p->offset != offset) -@@ -4664,7 +4675,8 @@ static bool - skip_listptr_hole (struct listptr_table *table, size_t *idxp, - uint_fast8_t *address_sizep, uint_fast8_t *offset_sizep, - Dwarf_Addr *base, struct Dwarf_CU **cu, ptrdiff_t offset, -- unsigned char **readp, unsigned char *endp) -+ unsigned char **readp, unsigned char *endp, -+ unsigned int *attr) - { - if (table->n == 0) - return false; -@@ -4699,10 +4711,27 @@ skip_listptr_hole (struct listptr_table *table, size_t *idxp, - *base = listptr_base (p); - if (cu != NULL) - *cu = p->cu; -+ if (attr != NULL) -+ *attr = p->attr; - - return false; - } - -+static Dwarf_Off -+next_listptr_offset (struct listptr_table *table, size_t idx) -+{ -+ /* Note that multiple attributes could in theory point to the same loclist -+ offset, so make sure we pick one that is bigger than the current one. -+ The table is sorted on offset. */ -+ Dwarf_Off offset = table->table[idx].offset; -+ while (++idx < table->n) -+ { -+ Dwarf_Off next = table->table[idx].offset; -+ if (next > offset) -+ return next; -+ } -+ return 0; -+} - - static void - print_debug_abbrev_section (Dwfl_Module *dwflmod __attribute__ ((unused)), -@@ -5042,7 +5071,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod, - - if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx, - &address_size, NULL, &base, &cu, -- offset, &readp, endp)) -+ offset, &readp, endp, NULL)) - continue; - - if (last_cu != cu) -@@ -6121,10 +6150,11 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) - case DW_AT_GNU_call_site_data_value: - case DW_AT_GNU_call_site_target: - case DW_AT_GNU_call_site_target_clobbered: -+ case DW_AT_GNU_locviews: - { - bool nlpt = notice_listptr (section_loc, &known_loclistptr, - cbargs->addrsize, cbargs->offset_size, -- cbargs->cu, num); -+ cbargs->cu, num, attr); - if (!cbargs->silent) - printf (" %*s%-20s (%s) location list [%6" PRIxMAX "]%s\n", - (int) (level * 2), "", dwarf_attr_name (attr), -@@ -6137,7 +6167,7 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) - { - bool nlpt = notice_listptr (section_ranges, &known_rangelistptr, - cbargs->addrsize, cbargs->offset_size, -- cbargs->cu, num); -+ cbargs->cu, num, attr); - if (!cbargs->silent) - printf (" %*s%-20s (%s) range list [%6" PRIxMAX "]%s\n", - (int) (level * 2), "", dwarf_attr_name (attr), -@@ -7215,10 +7245,11 @@ print_debug_loc_section (Dwfl_Module *dwflmod, - { - ptrdiff_t offset = readp - (unsigned char *) data->d_buf; - Dwarf_CU *cu = last_cu; -+ unsigned int attr = 0; - - if (first && skip_listptr_hole (&known_loclistptr, &listptr_idx, - &address_size, &offset_size, &base, -- &cu, offset, &readp, endp)) -+ &cu, offset, &readp, endp, &attr)) - continue; - - if (last_cu != cu) -@@ -7237,6 +7268,40 @@ print_debug_loc_section (Dwfl_Module *dwflmod, - } - last_cu = cu; - -+ if (attr == DW_AT_GNU_locviews) -+ { -+ Dwarf_Off next_off = next_listptr_offset (&known_loclistptr, -+ listptr_idx); -+ const unsigned char *locp = readp; -+ const unsigned char *locendp; -+ if (next_off == 0) -+ locendp = endp; -+ else -+ locendp = (const unsigned char *) data->d_buf + next_off; -+ -+ while (locp < locendp) -+ { -+ uint64_t v1, v2; -+ get_uleb128 (v1, locp, locendp); -+ if (locp >= locendp) -+ { -+ printf (gettext (" [%6tx] \n"), offset); -+ break; -+ } -+ get_uleb128 (v2, locp, locendp); -+ if (first) /* First view pair in a list. */ -+ printf (" [%6tx] ", offset); -+ else -+ printf (" "); -+ printf ("view pair %" PRId64 ", %" PRId64 "\n", v1, v2); -+ first = false; -+ } -+ -+ first = true; -+ readp = (unsigned char *) locendp; -+ continue; -+ } -+ - if (unlikely (data->d_size - offset < (size_t) address_size * 2)) - { - printf (gettext (" [%6tx] \n"), offset); diff --git a/elfutils-0.170-m68k-packed-not-aligned.patch b/elfutils-0.170-m68k-packed-not-aligned.patch deleted file mode 100644 index d19426a..0000000 --- a/elfutils-0.170-m68k-packed-not-aligned.patch +++ /dev/null @@ -1,67 +0,0 @@ -commit ab6b37ac32ddf2f2f11f800a770170814f5cbb8b -Author: Mark Wielaard -Date: Tue Oct 24 14:23:30 2017 +0200 - - backends: Ignore GCC8 -Wpacked-not-aligned for m68k_corenote.c. - - The GCC8 -Wpacked-not-aligned warns if a structure field with explicit - padding in a packed structure will be misaligned. m68k prstatus core - notes are described by a packed structure which has such aligned structure - fields. - - Signed-off-by: Mark Wielaard - -diff --git a/backends/Makefile.am b/backends/Makefile.am -index 0fde0cb..2c62add 100644 ---- a/backends/Makefile.am -+++ b/backends/Makefile.am -@@ -119,6 +119,13 @@ m68k_SRCS = m68k_init.c m68k_symbol.c m68k_regs.c \ - libebl_m68k_pic_a_SOURCES = $(m68k_SRCS) - am_libebl_m68k_pic_a_OBJECTS = $(m68k_SRCS:.c=.os) - -+# m68k prstatus core notes are described by a packed structure -+# which has not naturally aligned fields. Since we don't access -+# these fields directly, but take their offset to be used later -+# to extract the data through elfxx_xlatetom/memmove, this isn't -+# an issue. -+m68k_corenote_no_Wpacked_not_aligned = yes -+ - bpf_SRCS = bpf_init.c bpf_regs.c - cpu_bpf = ../libcpu/libcpu_bpf.a - libebl_bpf_pic_a_SOURCES = $(bpf_SRCS) -diff --git a/config/eu.am b/config/eu.am -index 796f388..05c27f0 100644 ---- a/config/eu.am -+++ b/config/eu.am -@@ -74,6 +74,7 @@ AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \ - $(if $($(*F)_no_Werror),,-Werror) \ - $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ - $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -+ $(if $($(*F)_no_Wpacked_not_aligned),-Wno-packed-not-aligned,) \ - $($(*F)_CFLAGS) - - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) ---- elfutils-0.170/backends/Makefile.in.orig 2018-02-15 17:29:58.185213368 +0100 -+++ elfutils-0.170/backends/Makefile.in 2018-02-15 17:32:30.207695806 +0100 -@@ -421,6 +421,7 @@ - $(if $($(*F)_no_Werror),,-Werror) \ - $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ - $(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \ -+ $(if $($(*F)_no_Wpacked_not_aligned),-Wno-packed-not-aligned,) \ - $($(*F)_CFLAGS) - - COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE)) -@@ -515,6 +516,13 @@ - - libebl_m68k_pic_a_SOURCES = $(m68k_SRCS) - am_libebl_m68k_pic_a_OBJECTS = $(m68k_SRCS:.c=.os) -+ -+# m68k prstatus core notes are described by a packed structure -+# which has not naturally aligned fields. Since we don't access -+# these fields directly, but take their offset to be used later -+# to extract the data through elfxx_xlatetom/memmove, this isn't -+# an issue. -+m68k_corenote_no_Wpacked_not_aligned = yes - bpf_SRCS = bpf_init.c bpf_regs.c - cpu_bpf = ../libcpu/libcpu_bpf.a - libebl_bpf_pic_a_SOURCES = $(bpf_SRCS) diff --git a/elfutils-0.170-new-notes-hack.patch b/elfutils-0.170-new-notes-hack.patch deleted file mode 100644 index 1785617..0000000 --- a/elfutils-0.170-new-notes-hack.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/libebl/eblcheckreloctargettype.c b/libebl/eblcheckreloctargettype.c -index e0d57c1..068ad8f 100644 ---- a/libebl/eblcheckreloctargettype.c -+++ b/libebl/eblcheckreloctargettype.c -@@ -46,6 +46,7 @@ ebl_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type) - case SHT_INIT_ARRAY: - case SHT_FINI_ARRAY: - case SHT_PREINIT_ARRAY: -+ case SHT_NOTE: - return true; - - default: -diff --git a/src/elflint.c b/src/elflint.c -index df1b3a0..f4d82d9 100644 ---- a/src/elflint.c -+++ b/src/elflint.c -@@ -4329,6 +4329,8 @@ section [%2d] '%s': unknown core file note type %" PRIu32 - case NT_GNU_HWCAP: - case NT_GNU_BUILD_ID: - case NT_GNU_GOLD_VERSION: -+ case NT_GNU_PROPERTY_TYPE_0: -+ case 256: - break; - - case 0: diff --git a/elfutils-0.170-sys-ptrace.patch b/elfutils-0.170-sys-ptrace.patch deleted file mode 100644 index 68eb415..0000000 --- a/elfutils-0.170-sys-ptrace.patch +++ /dev/null @@ -1,113 +0,0 @@ -commit 4482d0009a99b1773f2426479b666b08f57af9d5 -Author: Mark Wielaard -Date: Thu Feb 15 14:44:18 2018 +0100 - - Include sys/ptrace.h as early as possible. - - On some systems, at least on Fedora 27 ppc64le with glibc 2.26-24 and - kernel 4.14.18-300, including sys/ptrace.h late (after signal.h or - sys/wait.h for example) will cause issues and produce errors like: - - In file included from /usr/include/asm/sigcontext.h:12:0, - from /usr/include/bits/sigcontext.h:30, - from /usr/include/signal.h:287, - from /usr/include/sys/wait.h:36, - from linux-pid-attach.c:38: - /usr/include/sys/ptrace.h:73:3: error: expected identifier before numeric constant - PTRACE_GETREGS = 12, - ^ - - Swapping the include order fixes these issues. - - Signed-off-by: Mark Wielaard - -diff --git a/backends/ppc_initreg.c b/backends/ppc_initreg.c -index 69d623b..3e4432f 100644 ---- a/backends/ppc_initreg.c -+++ b/backends/ppc_initreg.c -@@ -30,13 +30,14 @@ - # include - #endif - --#include "system.h" - #include - #if defined(__powerpc__) && defined(__linux__) --# include - # include -+# include - #endif - -+#include "system.h" -+ - #define BACKEND ppc_ - #include "libebl_CPU.h" - -diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c -index e6a5c41..2ab4109 100644 ---- a/libdwfl/linux-pid-attach.c -+++ b/libdwfl/linux-pid-attach.c -@@ -35,7 +35,6 @@ - #include - #include - #include --#include - #include - #include - -@@ -43,6 +42,7 @@ - - #include - #include -+#include - - static bool - linux_proc_pid_is_stopped (pid_t pid) -diff --git a/tests/backtrace-child.c b/tests/backtrace-child.c -index 2c27414..9c6ba94 100644 ---- a/tests/backtrace-child.c -+++ b/tests/backtrace-child.c -@@ -81,7 +81,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -100,6 +99,7 @@ main (int argc __attribute__ ((unused)), char **argv) - - #else /* __linux__ */ - #include -+#include - - #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) - #define NOINLINE_NOCLONE __attribute__ ((noinline, noclone)) -diff --git a/tests/backtrace-dwarf.c b/tests/backtrace-dwarf.c -index 2dc8a9a..7ff826c 100644 ---- a/tests/backtrace-dwarf.c -+++ b/tests/backtrace-dwarf.c -@@ -17,7 +17,6 @@ - - #include - #include --#include - #include - #include - #include -@@ -25,7 +24,6 @@ - #include - #include - #include --#include - #include ELFUTILS_HEADER(dwfl) - - #ifndef __linux__ -@@ -40,6 +38,8 @@ main (int argc __attribute__ ((unused)), char **argv) - - #else /* __linux__ */ - #include -+#include -+#include - - #define main cleanup_13_main - #include "cleanup-13.c" diff --git a/elfutils-0.170-unwind.patch b/elfutils-0.170-unwind.patch deleted file mode 100644 index bbadc1b..0000000 --- a/elfutils-0.170-unwind.patch +++ /dev/null @@ -1,128 +0,0 @@ -commit c049419d96d82e4f5834133d5f68f6054e46f789 -Author: Mark Wielaard -Date: Tue Apr 10 16:13:34 2018 +0200 - - libdwfl: Handle unwind frame when the return address register isn't set. - - When we have unwound the frame and then cannot set the return address - we wouldn't set any error. That meant that a dwfl_thread_getframes () - call could end in an error, but without any dwfl_errno set, producing - the "no error" error message. - - If we cannot set the return address at the end of unwinding the frame - that means that either the return address register is bogus (error), - or that the return address is undefined (end of the call stack). - - This fixes the run-backtrace-native-biarch.sh testcase for me on an - i386 on x86_64 setup with gcc 7.2.1 and glibc 2.17. - - Signed-off-by: Mark Wielaard - -diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c -index eaea495..8da691e 100644 ---- a/libdwfl/frame_unwind.c -+++ b/libdwfl/frame_unwind.c -@@ -632,24 +632,38 @@ handle_cfi (Dwfl_Frame *state, Dwarf_Addr pc, Dwarf_CFI *cfi, Dwarf_Addr bias) - ra_set = true; - } - } -- if (unwound->pc_state == DWFL_FRAME_STATE_ERROR -- && __libdwfl_frame_reg_get (unwound, -- frame->fde->cie->return_address_register, -- &unwound->pc)) -+ if (unwound->pc_state == DWFL_FRAME_STATE_ERROR) - { -- /* PPC32 __libc_start_main properly CFI-unwinds PC as zero. Currently -- none of the archs supported for unwinding have zero as a valid PC. */ -- if (unwound->pc == 0) -- unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED; -+ if (__libdwfl_frame_reg_get (unwound, -+ frame->fde->cie->return_address_register, -+ &unwound->pc)) -+ { -+ /* PPC32 __libc_start_main properly CFI-unwinds PC as zero. -+ Currently none of the archs supported for unwinding have -+ zero as a valid PC. */ -+ if (unwound->pc == 0) -+ unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED; -+ else -+ { -+ unwound->pc_state = DWFL_FRAME_STATE_PC_SET; -+ /* In SPARC the return address register actually contains -+ the address of the call instruction instead of the return -+ address. Therefore we add here an offset defined by the -+ backend. Most likely 0. */ -+ unwound->pc += ebl_ra_offset (ebl); -+ } -+ } - else -- { -- unwound->pc_state = DWFL_FRAME_STATE_PC_SET; -- /* In SPARC the return address register actually contains -- the address of the call instruction instead of the return -- address. Therefore we add here an offset defined by the -- backend. Most likely 0. */ -- unwound->pc += ebl_ra_offset (ebl); -- } -+ { -+ /* We couldn't set the return register, either it was bogus, -+ or the return pc is undefined, maybe end of call stack. */ -+ unsigned pcreg = frame->fde->cie->return_address_register; -+ if (! ebl_dwarf_to_regno (ebl, &pcreg) -+ || pcreg >= ebl_frame_nregs (ebl)) -+ __libdwfl_seterrno (DWFL_E_INVALID_REGISTER); -+ else -+ unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED; -+ } - } - free (frame); - } - -commit 7be459fa531b1284408bf16616422b8dbf193278 -Author: Mark Wielaard -Date: Wed Apr 11 10:37:45 2018 +0200 - - aarch64: Add default cfi rule to restore SP from CFA address. - - The CFA is set by default to the stack pointer of the previous frame. - So that is also how we can always restore the SP. This default aarch64 - CFI rule is necessary on Fedora 28 with GCC8 to make the run-deleted.sh - and run-backtrace-dwarf.sh testcases work. - - Signed-off-by: Mark Wielaard - -diff --git a/backends/aarch64_cfi.c b/backends/aarch64_cfi.c -index acbb9b6..a5579ab 100644 ---- a/backends/aarch64_cfi.c -+++ b/backends/aarch64_cfi.c -@@ -1,5 +1,5 @@ --/* arm ABI-specified defaults for DWARF CFI. -- Copyright (C) 2013 Red Hat, Inc. -+/* arm64 ABI-specified defaults for DWARF CFI. -+ Copyright (C) 2013, 2018 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -62,6 +62,9 @@ aarch64_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info) - /* The Frame Pointer (FP, r29) and Link Register (LR, r30). */ - SV (29), SV (30), - -+ /* The Stack Pointer (r31) is restored from CFA address by default. */ -+ DW_CFA_val_offset, ULEB128_7 (31), ULEB128_7 (0), -+ - /* Callee-saved fpregs v8-v15. v0 == 64. */ - SV (72), SV (73), SV (74), SV (75), - SV (76), SV (77), SV (78), SV (79), -diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh -index 376a6dc..fd89d02 100755 ---- a/tests/run-addrcfi.sh -+++ b/tests/run-addrcfi.sh -@@ -3637,7 +3637,7 @@ dwarf_cfi_addrframe (.eh_frame): no matching address range - integer reg28 (x28): same_value - integer reg29 (x29): same_value - integer reg30 (x30): same_value -- integer reg31 (sp): undefined -+ integer reg31 (sp): location expression: call_frame_cfa stack_value - integer reg33 (elr): undefined - FP/SIMD reg64 (v0): undefined - FP/SIMD reg65 (v1): undefined diff --git a/elfutils-0.171-new-notes-hack.patch b/elfutils-0.171-new-notes-hack.patch new file mode 100644 index 0000000..f14562e --- /dev/null +++ b/elfutils-0.171-new-notes-hack.patch @@ -0,0 +1,30 @@ +diff --git a/src/elflint.c b/src/elflint.c +index df1b3a0..f4d82d9 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -4329,6 +4329,8 @@ section [%2d] '%s': unknown core file note type %" PRIu32 + case NT_GNU_HWCAP: + case NT_GNU_BUILD_ID: + case NT_GNU_GOLD_VERSION: ++ case NT_GNU_PROPERTY_TYPE_0: ++ case 256: + break; + + case 0: +diff --git a/src/elflint.c b/src/elflint.c +index 0a26d97..1cbf570 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -3906,10 +3906,11 @@ section [%2zu] '%s': size not multiple of entry size\n"), + cnt, section_name (ebl, cnt), + (int) shdr->sh_type); + ++#define SHF_GNU_BUILD_NOTE (1 << 20) + #define ALL_SH_FLAGS (SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR | SHF_MERGE \ + | SHF_STRINGS | SHF_INFO_LINK | SHF_LINK_ORDER \ + | SHF_OS_NONCONFORMING | SHF_GROUP | SHF_TLS \ +- | SHF_COMPRESSED) ++ | SHF_COMPRESSED | SHF_GNU_BUILD_NOTE) + if (shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS) + { + GElf_Xword sh_flags = shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS; diff --git a/elfutils.spec b/elfutils.spec index 946e02f..d1a7b08 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.170 -%global baserelease 11 +Version: 0.171 +%global baserelease 1 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,16 +20,7 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -Patch1: elfutils-0.170-dwarf_aggregate_size.patch -Source1: testfile-sizes3.o.bz2 -Patch2: elfutils-0.170-sys-ptrace.patch -Patch3: elfutils-0.170-m68k-packed-not-aligned.patch -Patch4: elfutils-0.170-core-pid.patch -Patch5: elfutils-0.170-elf_sync.patch -Patch6: elfutils-0.170-new-notes-hack.patch -Patch7: elfutils-0.170-GNU_variable_value.patch -Patch8: elfutils-0.170-locviews.patch -Patch9: elfutils-0.170-unwind.patch +Patch1: elfutils-0.171-new-notes-hack.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -183,17 +174,10 @@ profiling) of processes. %setup -q # Apply patches -%patch1 -p1 -b .aggregate_size -cp %SOURCE1 tests/ -%patch2 -p1 -b .sys_ptrace -%patch3 -p1 -b .m68k_packed -%patch4 -p1 -b .core_pid -%patch5 -p1 -b .elf_sync -%patch6 -p1 -b .notes_hack -%patch7 -p1 -b .variable_value -%patch8 -p1 -b .locviews -%patch9 -p1 -b .unwind +%patch1 -p1 -b .notes_hack +# In case the above patches added any new test scripts, make sure they +# are executable. find . -name \*.sh ! -perm -0100 -print | xargs chmod +x %build @@ -328,6 +312,21 @@ fi %endif %changelog +* Fri Jun 01 2018 Mark Wielaard - 0.171-1 +- New upstream release. + - DWARF5 and split dwarf, including GNU DebugFission, support. + - readelf: Handle all new DWARF5 sections. + --debug-dump=info+ will show split unit DIEs when found. + --dwarf-skeleton can be used when inspecting a .dwo file. + Recognizes GNU locviews with --debug-dump=loc. + - libdw: New functions dwarf_die_addr_die, dwarf_get_units, + dwarf_getabbrevattr_data and dwarf_cu_info. + libdw will now try to resolve the alt file on first use + when not set yet with dwarf_set_alt. + dwarf_aggregate_size() now works with multi-dimensional arrays. + - libdwfl: Use process_vm_readv when available instead of ptrace. + - backends: Add a RISC-V backend. + * Wed Apr 11 2018 Mark Wielaard - 0.170-11 - Add explict libstdc++-devel BuildRequires for demangle support. - Add elfutils-0.170-unwind.patch. (#1555726) diff --git a/sources b/sources index cc6dd59..78d3ddb 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.170.tar.bz2) = bcfabe5fc500369bff72794bf060bfeef2f1a66a5bd7d2a1642adb7d54f6431bf48f13d0305433590539f3979188ce649d4fe70382f02c3be2ff24bf4c2d571a +SHA512 (elfutils-0.171.tar.bz2) = 777be2d63ca9b11440bf358a33428d9ca974e2612a880934156c9f7194af596ed627c1ed2d48dbd47a3761c94913b8f39565f9dcb6b62c92bf229f04c96d5ee3 diff --git a/testfile-sizes3.o.bz2 b/testfile-sizes3.o.bz2 deleted file mode 100644 index 863338269bab61fb385344c489d48d1466915b61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1208 zcmV;p1V{TqT4*^jL0KkKS#6BOfdB+#|L_0*|Nrmj|NqbJ$0`5s-*CW0grxvV07V4= z#YuEo&;$O8fgmQKVWLd}XliXV4Jo|{$vjM$h||>3lRynJ4@5STKx7&K(@dIZ^*v4M zO&SQACR0r@JyX%5c}+CX000Jn00000000004FExt044!3GGxF2m=ggpFiZdd005a7 z34shC5M;m!fJ{u8FaRb5z)VaN00000CPo5aLkIyPA|TR1Jk->A4Npn6GJ1y8(7_rs z(V!328aANF8ZsJa^wA6v=#2sCEv>fvAEl-1JsnyijCVVn;F96iw5rqPe7fD8oTY%# zzkuFvwU@36G3K_Qb9Sag|zst|i=R^b=#SNyh%ugP6%%MroDY)>eBF2GVY8z>^ zA#zxcHJ~$H7_haaFxpbV8FL9XCW(Qu5ipQT9FWH50EP%nnyiM8k?@$e86)x5;K|ab zjRE)de=To@@M38Tdc;E#&wkd|ogxudAm_AcG^Zpl&8cWfutQ+j8P2|N;UJ?)WMH{j zkdUguXf=;74rRSb@MjvmMs8TC%hb};SB$d}XTE5h+iFFPJxFCbzy&paR@UwAE8I|a z>xv}SnwAD>pa%$y@(plQfgqr{x1+1G*MleHd-cI?2p3a%pSs%d=EyV)h8{65&x97d z>cDTWLv8Xn`g=akU54?c+i3h47%y-nOZ)e~&fmHUsODqv5K0UU8IB#yK_fyTqUYo+ z)d?A_7DlSo=IuV-hDwK$z_pp|ywWc)*!}X1qKo}@IdI`&akX%qVS+{otAS{>1hp0Y zbtneMFy6|*&|9z(0}COLj1K0FvK}l(J|&ecc3B9Bj{i?y%G7S#p%iNi46?!k>de^? z3Rs5G!w7B`gxJ+7U0I2THHuOQ(1_YGz6@iwwMq&Y2zO6EVh!zH9mMFImZ>*ZsuLy0 zn3@%twCb_%q@x}3@E3X|(lXKpMNGy8M6IZ*<}a>cyXYroi4JaIBJ!eQ3k4}8G!<+lI=Adwap=bECfTe( zW+rQEQP(u6ongYUT{QX6VtT7#Np6UV8Ib#0Si}K9g8qhj$h|~>RR>A#gn%ZG0P;rC zXb4sTR}i6mh^hs5)i70UnnMDF2qkUMOrr4^D7XnaV83=f7$B8Q&M?G4WL7l;K?{x` z{u*5F#e8Rgc*rV;5Ik9ip@F4bgtMYX0k#wg$ahLQc{34|8S4cHt2PcHrIj$$i66yu zQV^pm;)Dbq17r>Pa;eFUB?r>OOiJ&Q0|>(mpy5@cn3e0WYtS^ZjtF!vE8pbd@yJU2 WN)yF8Z)d&>{}*yaI8cynjKqQ37B1`n From 4f92b007b488bfc1fbb2651adf514840c56c5e6f Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 11 Jun 2018 22:38:32 +0200 Subject: [PATCH 060/216] 0.172-1 --- .gitignore | 1 + elfutils.spec | 13 ++++++++++++- sources | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 55cd66b..ef2da42 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ /elfutils-0.169.tar.bz2 /elfutils-0.170.tar.bz2 /elfutils-0.171.tar.bz2 +/elfutils-0.172.tar.bz2 diff --git a/elfutils.spec b/elfutils.spec index d1a7b08..7d2cd82 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.171 +Version: 0.172 %global baserelease 1 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -208,6 +208,9 @@ install -Dm0644 config/10-default-yama-scope.conf ${RPM_BUILD_ROOT}%{_sysctldir} %endif %check +# Record some build root versions in build.log +uname -r; rpm -q glibc + make -s %{?_smp_mflags} check || (cat tests/test-suite.log; false) # Only the latest Fedora and EPEL have these scriptlets, @@ -312,6 +315,14 @@ fi %endif %changelog +* Mon Jun 11 2018 Mark Wielaard - 0.172-1 +- New upstream release. + - No functional changes compared to 0.171. + - Various bug fixes in libdw and eu-readelf dealing with bad DWARF5 + data. Thanks to running the afl fuzzer on eu-readelf and various + testcases. + - eu-readelf -N is ~15% faster. + * Fri Jun 01 2018 Mark Wielaard - 0.171-1 - New upstream release. - DWARF5 and split dwarf, including GNU DebugFission, support. diff --git a/sources b/sources index 78d3ddb..284de0d 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.171.tar.bz2) = 777be2d63ca9b11440bf358a33428d9ca974e2612a880934156c9f7194af596ed627c1ed2d48dbd47a3761c94913b8f39565f9dcb6b62c92bf229f04c96d5ee3 +SHA512 (elfutils-0.172.tar.bz2) = b2f491e976ef3067fe33ad22b3ef1952c47557571747899e94aee601bfeb95e8e1a91daad80a7950bee7feb42192769663db32eb65734ea5ffbc0b87cdad76b2 From b1a53d2b760563454809cfb9540de15bc0019565 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 20 Jun 2018 14:21:05 +0200 Subject: [PATCH 061/216] 0.172-2 - Add elfutils-0.172-robustify.patch. --- elfutils-0.172-robustify.patch | 400 +++++++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 406 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.172-robustify.patch diff --git a/elfutils-0.172-robustify.patch b/elfutils-0.172-robustify.patch new file mode 100644 index 0000000..da02527 --- /dev/null +++ b/elfutils-0.172-robustify.patch @@ -0,0 +1,400 @@ +Upstream commits since 0.172: + + b4dced3 readelf: While printing .debug_loc make sure that next_off doesn't overflow. + bb11e36 libdw: Make __libdw_dieabbrev more robust on failure. + 3647b5b readelf: Make sure print_form_data always consumes DW_FORM_strx[1234] data. + eaaf908 readelf: Check there are at least 4 bytes available for DWARF_FORM_block4. + 0d93f49 libdw, readelf: Don't handle DW_FORM_data16 as expression block/location. + 9495c26 libdw: aggregate_size check NULL result from get_type. + e636112 libdw: dwarf_peel_type break long chains/cycles. + 5956b8a libdw: Break dwarf_aggregate_size recursion because of type cycles. + ca0d831 libelf: Don't return unaligned data returned from elf_getdata[_rawchunk]. + +diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c +index 6e50185..75105e4 100644 +--- a/libdw/dwarf_aggregate_size.c ++++ b/libdw/dwarf_aggregate_size.c +@@ -46,13 +46,17 @@ get_type (Dwarf_Die *die, Dwarf_Attribute *attr_mem, Dwarf_Die *type_mem) + return type; + } + ++static int aggregate_size (Dwarf_Die *die, Dwarf_Word *size, ++ Dwarf_Die *type_mem, int depth); ++ + static int + array_size (Dwarf_Die *die, Dwarf_Word *size, +- Dwarf_Attribute *attr_mem, Dwarf_Die *type_mem) ++ Dwarf_Attribute *attr_mem, int depth) + { + Dwarf_Word eltsize; +- if (INTUSE(dwarf_aggregate_size) (get_type (die, attr_mem, type_mem), +- &eltsize) != 0) ++ Dwarf_Die type_mem, aggregate_type_mem; ++ if (aggregate_size (get_type (die, attr_mem, &type_mem), &eltsize, ++ &aggregate_type_mem, depth) != 0) + return -1; + + /* An array can have DW_TAG_subrange_type or DW_TAG_enumeration_type +@@ -167,21 +171,30 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, + } + + static int +-aggregate_size (Dwarf_Die *die, Dwarf_Word *size, Dwarf_Die *type_mem) ++aggregate_size (Dwarf_Die *die, Dwarf_Word *size, ++ Dwarf_Die *type_mem, int depth) + { + Dwarf_Attribute attr_mem; + ++/* Arrays of arrays of subrange types of arrays... Don't recurse too deep. */ ++#define MAX_DEPTH 256 ++ if (die == NULL || depth++ >= MAX_DEPTH) ++ return -1; ++ + if (INTUSE(dwarf_attr_integrate) (die, DW_AT_byte_size, &attr_mem) != NULL) + return INTUSE(dwarf_formudata) (&attr_mem, size); + + switch (INTUSE(dwarf_tag) (die)) + { + case DW_TAG_subrange_type: +- return aggregate_size (get_type (die, &attr_mem, type_mem), +- size, type_mem); /* Tail call. */ ++ { ++ Dwarf_Die aggregate_type_mem; ++ return aggregate_size (get_type (die, &attr_mem, type_mem), ++ size, &aggregate_type_mem, depth); ++ } + + case DW_TAG_array_type: +- return array_size (die, size, &attr_mem, type_mem); ++ return array_size (die, size, &attr_mem, depth); + + /* Assume references and pointers have pointer size if not given an + explicit DW_AT_byte_size. */ +@@ -204,7 +217,7 @@ dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size) + if (INTUSE (dwarf_peel_type) (die, &die_mem) != 0) + return -1; + +- return aggregate_size (&die_mem, size, &type_mem); ++ return aggregate_size (&die_mem, size, &type_mem, 0); + } + INTDEF (dwarf_aggregate_size) + OLD_VERSION (dwarf_aggregate_size, ELFUTILS_0.144) +diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c +index 7f294fe..fc59a2a 100644 +--- a/libdw/dwarf_getlocation.c ++++ b/libdw/dwarf_getlocation.c +@@ -174,6 +174,8 @@ check_constant_offset (Dwarf_Attribute *attr, + default: + return 1; + ++ /* Note, we don't regard DW_FORM_data16 as a constant form, ++ even though technically it is according to the standard. */ + case DW_FORM_data1: + case DW_FORM_data2: + case DW_FORM_data4: +@@ -665,7 +667,13 @@ dwarf_getlocation (Dwarf_Attribute *attr, Dwarf_Op **llbuf, size_t *listlen) + if (result != 1) + return result; + +- /* If it has a block form, it's a single location expression. */ ++ /* If it has a block form, it's a single location expression. ++ Except for DW_FORM_data16, which is a 128bit constant. */ ++ if (attr->form == DW_FORM_data16) ++ { ++ __libdw_seterrno (DWARF_E_NO_BLOCK); ++ return -1; ++ } + Dwarf_Block block; + if (INTUSE(dwarf_formblock) (attr, &block) != 0) + return -1; +@@ -863,9 +871,11 @@ dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address, + if (llbufs == NULL) + maxlocs = SIZE_MAX; + +- /* If it has a block form, it's a single location expression. */ ++ /* If it has a block form, it's a single location expression. ++ Except for DW_FORM_data16, which is a 128bit constant. */ + Dwarf_Block block; +- if (INTUSE(dwarf_formblock) (attr, &block) == 0) ++ if (attr->form != DW_FORM_data16 ++ && INTUSE(dwarf_formblock) (attr, &block) == 0) + { + if (maxlocs == 0) + return 0; +@@ -876,11 +886,14 @@ dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address, + return listlens[0] == 0 ? 0 : 1; + } + +- int error = INTUSE(dwarf_errno) (); +- if (unlikely (error != DWARF_E_NO_BLOCK)) ++ if (attr->form != DW_FORM_data16) + { +- __libdw_seterrno (error); +- return -1; ++ int error = INTUSE(dwarf_errno) (); ++ if (unlikely (error != DWARF_E_NO_BLOCK)) ++ { ++ __libdw_seterrno (error); ++ return -1; ++ } + } + + int result = check_constant_offset (attr, &llbufs[0], &listlens[0]); +@@ -938,9 +951,11 @@ dwarf_getlocations (Dwarf_Attribute *attr, ptrdiff_t offset, Dwarf_Addr *basep, + + if (offset == 0) + { +- /* If it has a block form, it's a single location expression. */ ++ /* If it has a block form, it's a single location expression. ++ Except for DW_FORM_data16, which is a 128bit constant. */ + Dwarf_Block block; +- if (INTUSE(dwarf_formblock) (attr, &block) == 0) ++ if (attr->form != DW_FORM_data16 ++ && INTUSE(dwarf_formblock) (attr, &block) == 0) + { + if (getlocation (attr->cu, &block, expr, exprlen, + cu_sec_idx (attr->cu)) != 0) +@@ -952,11 +967,14 @@ dwarf_getlocations (Dwarf_Attribute *attr, ptrdiff_t offset, Dwarf_Addr *basep, + return 1; + } + +- int error = INTUSE(dwarf_errno) (); +- if (unlikely (error != DWARF_E_NO_BLOCK)) ++ if (attr->form != DW_FORM_data16) + { +- __libdw_seterrno (error); +- return -1; ++ int error = INTUSE(dwarf_errno) (); ++ if (unlikely (error != DWARF_E_NO_BLOCK)) ++ { ++ __libdw_seterrno (error); ++ return -1; ++ } + } + + int result = check_constant_offset (attr, expr, exprlen); +diff --git a/libdw/dwarf_peel_type.c b/libdw/dwarf_peel_type.c +index 6bbfd42..59fc6f1 100644 +--- a/libdw/dwarf_peel_type.c ++++ b/libdw/dwarf_peel_type.c +@@ -46,14 +46,19 @@ dwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result) + + *result = *die; + tag = INTUSE (dwarf_tag) (result); +- while (tag == DW_TAG_typedef +- || tag == DW_TAG_const_type +- || tag == DW_TAG_volatile_type +- || tag == DW_TAG_restrict_type +- || tag == DW_TAG_atomic_type +- || tag == DW_TAG_immutable_type +- || tag == DW_TAG_packed_type +- || tag == DW_TAG_shared_type) ++ ++/* Stack 8 of all these modifiers, after that it gets silly. */ ++#define MAX_DEPTH (8 * 8) ++ int max_depth = MAX_DEPTH; ++ while ((tag == DW_TAG_typedef ++ || tag == DW_TAG_const_type ++ || tag == DW_TAG_volatile_type ++ || tag == DW_TAG_restrict_type ++ || tag == DW_TAG_atomic_type ++ || tag == DW_TAG_immutable_type ++ || tag == DW_TAG_packed_type ++ || tag == DW_TAG_shared_type) ++ && max_depth-- > 0) + { + Dwarf_Attribute attr_mem; + Dwarf_Attribute *attr = INTUSE (dwarf_attr_integrate) (result, DW_AT_type, +@@ -67,7 +72,7 @@ dwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result) + tag = INTUSE (dwarf_tag) (result); + } + +- if (tag == DW_TAG_invalid) ++ if (tag == DW_TAG_invalid || max_depth <= 0) + return -1; + + return 0; +diff --git a/libdw/libdwP.h b/libdw/libdwP.h +index 3d8e145..eebb7d1 100644 +--- a/libdw/libdwP.h ++++ b/libdw/libdwP.h +@@ -653,8 +653,9 @@ __libdw_dieabbrev (Dwarf_Die *die, const unsigned char **readp) + /* Get the abbreviation code. */ + unsigned int code; + const unsigned char *addr = die->addr; +- if (die->cu == NULL || addr >= (const unsigned char *) die->cu->endp) +- return DWARF_END_ABBREV; ++ if (unlikely (die->cu == NULL ++ || addr >= (const unsigned char *) die->cu->endp)) ++ return die->abbrev = DWARF_END_ABBREV; + get_uleb128 (code, addr, die->cu->endp); + if (readp != NULL) + *readp = addr; +diff --git a/libdw/memory-access.h b/libdw/memory-access.h +index 22918cb..a39ad6d 100644 +--- a/libdw/memory-access.h ++++ b/libdw/memory-access.h +@@ -362,6 +362,11 @@ read_3ubyte_unaligned (Dwarf *dbg, const unsigned char *p) + } + + ++#define read_3ubyte_unaligned_inc(Dbg, Addr) \ ++ ({ uint32_t t_ = read_2ubyte_unaligned (Dbg, Addr); \ ++ Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 3); \ ++ t_; }) ++ + #define read_addr_unaligned_inc(Nbytes, Dbg, Addr) \ + (assert ((Nbytes) == 4 || (Nbytes) == 8), \ + ((Nbytes) == 4 ? read_4ubyte_unaligned_inc (Dbg, Addr) \ +diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c +index 97c503b..278dfa8 100644 +--- a/libelf/elf_getdata.c ++++ b/libelf/elf_getdata.c +@@ -76,7 +76,6 @@ static const Elf_Type shtype_map[EV_NUM - 1][TYPEIDX (SHT_HISUNW) + 1] = + } + }; + +-#if !ALLOW_UNALIGNED + /* Associate libelf types with their internal alignment requirements. */ + const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] = + { +@@ -115,7 +114,6 @@ const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] + } + # undef TYPE_ALIGNS + }; +-#endif + + + Elf_Type +@@ -173,8 +171,7 @@ convert_data (Elf_Scn *scn, int version __attribute__ ((unused)), int eclass, + /* Make sure the source is correctly aligned for the conversion + function to directly access the data elements. */ + char *rawdata_source; +- if (ALLOW_UNALIGNED || +- ((((size_t) (char *) scn->rawdata_base)) & (align - 1)) == 0) ++ if (((((size_t) (char *) scn->rawdata_base)) & (align - 1)) == 0) + rawdata_source = scn->rawdata_base; + else + { +diff --git a/libelf/elf_getdata_rawchunk.c b/libelf/elf_getdata_rawchunk.c +index 31b2fe7..d0c0b75 100644 +--- a/libelf/elf_getdata_rawchunk.c ++++ b/libelf/elf_getdata_rawchunk.c +@@ -80,8 +80,7 @@ elf_getdata_rawchunk (Elf *elf, off_t offset, size_t size, Elf_Type type) + { + /* If the file is mmap'ed we can use it directly, if aligned for type. */ + char *rawdata = elf->map_address + elf->start_offset + offset; +- if (ALLOW_UNALIGNED || +- ((uintptr_t) rawdata & (align - 1)) == 0) ++ if (((uintptr_t) rawdata & (align - 1)) == 0) + rawchunk = rawdata; + else + { +diff --git a/libelf/libelfP.h b/libelf/libelfP.h +index ca805ac..ed216c8 100644 +--- a/libelf/libelfP.h ++++ b/libelf/libelfP.h +@@ -443,15 +443,11 @@ extern int __libelf_version_initialized attribute_hidden; + # define LIBELF_EV_IDX (__libelf_version - 1) + #endif + +-#if !ALLOW_UNALIGNED + /* Array with alignment requirements of the internal types indexed by ELF + version, binary class, and type. */ + extern const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden; + # define __libelf_type_align(class, type) \ + (__libelf_type_aligns[LIBELF_EV_IDX][class - 1][type] ?: 1) +-#else +-# define __libelf_type_align(class, type) 1 +-#endif + + /* Given an Elf handle and a section type returns the Elf_Data d_type. + Should not be called when SHF_COMPRESSED is set, the d_type should +diff --git a/src/readelf.c b/src/readelf.c +index f185897..313f940 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -7403,11 +7403,16 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) + case DW_AT_GNU_call_site_data_value: + case DW_AT_GNU_call_site_target: + case DW_AT_GNU_call_site_target_clobbered: +- putchar ('\n'); +- print_ops (cbargs->dwflmod, cbargs->dbg, +- 12 + level * 2, 12 + level * 2, +- cbargs->version, cbargs->addrsize, cbargs->offset_size, +- attrp->cu, block.length, block.data); ++ if (form != DW_FORM_data16) ++ { ++ putchar ('\n'); ++ print_ops (cbargs->dwflmod, cbargs->dbg, ++ 12 + level * 2, 12 + level * 2, ++ cbargs->version, cbargs->addrsize, cbargs->offset_size, ++ attrp->cu, block.length, block.data); ++ } ++ else ++ print_block (block.length, block.data); + break; + } + break; +@@ -7907,7 +7912,7 @@ print_form_data (Dwarf *dbg, int form, const unsigned char *readp, + break; + + case DW_FORM_block4: +- if (readendp - readp < 2) ++ if (readendp - readp < 4) + goto invalid_data; + val = read_4ubyte_unaligned_inc (dbg, readp); + if ((size_t) (readendp - readp) < val) +@@ -7994,9 +7999,9 @@ print_form_data (Dwarf *dbg, int form, const unsigned char *readp, + { + Dwarf_Off idx; + if (offset_len == 8) +- idx = read_8ubyte_unaligned_inc (dbg, strreadp); ++ idx = read_8ubyte_unaligned (dbg, strreadp); + else +- idx = read_4ubyte_unaligned_inc (dbg, strreadp); ++ idx = read_4ubyte_unaligned (dbg, strreadp); + + data = dbg->sectiondata[IDX_debug_str]; + if (data == NULL || idx >= data->d_size +@@ -8013,25 +8018,25 @@ print_form_data (Dwarf *dbg, int form, const unsigned char *readp, + case DW_FORM_strx1: + if (readendp - readp < 1) + goto invalid_data; +- val = *readp; ++ val = *readp++; + goto strx_val; + + case DW_FORM_strx2: + if (readendp - readp < 2) + goto invalid_data; +- val = read_2ubyte_unaligned (dbg, readp); ++ val = read_2ubyte_unaligned_inc (dbg, readp); + goto strx_val; + + case DW_FORM_strx3: + if (readendp - readp < 3) + goto invalid_data; +- val = read_3ubyte_unaligned (dbg, readp); ++ val = read_3ubyte_unaligned_inc (dbg, readp); + goto strx_val; + + case DW_FORM_strx4: + if (readendp - readp < 4) + goto invalid_data; +- val = read_4ubyte_unaligned (dbg, readp); ++ val = read_4ubyte_unaligned_inc (dbg, readp); + goto strx_val; + + default: +@@ -9230,7 +9235,9 @@ print_debug_loc_section (Dwfl_Module *dwflmod, + listptr_idx); + const unsigned char *locp = readp; + const unsigned char *locendp; +- if (next_off == 0) ++ if (next_off == 0 ++ || next_off > (size_t) (endp ++ - (const unsigned char *) data->d_buf)) + locendp = endp; + else + locendp = (const unsigned char *) data->d_buf + next_off; diff --git a/elfutils.spec b/elfutils.spec index 7d2cd82..5cc9aae 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.172 -%global baserelease 1 +%global baserelease 2 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -21,6 +21,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches Patch1: elfutils-0.171-new-notes-hack.patch +Patch2: elfutils-0.172-robustify.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -175,6 +176,7 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .notes_hack +%patch2 -p1 -b .robustify # In case the above patches added any new test scripts, make sure they # are executable. @@ -315,6 +317,9 @@ fi %endif %changelog +* Wed Jun 20 2018 Mark Wielaard - 0.172-2 +- Add elfutils-0.172-robustify.patch. + * Mon Jun 11 2018 Mark Wielaard - 0.172-1 - New upstream release. - No functional changes compared to 0.171. From e2cfd394847d49e6bc9a062ad866f893c9b098c4 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 29 Jun 2018 22:37:37 +0200 Subject: [PATCH 062/216] 0.173-1 - New upstream release - More fixes for crashes and hangs found by afl-fuzz. In particular various functions now detect and break infinite loops caused by bad DIE tree cycles. - readelf: Will now lookup the size and signedness of constant value types to display them correctly (and not just how they were encoded). - libdw: New function dwarf_next_lines to read CU-less .debug_line data. dwarf_begin_elf now accepts ELF files containing just .debug_line or .debug_frame sections (which can be read without needing a DIE tree from the .debug_info section). Removed dwarf_getscn_info, which was never implemented. - backends: Handle BPF simple relocations. The RISCV backends now handles ABI specific CFI and knows about RISCV register types and names. --- .gitignore | 1 + elfutils-0.172-robustify.patch | 400 --------------------------------- elfutils.spec | 22 +- sources | 2 +- 4 files changed, 20 insertions(+), 405 deletions(-) delete mode 100644 elfutils-0.172-robustify.patch diff --git a/.gitignore b/.gitignore index ef2da42..bd02ed5 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ /elfutils-0.170.tar.bz2 /elfutils-0.171.tar.bz2 /elfutils-0.172.tar.bz2 +/elfutils-0.173.tar.bz2 diff --git a/elfutils-0.172-robustify.patch b/elfutils-0.172-robustify.patch deleted file mode 100644 index da02527..0000000 --- a/elfutils-0.172-robustify.patch +++ /dev/null @@ -1,400 +0,0 @@ -Upstream commits since 0.172: - - b4dced3 readelf: While printing .debug_loc make sure that next_off doesn't overflow. - bb11e36 libdw: Make __libdw_dieabbrev more robust on failure. - 3647b5b readelf: Make sure print_form_data always consumes DW_FORM_strx[1234] data. - eaaf908 readelf: Check there are at least 4 bytes available for DWARF_FORM_block4. - 0d93f49 libdw, readelf: Don't handle DW_FORM_data16 as expression block/location. - 9495c26 libdw: aggregate_size check NULL result from get_type. - e636112 libdw: dwarf_peel_type break long chains/cycles. - 5956b8a libdw: Break dwarf_aggregate_size recursion because of type cycles. - ca0d831 libelf: Don't return unaligned data returned from elf_getdata[_rawchunk]. - -diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c -index 6e50185..75105e4 100644 ---- a/libdw/dwarf_aggregate_size.c -+++ b/libdw/dwarf_aggregate_size.c -@@ -46,13 +46,17 @@ get_type (Dwarf_Die *die, Dwarf_Attribute *attr_mem, Dwarf_Die *type_mem) - return type; - } - -+static int aggregate_size (Dwarf_Die *die, Dwarf_Word *size, -+ Dwarf_Die *type_mem, int depth); -+ - static int - array_size (Dwarf_Die *die, Dwarf_Word *size, -- Dwarf_Attribute *attr_mem, Dwarf_Die *type_mem) -+ Dwarf_Attribute *attr_mem, int depth) - { - Dwarf_Word eltsize; -- if (INTUSE(dwarf_aggregate_size) (get_type (die, attr_mem, type_mem), -- &eltsize) != 0) -+ Dwarf_Die type_mem, aggregate_type_mem; -+ if (aggregate_size (get_type (die, attr_mem, &type_mem), &eltsize, -+ &aggregate_type_mem, depth) != 0) - return -1; - - /* An array can have DW_TAG_subrange_type or DW_TAG_enumeration_type -@@ -167,21 +171,30 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, - } - - static int --aggregate_size (Dwarf_Die *die, Dwarf_Word *size, Dwarf_Die *type_mem) -+aggregate_size (Dwarf_Die *die, Dwarf_Word *size, -+ Dwarf_Die *type_mem, int depth) - { - Dwarf_Attribute attr_mem; - -+/* Arrays of arrays of subrange types of arrays... Don't recurse too deep. */ -+#define MAX_DEPTH 256 -+ if (die == NULL || depth++ >= MAX_DEPTH) -+ return -1; -+ - if (INTUSE(dwarf_attr_integrate) (die, DW_AT_byte_size, &attr_mem) != NULL) - return INTUSE(dwarf_formudata) (&attr_mem, size); - - switch (INTUSE(dwarf_tag) (die)) - { - case DW_TAG_subrange_type: -- return aggregate_size (get_type (die, &attr_mem, type_mem), -- size, type_mem); /* Tail call. */ -+ { -+ Dwarf_Die aggregate_type_mem; -+ return aggregate_size (get_type (die, &attr_mem, type_mem), -+ size, &aggregate_type_mem, depth); -+ } - - case DW_TAG_array_type: -- return array_size (die, size, &attr_mem, type_mem); -+ return array_size (die, size, &attr_mem, depth); - - /* Assume references and pointers have pointer size if not given an - explicit DW_AT_byte_size. */ -@@ -204,7 +217,7 @@ dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size) - if (INTUSE (dwarf_peel_type) (die, &die_mem) != 0) - return -1; - -- return aggregate_size (&die_mem, size, &type_mem); -+ return aggregate_size (&die_mem, size, &type_mem, 0); - } - INTDEF (dwarf_aggregate_size) - OLD_VERSION (dwarf_aggregate_size, ELFUTILS_0.144) -diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c -index 7f294fe..fc59a2a 100644 ---- a/libdw/dwarf_getlocation.c -+++ b/libdw/dwarf_getlocation.c -@@ -174,6 +174,8 @@ check_constant_offset (Dwarf_Attribute *attr, - default: - return 1; - -+ /* Note, we don't regard DW_FORM_data16 as a constant form, -+ even though technically it is according to the standard. */ - case DW_FORM_data1: - case DW_FORM_data2: - case DW_FORM_data4: -@@ -665,7 +667,13 @@ dwarf_getlocation (Dwarf_Attribute *attr, Dwarf_Op **llbuf, size_t *listlen) - if (result != 1) - return result; - -- /* If it has a block form, it's a single location expression. */ -+ /* If it has a block form, it's a single location expression. -+ Except for DW_FORM_data16, which is a 128bit constant. */ -+ if (attr->form == DW_FORM_data16) -+ { -+ __libdw_seterrno (DWARF_E_NO_BLOCK); -+ return -1; -+ } - Dwarf_Block block; - if (INTUSE(dwarf_formblock) (attr, &block) != 0) - return -1; -@@ -863,9 +871,11 @@ dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address, - if (llbufs == NULL) - maxlocs = SIZE_MAX; - -- /* If it has a block form, it's a single location expression. */ -+ /* If it has a block form, it's a single location expression. -+ Except for DW_FORM_data16, which is a 128bit constant. */ - Dwarf_Block block; -- if (INTUSE(dwarf_formblock) (attr, &block) == 0) -+ if (attr->form != DW_FORM_data16 -+ && INTUSE(dwarf_formblock) (attr, &block) == 0) - { - if (maxlocs == 0) - return 0; -@@ -876,11 +886,14 @@ dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address, - return listlens[0] == 0 ? 0 : 1; - } - -- int error = INTUSE(dwarf_errno) (); -- if (unlikely (error != DWARF_E_NO_BLOCK)) -+ if (attr->form != DW_FORM_data16) - { -- __libdw_seterrno (error); -- return -1; -+ int error = INTUSE(dwarf_errno) (); -+ if (unlikely (error != DWARF_E_NO_BLOCK)) -+ { -+ __libdw_seterrno (error); -+ return -1; -+ } - } - - int result = check_constant_offset (attr, &llbufs[0], &listlens[0]); -@@ -938,9 +951,11 @@ dwarf_getlocations (Dwarf_Attribute *attr, ptrdiff_t offset, Dwarf_Addr *basep, - - if (offset == 0) - { -- /* If it has a block form, it's a single location expression. */ -+ /* If it has a block form, it's a single location expression. -+ Except for DW_FORM_data16, which is a 128bit constant. */ - Dwarf_Block block; -- if (INTUSE(dwarf_formblock) (attr, &block) == 0) -+ if (attr->form != DW_FORM_data16 -+ && INTUSE(dwarf_formblock) (attr, &block) == 0) - { - if (getlocation (attr->cu, &block, expr, exprlen, - cu_sec_idx (attr->cu)) != 0) -@@ -952,11 +967,14 @@ dwarf_getlocations (Dwarf_Attribute *attr, ptrdiff_t offset, Dwarf_Addr *basep, - return 1; - } - -- int error = INTUSE(dwarf_errno) (); -- if (unlikely (error != DWARF_E_NO_BLOCK)) -+ if (attr->form != DW_FORM_data16) - { -- __libdw_seterrno (error); -- return -1; -+ int error = INTUSE(dwarf_errno) (); -+ if (unlikely (error != DWARF_E_NO_BLOCK)) -+ { -+ __libdw_seterrno (error); -+ return -1; -+ } - } - - int result = check_constant_offset (attr, expr, exprlen); -diff --git a/libdw/dwarf_peel_type.c b/libdw/dwarf_peel_type.c -index 6bbfd42..59fc6f1 100644 ---- a/libdw/dwarf_peel_type.c -+++ b/libdw/dwarf_peel_type.c -@@ -46,14 +46,19 @@ dwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result) - - *result = *die; - tag = INTUSE (dwarf_tag) (result); -- while (tag == DW_TAG_typedef -- || tag == DW_TAG_const_type -- || tag == DW_TAG_volatile_type -- || tag == DW_TAG_restrict_type -- || tag == DW_TAG_atomic_type -- || tag == DW_TAG_immutable_type -- || tag == DW_TAG_packed_type -- || tag == DW_TAG_shared_type) -+ -+/* Stack 8 of all these modifiers, after that it gets silly. */ -+#define MAX_DEPTH (8 * 8) -+ int max_depth = MAX_DEPTH; -+ while ((tag == DW_TAG_typedef -+ || tag == DW_TAG_const_type -+ || tag == DW_TAG_volatile_type -+ || tag == DW_TAG_restrict_type -+ || tag == DW_TAG_atomic_type -+ || tag == DW_TAG_immutable_type -+ || tag == DW_TAG_packed_type -+ || tag == DW_TAG_shared_type) -+ && max_depth-- > 0) - { - Dwarf_Attribute attr_mem; - Dwarf_Attribute *attr = INTUSE (dwarf_attr_integrate) (result, DW_AT_type, -@@ -67,7 +72,7 @@ dwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result) - tag = INTUSE (dwarf_tag) (result); - } - -- if (tag == DW_TAG_invalid) -+ if (tag == DW_TAG_invalid || max_depth <= 0) - return -1; - - return 0; -diff --git a/libdw/libdwP.h b/libdw/libdwP.h -index 3d8e145..eebb7d1 100644 ---- a/libdw/libdwP.h -+++ b/libdw/libdwP.h -@@ -653,8 +653,9 @@ __libdw_dieabbrev (Dwarf_Die *die, const unsigned char **readp) - /* Get the abbreviation code. */ - unsigned int code; - const unsigned char *addr = die->addr; -- if (die->cu == NULL || addr >= (const unsigned char *) die->cu->endp) -- return DWARF_END_ABBREV; -+ if (unlikely (die->cu == NULL -+ || addr >= (const unsigned char *) die->cu->endp)) -+ return die->abbrev = DWARF_END_ABBREV; - get_uleb128 (code, addr, die->cu->endp); - if (readp != NULL) - *readp = addr; -diff --git a/libdw/memory-access.h b/libdw/memory-access.h -index 22918cb..a39ad6d 100644 ---- a/libdw/memory-access.h -+++ b/libdw/memory-access.h -@@ -362,6 +362,11 @@ read_3ubyte_unaligned (Dwarf *dbg, const unsigned char *p) - } - - -+#define read_3ubyte_unaligned_inc(Dbg, Addr) \ -+ ({ uint32_t t_ = read_2ubyte_unaligned (Dbg, Addr); \ -+ Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 3); \ -+ t_; }) -+ - #define read_addr_unaligned_inc(Nbytes, Dbg, Addr) \ - (assert ((Nbytes) == 4 || (Nbytes) == 8), \ - ((Nbytes) == 4 ? read_4ubyte_unaligned_inc (Dbg, Addr) \ -diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c -index 97c503b..278dfa8 100644 ---- a/libelf/elf_getdata.c -+++ b/libelf/elf_getdata.c -@@ -76,7 +76,6 @@ static const Elf_Type shtype_map[EV_NUM - 1][TYPEIDX (SHT_HISUNW) + 1] = - } - }; - --#if !ALLOW_UNALIGNED - /* Associate libelf types with their internal alignment requirements. */ - const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] = - { -@@ -115,7 +114,6 @@ const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] - } - # undef TYPE_ALIGNS - }; --#endif - - - Elf_Type -@@ -173,8 +171,7 @@ convert_data (Elf_Scn *scn, int version __attribute__ ((unused)), int eclass, - /* Make sure the source is correctly aligned for the conversion - function to directly access the data elements. */ - char *rawdata_source; -- if (ALLOW_UNALIGNED || -- ((((size_t) (char *) scn->rawdata_base)) & (align - 1)) == 0) -+ if (((((size_t) (char *) scn->rawdata_base)) & (align - 1)) == 0) - rawdata_source = scn->rawdata_base; - else - { -diff --git a/libelf/elf_getdata_rawchunk.c b/libelf/elf_getdata_rawchunk.c -index 31b2fe7..d0c0b75 100644 ---- a/libelf/elf_getdata_rawchunk.c -+++ b/libelf/elf_getdata_rawchunk.c -@@ -80,8 +80,7 @@ elf_getdata_rawchunk (Elf *elf, off_t offset, size_t size, Elf_Type type) - { - /* If the file is mmap'ed we can use it directly, if aligned for type. */ - char *rawdata = elf->map_address + elf->start_offset + offset; -- if (ALLOW_UNALIGNED || -- ((uintptr_t) rawdata & (align - 1)) == 0) -+ if (((uintptr_t) rawdata & (align - 1)) == 0) - rawchunk = rawdata; - else - { -diff --git a/libelf/libelfP.h b/libelf/libelfP.h -index ca805ac..ed216c8 100644 ---- a/libelf/libelfP.h -+++ b/libelf/libelfP.h -@@ -443,15 +443,11 @@ extern int __libelf_version_initialized attribute_hidden; - # define LIBELF_EV_IDX (__libelf_version - 1) - #endif - --#if !ALLOW_UNALIGNED - /* Array with alignment requirements of the internal types indexed by ELF - version, binary class, and type. */ - extern const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden; - # define __libelf_type_align(class, type) \ - (__libelf_type_aligns[LIBELF_EV_IDX][class - 1][type] ?: 1) --#else --# define __libelf_type_align(class, type) 1 --#endif - - /* Given an Elf handle and a section type returns the Elf_Data d_type. - Should not be called when SHF_COMPRESSED is set, the d_type should -diff --git a/src/readelf.c b/src/readelf.c -index f185897..313f940 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -7403,11 +7403,16 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) - case DW_AT_GNU_call_site_data_value: - case DW_AT_GNU_call_site_target: - case DW_AT_GNU_call_site_target_clobbered: -- putchar ('\n'); -- print_ops (cbargs->dwflmod, cbargs->dbg, -- 12 + level * 2, 12 + level * 2, -- cbargs->version, cbargs->addrsize, cbargs->offset_size, -- attrp->cu, block.length, block.data); -+ if (form != DW_FORM_data16) -+ { -+ putchar ('\n'); -+ print_ops (cbargs->dwflmod, cbargs->dbg, -+ 12 + level * 2, 12 + level * 2, -+ cbargs->version, cbargs->addrsize, cbargs->offset_size, -+ attrp->cu, block.length, block.data); -+ } -+ else -+ print_block (block.length, block.data); - break; - } - break; -@@ -7907,7 +7912,7 @@ print_form_data (Dwarf *dbg, int form, const unsigned char *readp, - break; - - case DW_FORM_block4: -- if (readendp - readp < 2) -+ if (readendp - readp < 4) - goto invalid_data; - val = read_4ubyte_unaligned_inc (dbg, readp); - if ((size_t) (readendp - readp) < val) -@@ -7994,9 +7999,9 @@ print_form_data (Dwarf *dbg, int form, const unsigned char *readp, - { - Dwarf_Off idx; - if (offset_len == 8) -- idx = read_8ubyte_unaligned_inc (dbg, strreadp); -+ idx = read_8ubyte_unaligned (dbg, strreadp); - else -- idx = read_4ubyte_unaligned_inc (dbg, strreadp); -+ idx = read_4ubyte_unaligned (dbg, strreadp); - - data = dbg->sectiondata[IDX_debug_str]; - if (data == NULL || idx >= data->d_size -@@ -8013,25 +8018,25 @@ print_form_data (Dwarf *dbg, int form, const unsigned char *readp, - case DW_FORM_strx1: - if (readendp - readp < 1) - goto invalid_data; -- val = *readp; -+ val = *readp++; - goto strx_val; - - case DW_FORM_strx2: - if (readendp - readp < 2) - goto invalid_data; -- val = read_2ubyte_unaligned (dbg, readp); -+ val = read_2ubyte_unaligned_inc (dbg, readp); - goto strx_val; - - case DW_FORM_strx3: - if (readendp - readp < 3) - goto invalid_data; -- val = read_3ubyte_unaligned (dbg, readp); -+ val = read_3ubyte_unaligned_inc (dbg, readp); - goto strx_val; - - case DW_FORM_strx4: - if (readendp - readp < 4) - goto invalid_data; -- val = read_4ubyte_unaligned (dbg, readp); -+ val = read_4ubyte_unaligned_inc (dbg, readp); - goto strx_val; - - default: -@@ -9230,7 +9235,9 @@ print_debug_loc_section (Dwfl_Module *dwflmod, - listptr_idx); - const unsigned char *locp = readp; - const unsigned char *locendp; -- if (next_off == 0) -+ if (next_off == 0 -+ || next_off > (size_t) (endp -+ - (const unsigned char *) data->d_buf)) - locendp = endp; - else - locendp = (const unsigned char *) data->d_buf + next_off; diff --git a/elfutils.spec b/elfutils.spec index 5cc9aae..ea617e4 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.172 -%global baserelease 2 +Version: 0.173 +%global baserelease 1 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -21,7 +21,6 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches Patch1: elfutils-0.171-new-notes-hack.patch -Patch2: elfutils-0.172-robustify.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -176,7 +175,6 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .notes_hack -%patch2 -p1 -b .robustify # In case the above patches added any new test scripts, make sure they # are executable. @@ -317,6 +315,22 @@ fi %endif %changelog +* Fri Jun 29 2018 Mark Wielaard - 0.173-1 +- New upstream release + - More fixes for crashes and hangs found by afl-fuzz. In particular + various functions now detect and break infinite loops caused by bad + DIE tree cycles. + - readelf: Will now lookup the size and signedness of constant value + types to display them correctly (and not just how they were encoded). + - libdw: New function dwarf_next_lines to read CU-less .debug_line data. + dwarf_begin_elf now accepts ELF files containing just .debug_line + or .debug_frame sections (which can be read without needing a DIE + tree from the .debug_info section). + Removed dwarf_getscn_info, which was never implemented. + - backends: Handle BPF simple relocations. + The RISCV backends now handles ABI specific CFI and knows about + RISCV register types and names. + * Wed Jun 20 2018 Mark Wielaard - 0.172-2 - Add elfutils-0.172-robustify.patch. diff --git a/sources b/sources index 284de0d..b26c602 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.172.tar.bz2) = b2f491e976ef3067fe33ad22b3ef1952c47557571747899e94aee601bfeb95e8e1a91daad80a7950bee7feb42192769663db32eb65734ea5ffbc0b87cdad76b2 +SHA512 (elfutils-0.173.tar.bz2) = 7f38e4ce2098b685f15030bf01f0a66a74aa32fbfcead0304c1d0e0a929b348a72f99e685cd4605465f4337393382112f64b8847e6c2f7cc1a57a4fd03d03eb3 From 1c7ceba1fdc1b18b89b10a8dd8b44a850f6ae499 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 9 Jul 2018 23:07:51 +0200 Subject: [PATCH 063/216] Update elfutils-0.173-new-notes-hack.patch for new annobin note. --- ...tch => elfutils-0.173-new-notes-hack.patch | 33 ++++++++++--------- elfutils.spec | 5 ++- 2 files changed, 22 insertions(+), 16 deletions(-) rename elfutils-0.171-new-notes-hack.patch => elfutils-0.173-new-notes-hack.patch (64%) diff --git a/elfutils-0.171-new-notes-hack.patch b/elfutils-0.173-new-notes-hack.patch similarity index 64% rename from elfutils-0.171-new-notes-hack.patch rename to elfutils-0.173-new-notes-hack.patch index f14562e..b47c211 100644 --- a/elfutils-0.171-new-notes-hack.patch +++ b/elfutils-0.173-new-notes-hack.patch @@ -1,21 +1,8 @@ diff --git a/src/elflint.c b/src/elflint.c -index df1b3a0..f4d82d9 100644 +index eec799b2..31092f2e 100644 --- a/src/elflint.c +++ b/src/elflint.c -@@ -4329,6 +4329,8 @@ section [%2d] '%s': unknown core file note type %" PRIu32 - case NT_GNU_HWCAP: - case NT_GNU_BUILD_ID: - case NT_GNU_GOLD_VERSION: -+ case NT_GNU_PROPERTY_TYPE_0: -+ case 256: - break; - - case 0: -diff --git a/src/elflint.c b/src/elflint.c -index 0a26d97..1cbf570 100644 ---- a/src/elflint.c -+++ b/src/elflint.c -@@ -3906,10 +3906,11 @@ section [%2zu] '%s': size not multiple of entry size\n"), +@@ -3905,10 +3905,11 @@ section [%2zu] '%s': size not multiple of entry size\n"), cnt, section_name (ebl, cnt), (int) shdr->sh_type); @@ -28,3 +15,19 @@ index 0a26d97..1cbf570 100644 if (shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS) { GElf_Xword sh_flags = shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS; +@@ -4324,10 +4325,15 @@ section [%2d] '%s': unknown core file note type %" PRIu32 + else + switch (nhdr.n_type) + { ++#define NT_GNU_BUILD_ATTRIBUTE_OPEN 0x100 ++#define NT_GNU_BUILD_ATTRIBUTE_FUNC 0x101 + case NT_GNU_ABI_TAG: + case NT_GNU_HWCAP: + case NT_GNU_BUILD_ID: + case NT_GNU_GOLD_VERSION: ++ case NT_GNU_PROPERTY_TYPE_0: ++ case NT_GNU_BUILD_ATTRIBUTE_OPEN: ++ case NT_GNU_BUILD_ATTRIBUTE_FUNC: + break; + + case 0: diff --git a/elfutils.spec b/elfutils.spec index ea617e4..67293da 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -20,7 +20,7 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -Patch1: elfutils-0.171-new-notes-hack.patch +Patch1: elfutils-0.173-new-notes-hack.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -315,6 +315,9 @@ fi %endif %changelog +* Mon Jul 9 2018 Mark Wielaard +- Update elfutils-0.173-new-notes-hack.patch for new annobin note. + * Fri Jun 29 2018 Mark Wielaard - 0.173-1 - New upstream release - More fixes for crashes and hangs found by afl-fuzz. In particular From 8eb32baf044d2a32b7368c6b191c786ddd60b938 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 10 Jul 2018 00:20:21 +0200 Subject: [PATCH 064/216] 0.173-2 - Unbreak cyclic systemd dependency for buildroot container (#1599083) --- elfutils.spec | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 67293da..1c3fd0d 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.173 -%global baserelease 1 +%global baserelease 2 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -156,9 +156,24 @@ Group: Development/Tools License: GPLv2+ or LGPLv3+ Provides: default-yama-scope BuildArch: noarch -# For the sysctl_apply macro -%{?systemd_requires} +# For the sysctl_apply macro we need systemd as build requires. +# We also need systemd-sysctl in post to apply the default kernel config. +# But this creates a circular requirement (see below). And it would always +# pull in systemd even in build containers that don't really need it. +# Luckily systemd is normally always installed already. The only times it +# might not is when we do an initial install (and the cyclic dependency +# chain might be broken) or when installing into a container. In the first +# case we'll reboot soon to apply the default kernel config. In the second +# case we really require that the host has the correct kernel config so it +# also is available inside the container. So if we have weak dependencies +# use Recommends (sadly Recommends(post) doesn't exist). This works because +# in all cases that really matter systemd will already be installed. #1599083 BuildRequires: systemd >= 215 +%if 0%{?fedora} > 24 || 0%{?rhel} > 7 +Recommends: systemd +%else +Requires(post): systemd +%endif %description default-yama-scope Yama sysctl setting to enable default attach scope settings @@ -315,8 +330,9 @@ fi %endif %changelog -* Mon Jul 9 2018 Mark Wielaard +* Mon Jul 9 2018 Mark Wielaard - 0.173-2 - Update elfutils-0.173-new-notes-hack.patch for new annobin note. +- Unbreak cyclic systemd dependency for buildroot container (#1599083) * Fri Jun 29 2018 Mark Wielaard - 0.173-1 - New upstream release From 3389438e13f1acf125439326b03127ae2f010575 Mon Sep 17 00:00:00 2001 From: Jason Tibbitts Date: Tue, 10 Jul 2018 00:45:50 -0500 Subject: [PATCH 065/216] Remove needless use of %defattr --- elfutils.spec | 8 -------- 1 file changed, 8 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 1c3fd0d..65b74f5 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -250,7 +250,6 @@ fi %endif %files -%defattr(-,root,root) %{!?_licensedir:%global license %%doc} %license COPYING COPYING-GPLV2 COPYING-LGPLV3 %doc README TODO CONTRIBUTING @@ -272,7 +271,6 @@ fi %{_bindir}/eu-elfcompress %files libs -%defattr(-,root,root) %{!?_licensedir:%global license %%doc} %license COPYING-GPLV2 COPYING-LGPLV3 %{_libdir}/libasm-%{version}.so @@ -283,7 +281,6 @@ fi %{_libdir}/elfutils/lib*.so %files devel -%defattr(-,root,root) %{_includedir}/dwarf.h %dir %{_includedir}/elfutils %{_includedir}/elfutils/elf-knowledge.h @@ -300,19 +297,16 @@ fi %{_libdir}/pkgconfig/libdw.pc %files devel-static -%defattr(-,root,root) %{_libdir}/libasm.a %{_libdir}/libdw.a %files -f %{name}.lang libelf -%defattr(-,root,root) %{!?_licensedir:%global license %%doc} %license COPYING-GPLV2 COPYING-LGPLV3 %{_libdir}/libelf-%{version}.so %{_libdir}/libelf.so.* %files libelf-devel -%defattr(-,root,root) %{_includedir}/libelf.h %{_includedir}/gelf.h %{_includedir}/nlist.h @@ -320,12 +314,10 @@ fi %{_libdir}/pkgconfig/libelf.pc %files libelf-devel-static -%defattr(-,root,root) %{_libdir}/libelf.a %if %{provide_yama_scope} %files default-yama-scope -%defattr(-,root,root) %{_sysctldir}/10-default-yama-scope.conf %endif From b28c2137771f8be4f74493076d00cf72db0218af Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 12 Jul 2018 23:46:46 +0000 Subject: [PATCH 066/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_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 65b74f5..b359f73 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.173 -%global baserelease 2 +%global baserelease 3 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -322,6 +322,9 @@ fi %endif %changelog +* Thu Jul 12 2018 Fedora Release Engineering - 0.173-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + * Mon Jul 9 2018 Mark Wielaard - 0.173-2 - Update elfutils-0.173-new-notes-hack.patch for new annobin note. - Unbreak cyclic systemd dependency for buildroot container (#1599083) From 15973e2b9bab41a0851627863f37a877851f5610 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 21 Jul 2018 17:20:57 +0200 Subject: [PATCH 067/216] 0.173-4 - Add elfutils-0.173-elfcompress.patch (#1607044) --- elfutils-0.173-elfcompress.patch | 136 +++++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.173-elfcompress.patch diff --git a/elfutils-0.173-elfcompress.patch b/elfutils-0.173-elfcompress.patch new file mode 100644 index 0000000..106071b --- /dev/null +++ b/elfutils-0.173-elfcompress.patch @@ -0,0 +1,136 @@ +commit 47499e57d9321f4e45f33a3c1ab12264510ee7a4 +Author: Mark Wielaard +Date: Sat Jul 21 16:10:25 2018 +0200 + + elfcompress: Swap fchmod and fchown calls on new file. + + Calling fchmod with a suid bit on a file might silently fail or the suid + bit might be slilently cleared by a call to fchown if already set. Swap + the calls so that the owner is set first and then set the suid bit. + + https://bugzilla.redhat.com/show_bug.cgi?id=1607044 + + Signed-off-by: Mark Wielaard + +diff --git a/src/elfcompress.c b/src/elfcompress.c +index bdb0e3b..1a0f984 100644 +--- a/src/elfcompress.c ++++ b/src/elfcompress.c +@@ -1235,13 +1235,16 @@ process_file (const char *fname) + elf_end (elfnew); + elfnew = NULL; + +- /* Try to match mode and owner.group of the original file. */ +- if (fchmod (fdnew, st.st_mode & ALLPERMS) != 0) +- if (verbose >= 0) +- error (0, errno, "Couldn't fchmod %s", fnew); ++ /* Try to match mode and owner.group of the original file. ++ Note to set suid bits we have to make sure the owner is setup ++ correctly first. Otherwise fchmod will drop them silently ++ or fchown may clear them. */ + if (fchown (fdnew, st.st_uid, st.st_gid) != 0) + if (verbose >= 0) + error (0, errno, "Couldn't fchown %s", fnew); ++ if (fchmod (fdnew, st.st_mode & ALLPERMS) != 0) ++ if (verbose >= 0) ++ error (0, errno, "Couldn't fchmod %s", fnew); + + /* Finally replace the old file with the new file. */ + if (foutput == NULL) + +commit d676c839e783996409d7845ea236e0883a827cbb +Author: Mark Wielaard +Date: Sat Jul 21 17:07:12 2018 +0200 + + elfcompress: Don't rewrite file if no section data needs to be updated. + + If the input and output file are the same and no section needs to + be updated we really don't need to rewrite the file. Check whether + any matching section is already compressed or (GNU) decompressed. + Skip the section if it doesn't need to be changed. If no section data + needs updating end with success without rewriting/updating file. + With --force the file will still always be updated/rewritten even if + no section data needs to be (de)compressed. + + Signed-off-by: Mark Wielaard + +diff --git a/src/elfcompress.c b/src/elfcompress.c +index 1a0f984..ae4708c 100644 +--- a/src/elfcompress.c ++++ b/src/elfcompress.c +@@ -1,5 +1,5 @@ + /* Compress or decompress an ELF file. +- Copyright (C) 2015, 2016 Red Hat, Inc. ++ Copyright (C) 2015, 2016, 2018 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -286,6 +286,15 @@ process_file (const char *fname) + return (sections[ndx / WORD_BITS] & (1U << (ndx % WORD_BITS))) != 0; + } + ++ /* How many sections are we going to change? */ ++ size_t get_sections (void) ++ { ++ size_t s = 0; ++ for (size_t i = 0; i < shnum / WORD_BITS + 1; i++) ++ s += __builtin_popcount (sections[i]); ++ return s; ++ } ++ + int cleanup (int res) + { + elf_end (elf); +@@ -422,6 +431,9 @@ process_file (const char *fname) + names change and whether there is a symbol table that might need + to be adjusted be if the section header name table is changed. + ++ If nothing needs changing, and the input and output file are the ++ same, we are done. ++ + Second a collection pass that creates the Elf sections and copies + the data. This pass will compress/decompress section data when + needed. And it will collect all data needed if we'll need to +@@ -464,7 +476,26 @@ process_file (const char *fname) + + if (section_name_matches (sname)) + { +- if (shdr->sh_type != SHT_NOBITS ++ if (!force && type == T_DECOMPRESS ++ && (shdr->sh_flags & SHF_COMPRESSED) == 0 ++ && strncmp (sname, ".zdebug", strlen (".zdebug")) != 0) ++ { ++ if (verbose > 0) ++ printf ("[%zd] %s already decompressed\n", ndx, sname); ++ } ++ else if (!force && type == T_COMPRESS_ZLIB ++ && (shdr->sh_flags & SHF_COMPRESSED) != 0) ++ { ++ if (verbose > 0) ++ printf ("[%zd] %s already compressed\n", ndx, sname); ++ } ++ else if (!force && type == T_COMPRESS_GNU ++ && strncmp (sname, ".zdebug", strlen (".zdebug")) == 0) ++ { ++ if (verbose > 0) ++ printf ("[%zd] %s already GNU compressed\n", ndx, sname); ++ } ++ else if (shdr->sh_type != SHT_NOBITS + && (shdr->sh_flags & SHF_ALLOC) == 0) + { + set_section (ndx); +@@ -518,6 +549,14 @@ process_file (const char *fname) + } + } + ++ if (foutput == NULL && get_sections () == 0) ++ { ++ if (verbose > 0) ++ printf ("Nothing to do.\n"); ++ fnew = NULL; ++ return cleanup (0); ++ } ++ + if (adjust_names) + { + names = dwelf_strtab_init (true); diff --git a/elfutils.spec b/elfutils.spec index b359f73..56795b0 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.173 -%global baserelease 3 +%global baserelease 4 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -21,6 +21,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches Patch1: elfutils-0.173-new-notes-hack.patch +Patch2: elfutils-0.173-elfcompress.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -190,6 +191,7 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .notes_hack +%patch2 -p1 -b .elfcompress # In case the above patches added any new test scripts, make sure they # are executable. @@ -322,6 +324,9 @@ fi %endif %changelog +* Sat Jul 21 2018 Mark Wielaard - 0.173-4 +- Add elfutils-0.173-elfcompress.patch (#1607044) + * Thu Jul 12 2018 Fedora Release Engineering - 0.173-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild From 896e01dee76f9a08594e75ecda324fc99e03fce2 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 21 Jul 2018 23:58:40 +0200 Subject: [PATCH 068/216] 0.173-5 - Add BuildRequires gcc-c++ for demangle support. - Add elfutils-0.173-annobingroup.patch. --- elfutils-0.173-annobingroup.patch | 30 ++++++++++++++++++++++++++++++ elfutils.spec | 9 ++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.173-annobingroup.patch diff --git a/elfutils-0.173-annobingroup.patch b/elfutils-0.173-annobingroup.patch new file mode 100644 index 0000000..8b112b5 --- /dev/null +++ b/elfutils-0.173-annobingroup.patch @@ -0,0 +1,30 @@ +commit 73e83285fbeac648edb60a0c4767fad9d470cf0a +Author: Mark Wielaard +Date: Sat Jul 21 23:40:11 2018 +0200 + + unstrip: Handle SHT_GROUP sections in ET_REL files. + + SHT_GROUP sections are put in both the stripped and debug file. + Handle correcting the symbol table/name entry of the group only once. + + The testfile was generated with the gcc annobin plugin. + + Signed-off-by: Mark Wielaard + +diff --git a/src/unstrip.c b/src/unstrip.c +index 057efef..cb1f7dc 100644 +--- a/src/unstrip.c ++++ b/src/unstrip.c +@@ -563,7 +563,11 @@ adjust_all_relocs (Elf *elf, Elf_Scn *symtab, const GElf_Shdr *symshdr, + GElf_Shdr shdr_mem; + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); + ELF_CHECK (shdr != NULL, _("cannot get section header: %s")); +- if (shdr->sh_type != SHT_NOBITS && shdr->sh_link == new_sh_link) ++ /* Don't redo SHT_GROUP, groups are in both the stripped and debug, ++ it will already have been done by adjust_relocs for the ++ stripped_symtab. */ ++ if (shdr->sh_type != SHT_NOBITS && shdr->sh_type != SHT_GROUP ++ && shdr->sh_link == new_sh_link) + adjust_relocs (scn, scn, shdr, map, symshdr); + } + } diff --git a/elfutils.spec b/elfutils.spec index 56795b0..ed7e4ae 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.173 -%global baserelease 4 +%global baserelease 5 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -22,6 +22,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches Patch1: elfutils-0.173-new-notes-hack.patch Patch2: elfutils-0.173-elfcompress.patch +Patch3: elfutils-0.173-annobingroup.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -33,6 +34,7 @@ BuildRequires: bzip2 BuildRequires: gcc >= 4.4 # For libstdc++ demangle support BuildRequires: libstdc++-devel +BuildRequires: gcc-c++ BuildRequires: zlib-devel >= 1.2.2.3 BuildRequires: bzip2-devel @@ -192,6 +194,7 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .notes_hack %patch2 -p1 -b .elfcompress +%patch3 -p1 -b .annobingroup # In case the above patches added any new test scripts, make sure they # are executable. @@ -324,6 +327,10 @@ fi %endif %changelog +* Sat Jul 21 2018 Mark Wielaard - 0.173-5 +- Add BuildRequires gcc-c++ for demangle support. +- Add elfutils-0.173-annobingroup.patch. + * Sat Jul 21 2018 Mark Wielaard - 0.173-4 - Add elfutils-0.173-elfcompress.patch (#1607044) From 153c7badff5864bfa28cb61f694a9d2bfd4f4c5e Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 25 Jul 2018 00:23:45 +0200 Subject: [PATCH 069/216] 0.173-6 - Update elfutils-0.173-annobingroup.patch. --- elfutils-0.173-annobingroup.patch | 33 +++++++++++++++++++++++++++++++ elfutils.spec | 5 ++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/elfutils-0.173-annobingroup.patch b/elfutils-0.173-annobingroup.patch index 8b112b5..712097e 100644 --- a/elfutils-0.173-annobingroup.patch +++ b/elfutils-0.173-annobingroup.patch @@ -28,3 +28,36 @@ index 057efef..cb1f7dc 100644 adjust_relocs (scn, scn, shdr, map, symshdr); } } +commit 47092416243d54e4cff3cd2558ece8b93695d54e +Author: Mark Wielaard +Date: Tue Jul 24 23:34:19 2018 +0200 + + unstrip: Also check sh_size in compare_unalloc_sections. + + compare_unalloc_sections only checked sh_flags and the section names. + This would cause stripped/debug section mismatches when there were + multiple sections with the same name and flags. Fix this by also checking + the size of the section matches. + + Add a testcase that has two ".group" sections created on i386 with the + gcc annobin plugin. + + Signed-off-by: Mark Wielaard + +diff --git a/src/unstrip.c b/src/unstrip.c +index cb1f7dc..ec46c95 100644 +--- a/src/unstrip.c ++++ b/src/unstrip.c +@@ -709,6 +709,12 @@ compare_unalloc_sections (const GElf_Shdr *shdr1, const GElf_Shdr *shdr2, + if (shdr1->sh_flags > shdr2->sh_flags) + return 1; + ++ /* Sizes should be the same. */ ++ if (shdr1->sh_size < shdr2->sh_size) ++ return -1; ++ if (shdr1->sh_size > shdr2->sh_size) ++ return 1; ++ + /* Sort by name as last resort. */ + return strcmp (name1, name2); + } diff --git a/elfutils.spec b/elfutils.spec index ed7e4ae..6f32bad 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.173 -%global baserelease 5 +%global baserelease 6 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -327,6 +327,9 @@ fi %endif %changelog +* Tue Jul 24 2018 Mark Wielaard - 0.173-6 +- Update elfutils-0.173-annobingroup.patch. + * Sat Jul 21 2018 Mark Wielaard - 0.173-5 - Add BuildRequires gcc-c++ for demangle support. - Add elfutils-0.173-annobingroup.patch. From a668bbdd563b15292bf26c3d109f3be75adf4677 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 27 Jul 2018 23:47:54 +0200 Subject: [PATCH 070/216] Drop libstdc++-devel BuildRequires. gcc-c++ will pull it in if necessary. --- elfutils.spec | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 6f32bad..357fd55 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -33,7 +33,6 @@ BuildRequires: flex >= 2.5.4a BuildRequires: bzip2 BuildRequires: gcc >= 4.4 # For libstdc++ demangle support -BuildRequires: libstdc++-devel BuildRequires: gcc-c++ BuildRequires: zlib-devel >= 1.2.2.3 @@ -327,6 +326,9 @@ fi %endif %changelog +* Tue Jul 24 2018 Mark Wielaard +- Drop libstdc++-devel BuildRequires. gcc-c++ will pull it in. + * Tue Jul 24 2018 Mark Wielaard - 0.173-6 - Update elfutils-0.173-annobingroup.patch. From 39568516c30c1ad5a956cfaca0d9fca8af3a5de5 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 30 Jul 2018 00:27:06 +0200 Subject: [PATCH 071/216] 0.173-7 - Add elfutils-0.173-strip-alloc-nonalloc.patch (#1609577) --- elfutils-0.173-strip-alloc-nonalloc.patch | 108 ++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.173-strip-alloc-nonalloc.patch diff --git a/elfutils-0.173-strip-alloc-nonalloc.patch b/elfutils-0.173-strip-alloc-nonalloc.patch new file mode 100644 index 0000000..700a516 --- /dev/null +++ b/elfutils-0.173-strip-alloc-nonalloc.patch @@ -0,0 +1,108 @@ +diff --git a/src/strip.c b/src/strip.c +index 791347c..1367de7 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -661,6 +661,11 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + memset (shdr_info, '\0', (shnum + 2) * sizeof (struct shdr_info)); + } + ++ /* Track whether allocated sections all come before non-allocated ones. */ ++ bool seen_allocated = false; ++ bool seen_unallocated = false; ++ bool mixed_allocated_unallocated = false; ++ + /* Prepare section information data structure. */ + scn = NULL; + cnt = 1; +@@ -676,6 +681,17 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + if (gelf_getshdr (scn, &shdr_info[cnt].shdr) == NULL) + INTERNAL_ERROR (fname); + ++ /* Normally (in non-ET_REL files) we see all allocated sections first, ++ then all non-allocated. */ ++ if ((shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) == 0) ++ seen_unallocated = true; ++ else ++ { ++ if (seen_unallocated && seen_allocated) ++ mixed_allocated_unallocated = true; ++ seen_allocated = true; ++ } ++ + /* Get the name of the section. */ + shdr_info[cnt].name = elf_strptr (elf, shstrndx, + shdr_info[cnt].shdr.sh_name); +@@ -1535,24 +1551,58 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + } + } + +- /* If we have to, compute the offset of the section. */ +- if (shdr_info[cnt].shdr.sh_offset == 0) +- shdr_info[cnt].shdr.sh_offset +- = ((lastoffset + shdr_info[cnt].shdr.sh_addralign - 1) +- & ~((GElf_Off) (shdr_info[cnt].shdr.sh_addralign - 1))); +- +- /* Set the section header in the new file. */ +- if (unlikely (gelf_update_shdr (scn, &shdr_info[cnt].shdr) == 0)) +- /* There cannot be any overflows. */ +- INTERNAL_ERROR (fname); ++ /* If we have to, compute the offset of the section. ++ If allocate and unallocated sections are mixed, we only update ++ the allocated ones now. The unallocated ones come second. */ ++ if (! mixed_allocated_unallocated ++ || (shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) != 0) ++ { ++ if (shdr_info[cnt].shdr.sh_offset == 0) ++ shdr_info[cnt].shdr.sh_offset ++ = ((lastoffset + shdr_info[cnt].shdr.sh_addralign - 1) ++ & ~((GElf_Off) (shdr_info[cnt].shdr.sh_addralign - 1))); ++ ++ /* Set the section header in the new file. */ ++ if (unlikely (gelf_update_shdr (scn, &shdr_info[cnt].shdr) == 0)) ++ /* There cannot be any overflows. */ ++ INTERNAL_ERROR (fname); + +- /* Remember the last section written so far. */ +- GElf_Off filesz = (shdr_info[cnt].shdr.sh_type != SHT_NOBITS +- ? shdr_info[cnt].shdr.sh_size : 0); +- if (lastoffset < shdr_info[cnt].shdr.sh_offset + filesz) +- lastoffset = shdr_info[cnt].shdr.sh_offset + filesz; ++ /* Remember the last section written so far. */ ++ GElf_Off filesz = (shdr_info[cnt].shdr.sh_type != SHT_NOBITS ++ ? shdr_info[cnt].shdr.sh_size : 0); ++ if (lastoffset < shdr_info[cnt].shdr.sh_offset + filesz) ++ lastoffset = shdr_info[cnt].shdr.sh_offset + filesz; ++ } + } + ++ /* We might have to update the unallocated sections after we done the ++ allocated ones. lastoffset is set to right after the last allocated ++ section. */ ++ if (mixed_allocated_unallocated) ++ for (cnt = 1; cnt <= shdridx; ++cnt) ++ if (shdr_info[cnt].idx > 0) ++ { ++ scn = elf_getscn (newelf, shdr_info[cnt].idx); ++ if ((shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) == 0) ++ { ++ if (shdr_info[cnt].shdr.sh_offset == 0) ++ shdr_info[cnt].shdr.sh_offset ++ = ((lastoffset + shdr_info[cnt].shdr.sh_addralign - 1) ++ & ~((GElf_Off) (shdr_info[cnt].shdr.sh_addralign - 1))); ++ ++ /* Set the section header in the new file. */ ++ if (unlikely (gelf_update_shdr (scn, &shdr_info[cnt].shdr) == 0)) ++ /* There cannot be any overflows. */ ++ INTERNAL_ERROR (fname); ++ ++ /* Remember the last section written so far. */ ++ GElf_Off filesz = (shdr_info[cnt].shdr.sh_type != SHT_NOBITS ++ ? shdr_info[cnt].shdr.sh_size : 0); ++ if (lastoffset < shdr_info[cnt].shdr.sh_offset + filesz) ++ lastoffset = shdr_info[cnt].shdr.sh_offset + filesz; ++ } ++ } ++ + /* Adjust symbol references if symbol tables changed. */ + if (any_symtab_changes) + /* Find all relocation sections which use this symbol table. */ diff --git a/elfutils.spec b/elfutils.spec index 357fd55..49b9b1b 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.173 -%global baserelease 6 +%global baserelease 7 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -23,6 +23,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: elfutils-0.173-new-notes-hack.patch Patch2: elfutils-0.173-elfcompress.patch Patch3: elfutils-0.173-annobingroup.patch +Patch4: elfutils-0.173-strip-alloc-nonalloc.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -194,6 +195,7 @@ profiling) of processes. %patch1 -p1 -b .notes_hack %patch2 -p1 -b .elfcompress %patch3 -p1 -b .annobingroup +%patch4 -p1 -b .strip-alloc-nonalloc # In case the above patches added any new test scripts, make sure they # are executable. @@ -326,6 +328,9 @@ fi %endif %changelog +* Sun Jul 29 2018 Mark Wielaard - 0.173-7 +- Add elfutils-0.173-strip-alloc-nonalloc.patch (#1609577) + * Tue Jul 24 2018 Mark Wielaard - Drop libstdc++-devel BuildRequires. gcc-c++ will pull it in. From fe9cd06e655b9fa0e6fc6162d1b428400dc7f0b2 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Tue, 31 Jul 2018 11:04:03 +0200 Subject: [PATCH 072/216] Rebuild with fixed binutils --- elfutils.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 49b9b1b..0891afc 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.173 -%global baserelease 7 +%global baserelease 8 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -328,6 +328,9 @@ fi %endif %changelog +* Tue Jul 31 2018 Florian Weimer - 0.173-8 +- Rebuild with fixed binutils + * Sun Jul 29 2018 Mark Wielaard - 0.173-7 - Add elfutils-0.173-strip-alloc-nonalloc.patch (#1609577) From 7a679f4677cf66cb39b3b1b23de70fd599eb95ed Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 14 Sep 2018 14:33:46 +0200 Subject: [PATCH 073/216] elfutils 0.174 --- .gitignore | 1 + elfutils-0.173-annobingroup.patch | 63 ---------- elfutils-0.173-elfcompress.patch | 136 ---------------------- elfutils-0.173-strip-alloc-nonalloc.patch | 108 ----------------- elfutils.spec | 23 ++-- sources | 2 +- 6 files changed, 17 insertions(+), 316 deletions(-) delete mode 100644 elfutils-0.173-annobingroup.patch delete mode 100644 elfutils-0.173-elfcompress.patch delete mode 100644 elfutils-0.173-strip-alloc-nonalloc.patch diff --git a/.gitignore b/.gitignore index bd02ed5..e08fcd1 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ /elfutils-0.171.tar.bz2 /elfutils-0.172.tar.bz2 /elfutils-0.173.tar.bz2 +/elfutils-0.174.tar.bz2 diff --git a/elfutils-0.173-annobingroup.patch b/elfutils-0.173-annobingroup.patch deleted file mode 100644 index 712097e..0000000 --- a/elfutils-0.173-annobingroup.patch +++ /dev/null @@ -1,63 +0,0 @@ -commit 73e83285fbeac648edb60a0c4767fad9d470cf0a -Author: Mark Wielaard -Date: Sat Jul 21 23:40:11 2018 +0200 - - unstrip: Handle SHT_GROUP sections in ET_REL files. - - SHT_GROUP sections are put in both the stripped and debug file. - Handle correcting the symbol table/name entry of the group only once. - - The testfile was generated with the gcc annobin plugin. - - Signed-off-by: Mark Wielaard - -diff --git a/src/unstrip.c b/src/unstrip.c -index 057efef..cb1f7dc 100644 ---- a/src/unstrip.c -+++ b/src/unstrip.c -@@ -563,7 +563,11 @@ adjust_all_relocs (Elf *elf, Elf_Scn *symtab, const GElf_Shdr *symshdr, - GElf_Shdr shdr_mem; - GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); - ELF_CHECK (shdr != NULL, _("cannot get section header: %s")); -- if (shdr->sh_type != SHT_NOBITS && shdr->sh_link == new_sh_link) -+ /* Don't redo SHT_GROUP, groups are in both the stripped and debug, -+ it will already have been done by adjust_relocs for the -+ stripped_symtab. */ -+ if (shdr->sh_type != SHT_NOBITS && shdr->sh_type != SHT_GROUP -+ && shdr->sh_link == new_sh_link) - adjust_relocs (scn, scn, shdr, map, symshdr); - } - } -commit 47092416243d54e4cff3cd2558ece8b93695d54e -Author: Mark Wielaard -Date: Tue Jul 24 23:34:19 2018 +0200 - - unstrip: Also check sh_size in compare_unalloc_sections. - - compare_unalloc_sections only checked sh_flags and the section names. - This would cause stripped/debug section mismatches when there were - multiple sections with the same name and flags. Fix this by also checking - the size of the section matches. - - Add a testcase that has two ".group" sections created on i386 with the - gcc annobin plugin. - - Signed-off-by: Mark Wielaard - -diff --git a/src/unstrip.c b/src/unstrip.c -index cb1f7dc..ec46c95 100644 ---- a/src/unstrip.c -+++ b/src/unstrip.c -@@ -709,6 +709,12 @@ compare_unalloc_sections (const GElf_Shdr *shdr1, const GElf_Shdr *shdr2, - if (shdr1->sh_flags > shdr2->sh_flags) - return 1; - -+ /* Sizes should be the same. */ -+ if (shdr1->sh_size < shdr2->sh_size) -+ return -1; -+ if (shdr1->sh_size > shdr2->sh_size) -+ return 1; -+ - /* Sort by name as last resort. */ - return strcmp (name1, name2); - } diff --git a/elfutils-0.173-elfcompress.patch b/elfutils-0.173-elfcompress.patch deleted file mode 100644 index 106071b..0000000 --- a/elfutils-0.173-elfcompress.patch +++ /dev/null @@ -1,136 +0,0 @@ -commit 47499e57d9321f4e45f33a3c1ab12264510ee7a4 -Author: Mark Wielaard -Date: Sat Jul 21 16:10:25 2018 +0200 - - elfcompress: Swap fchmod and fchown calls on new file. - - Calling fchmod with a suid bit on a file might silently fail or the suid - bit might be slilently cleared by a call to fchown if already set. Swap - the calls so that the owner is set first and then set the suid bit. - - https://bugzilla.redhat.com/show_bug.cgi?id=1607044 - - Signed-off-by: Mark Wielaard - -diff --git a/src/elfcompress.c b/src/elfcompress.c -index bdb0e3b..1a0f984 100644 ---- a/src/elfcompress.c -+++ b/src/elfcompress.c -@@ -1235,13 +1235,16 @@ process_file (const char *fname) - elf_end (elfnew); - elfnew = NULL; - -- /* Try to match mode and owner.group of the original file. */ -- if (fchmod (fdnew, st.st_mode & ALLPERMS) != 0) -- if (verbose >= 0) -- error (0, errno, "Couldn't fchmod %s", fnew); -+ /* Try to match mode and owner.group of the original file. -+ Note to set suid bits we have to make sure the owner is setup -+ correctly first. Otherwise fchmod will drop them silently -+ or fchown may clear them. */ - if (fchown (fdnew, st.st_uid, st.st_gid) != 0) - if (verbose >= 0) - error (0, errno, "Couldn't fchown %s", fnew); -+ if (fchmod (fdnew, st.st_mode & ALLPERMS) != 0) -+ if (verbose >= 0) -+ error (0, errno, "Couldn't fchmod %s", fnew); - - /* Finally replace the old file with the new file. */ - if (foutput == NULL) - -commit d676c839e783996409d7845ea236e0883a827cbb -Author: Mark Wielaard -Date: Sat Jul 21 17:07:12 2018 +0200 - - elfcompress: Don't rewrite file if no section data needs to be updated. - - If the input and output file are the same and no section needs to - be updated we really don't need to rewrite the file. Check whether - any matching section is already compressed or (GNU) decompressed. - Skip the section if it doesn't need to be changed. If no section data - needs updating end with success without rewriting/updating file. - With --force the file will still always be updated/rewritten even if - no section data needs to be (de)compressed. - - Signed-off-by: Mark Wielaard - -diff --git a/src/elfcompress.c b/src/elfcompress.c -index 1a0f984..ae4708c 100644 ---- a/src/elfcompress.c -+++ b/src/elfcompress.c -@@ -1,5 +1,5 @@ - /* Compress or decompress an ELF file. -- Copyright (C) 2015, 2016 Red Hat, Inc. -+ Copyright (C) 2015, 2016, 2018 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -286,6 +286,15 @@ process_file (const char *fname) - return (sections[ndx / WORD_BITS] & (1U << (ndx % WORD_BITS))) != 0; - } - -+ /* How many sections are we going to change? */ -+ size_t get_sections (void) -+ { -+ size_t s = 0; -+ for (size_t i = 0; i < shnum / WORD_BITS + 1; i++) -+ s += __builtin_popcount (sections[i]); -+ return s; -+ } -+ - int cleanup (int res) - { - elf_end (elf); -@@ -422,6 +431,9 @@ process_file (const char *fname) - names change and whether there is a symbol table that might need - to be adjusted be if the section header name table is changed. - -+ If nothing needs changing, and the input and output file are the -+ same, we are done. -+ - Second a collection pass that creates the Elf sections and copies - the data. This pass will compress/decompress section data when - needed. And it will collect all data needed if we'll need to -@@ -464,7 +476,26 @@ process_file (const char *fname) - - if (section_name_matches (sname)) - { -- if (shdr->sh_type != SHT_NOBITS -+ if (!force && type == T_DECOMPRESS -+ && (shdr->sh_flags & SHF_COMPRESSED) == 0 -+ && strncmp (sname, ".zdebug", strlen (".zdebug")) != 0) -+ { -+ if (verbose > 0) -+ printf ("[%zd] %s already decompressed\n", ndx, sname); -+ } -+ else if (!force && type == T_COMPRESS_ZLIB -+ && (shdr->sh_flags & SHF_COMPRESSED) != 0) -+ { -+ if (verbose > 0) -+ printf ("[%zd] %s already compressed\n", ndx, sname); -+ } -+ else if (!force && type == T_COMPRESS_GNU -+ && strncmp (sname, ".zdebug", strlen (".zdebug")) == 0) -+ { -+ if (verbose > 0) -+ printf ("[%zd] %s already GNU compressed\n", ndx, sname); -+ } -+ else if (shdr->sh_type != SHT_NOBITS - && (shdr->sh_flags & SHF_ALLOC) == 0) - { - set_section (ndx); -@@ -518,6 +549,14 @@ process_file (const char *fname) - } - } - -+ if (foutput == NULL && get_sections () == 0) -+ { -+ if (verbose > 0) -+ printf ("Nothing to do.\n"); -+ fnew = NULL; -+ return cleanup (0); -+ } -+ - if (adjust_names) - { - names = dwelf_strtab_init (true); diff --git a/elfutils-0.173-strip-alloc-nonalloc.patch b/elfutils-0.173-strip-alloc-nonalloc.patch deleted file mode 100644 index 700a516..0000000 --- a/elfutils-0.173-strip-alloc-nonalloc.patch +++ /dev/null @@ -1,108 +0,0 @@ -diff --git a/src/strip.c b/src/strip.c -index 791347c..1367de7 100644 ---- a/src/strip.c -+++ b/src/strip.c -@@ -661,6 +661,11 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - memset (shdr_info, '\0', (shnum + 2) * sizeof (struct shdr_info)); - } - -+ /* Track whether allocated sections all come before non-allocated ones. */ -+ bool seen_allocated = false; -+ bool seen_unallocated = false; -+ bool mixed_allocated_unallocated = false; -+ - /* Prepare section information data structure. */ - scn = NULL; - cnt = 1; -@@ -676,6 +681,17 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - if (gelf_getshdr (scn, &shdr_info[cnt].shdr) == NULL) - INTERNAL_ERROR (fname); - -+ /* Normally (in non-ET_REL files) we see all allocated sections first, -+ then all non-allocated. */ -+ if ((shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) == 0) -+ seen_unallocated = true; -+ else -+ { -+ if (seen_unallocated && seen_allocated) -+ mixed_allocated_unallocated = true; -+ seen_allocated = true; -+ } -+ - /* Get the name of the section. */ - shdr_info[cnt].name = elf_strptr (elf, shstrndx, - shdr_info[cnt].shdr.sh_name); -@@ -1535,24 +1551,58 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - } - } - -- /* If we have to, compute the offset of the section. */ -- if (shdr_info[cnt].shdr.sh_offset == 0) -- shdr_info[cnt].shdr.sh_offset -- = ((lastoffset + shdr_info[cnt].shdr.sh_addralign - 1) -- & ~((GElf_Off) (shdr_info[cnt].shdr.sh_addralign - 1))); -- -- /* Set the section header in the new file. */ -- if (unlikely (gelf_update_shdr (scn, &shdr_info[cnt].shdr) == 0)) -- /* There cannot be any overflows. */ -- INTERNAL_ERROR (fname); -+ /* If we have to, compute the offset of the section. -+ If allocate and unallocated sections are mixed, we only update -+ the allocated ones now. The unallocated ones come second. */ -+ if (! mixed_allocated_unallocated -+ || (shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) != 0) -+ { -+ if (shdr_info[cnt].shdr.sh_offset == 0) -+ shdr_info[cnt].shdr.sh_offset -+ = ((lastoffset + shdr_info[cnt].shdr.sh_addralign - 1) -+ & ~((GElf_Off) (shdr_info[cnt].shdr.sh_addralign - 1))); -+ -+ /* Set the section header in the new file. */ -+ if (unlikely (gelf_update_shdr (scn, &shdr_info[cnt].shdr) == 0)) -+ /* There cannot be any overflows. */ -+ INTERNAL_ERROR (fname); - -- /* Remember the last section written so far. */ -- GElf_Off filesz = (shdr_info[cnt].shdr.sh_type != SHT_NOBITS -- ? shdr_info[cnt].shdr.sh_size : 0); -- if (lastoffset < shdr_info[cnt].shdr.sh_offset + filesz) -- lastoffset = shdr_info[cnt].shdr.sh_offset + filesz; -+ /* Remember the last section written so far. */ -+ GElf_Off filesz = (shdr_info[cnt].shdr.sh_type != SHT_NOBITS -+ ? shdr_info[cnt].shdr.sh_size : 0); -+ if (lastoffset < shdr_info[cnt].shdr.sh_offset + filesz) -+ lastoffset = shdr_info[cnt].shdr.sh_offset + filesz; -+ } - } - -+ /* We might have to update the unallocated sections after we done the -+ allocated ones. lastoffset is set to right after the last allocated -+ section. */ -+ if (mixed_allocated_unallocated) -+ for (cnt = 1; cnt <= shdridx; ++cnt) -+ if (shdr_info[cnt].idx > 0) -+ { -+ scn = elf_getscn (newelf, shdr_info[cnt].idx); -+ if ((shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) == 0) -+ { -+ if (shdr_info[cnt].shdr.sh_offset == 0) -+ shdr_info[cnt].shdr.sh_offset -+ = ((lastoffset + shdr_info[cnt].shdr.sh_addralign - 1) -+ & ~((GElf_Off) (shdr_info[cnt].shdr.sh_addralign - 1))); -+ -+ /* Set the section header in the new file. */ -+ if (unlikely (gelf_update_shdr (scn, &shdr_info[cnt].shdr) == 0)) -+ /* There cannot be any overflows. */ -+ INTERNAL_ERROR (fname); -+ -+ /* Remember the last section written so far. */ -+ GElf_Off filesz = (shdr_info[cnt].shdr.sh_type != SHT_NOBITS -+ ? shdr_info[cnt].shdr.sh_size : 0); -+ if (lastoffset < shdr_info[cnt].shdr.sh_offset + filesz) -+ lastoffset = shdr_info[cnt].shdr.sh_offset + filesz; -+ } -+ } -+ - /* Adjust symbol references if symbol tables changed. */ - if (any_symtab_changes) - /* Find all relocation sections which use this symbol table. */ diff --git a/elfutils.spec b/elfutils.spec index 0891afc..64c8bd3 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.173 -%global baserelease 8 +Version: 0.174 +%global baserelease 1 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -21,9 +21,6 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches Patch1: elfutils-0.173-new-notes-hack.patch -Patch2: elfutils-0.173-elfcompress.patch -Patch3: elfutils-0.173-annobingroup.patch -Patch4: elfutils-0.173-strip-alloc-nonalloc.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -193,9 +190,6 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .notes_hack -%patch2 -p1 -b .elfcompress -%patch3 -p1 -b .annobingroup -%patch4 -p1 -b .strip-alloc-nonalloc # In case the above patches added any new test scripts, make sure they # are executable. @@ -328,6 +322,19 @@ fi %endif %changelog +* Fri Sep 14 2018 Mark Wielaard - 0.174-1 +- New upstream release + - libelf, libdw and all tools now handle extended shnum and shstrndx + correctly (#1608390). + - elfcompress: Don't rewrite input file if no section data needs + updating. Try harder to keep same file mode bits (suid) on rewrite. + - strip: Handle mixed (out of order) allocated/non-allocated sections. + - unstrip: Handle SHT_GROUP sections. + - backends: RISCV and M68K now have backend implementations to + generate CFI based backtraces. + - Fixes CVE-2018-16062, CVE-2018-16402 and CVE-2018-16403 + (#1623753, #1625051, #1625056). + * Tue Jul 31 2018 Florian Weimer - 0.173-8 - Rebuild with fixed binutils diff --git a/sources b/sources index b26c602..87eea34 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.173.tar.bz2) = 7f38e4ce2098b685f15030bf01f0a66a74aa32fbfcead0304c1d0e0a929b348a72f99e685cd4605465f4337393382112f64b8847e6c2f7cc1a57a4fd03d03eb3 +SHA512 (elfutils-0.174.tar.bz2) = 696708309c2a9a076099748809ecdc0490f4a8a842b2efc1aae0d746e7c5a8b203743f5626739eff837216b0c052696516b2821f5d3cc3f2eef86597c96d42df From c59734bbefbbc3c78d3da6dcb4f0d23f0cd62339 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 17 Oct 2018 16:25:57 +0200 Subject: [PATCH 074/216] Add elfutils-0.174-strip-unstrip-group.patch --- elfutils-0.174-strip-unstrip-group.patch | 189 +++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.174-strip-unstrip-group.patch diff --git a/elfutils-0.174-strip-unstrip-group.patch b/elfutils-0.174-strip-unstrip-group.patch new file mode 100644 index 0000000..9fcd25c --- /dev/null +++ b/elfutils-0.174-strip-unstrip-group.patch @@ -0,0 +1,189 @@ +commit c06ab0bbb4761a69d2f188675d21d1a9131e9ecb +Author: Mark Wielaard +Date: Sat Oct 13 10:27:47 2018 +0200 + + strip, unstrip: Handle SHT_GROUP correctly. + + The usage of annobin in Fedora showed a couple of bugs when using + eu-strip and eu-unstrip on ET_REL files that contain multiple group + sections. + + When stripping we should not remove the SHF_GROUP flag from sections + even if the group section itself might be removed. Either the section + itself gets removed, and so the flag doesn't matter. Or it gets moved + together with the group section into the debug file, and then it still + needs to have the flag set. Also we would "renumber" the section group + flag field (which isn't a section index, and so shouldn't be changed). + + Often the group sections have the exact same name (".group"), flags + (none) and sometimes the same sizes. Which makes matching them hard. + Extract the group signature and compare those when comparing two + group sections. + + Signed-off-by: Mark Wielaard + +diff --git a/src/strip.c b/src/strip.c +index 1f7b3ca..fdebc5e 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -792,9 +792,13 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + + if (shdr_info[shdr_info[cnt].group_idx].idx == 0) + { +- /* The section group section will be removed. */ ++ /* The section group section might be removed. ++ Don't remove the SHF_GROUP flag. The section is ++ either also removed, in which case the flag doesn't matter. ++ Or it moves with the group into the debug file, then ++ it will be reconnected with the new group and should ++ still have the flag set. */ + shdr_info[cnt].group_idx = 0; +- shdr_info[cnt].shdr.sh_flags &= ~SHF_GROUP; + } + } + +@@ -1368,7 +1372,9 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + && shdr_info[cnt].data->d_buf != NULL); + + Elf32_Word *grpref = (Elf32_Word *) shdr_info[cnt].data->d_buf; +- for (size_t inner = 0; ++ /* First word is the section group flag. ++ Followed by section indexes, that need to be renumbered. */ ++ for (size_t inner = 1; + inner < shdr_info[cnt].data->d_size / sizeof (Elf32_Word); + ++inner) + if (grpref[inner] < shnum) +diff --git a/src/unstrip.c b/src/unstrip.c +index e6f0947..03a0346 100644 +--- a/src/unstrip.c ++++ b/src/unstrip.c +@@ -696,6 +696,7 @@ struct section + { + Elf_Scn *scn; + const char *name; ++ const char *sig; + Elf_Scn *outscn; + Dwelf_Strent *strent; + GElf_Shdr shdr; +@@ -720,7 +721,8 @@ compare_alloc_sections (const struct section *s1, const struct section *s2, + + static int + compare_unalloc_sections (const GElf_Shdr *shdr1, const GElf_Shdr *shdr2, +- const char *name1, const char *name2) ++ const char *name1, const char *name2, ++ const char *sig1, const char *sig2) + { + /* Sort by sh_flags as an arbitrary ordering. */ + if (shdr1->sh_flags < shdr2->sh_flags) +@@ -734,6 +736,10 @@ compare_unalloc_sections (const GElf_Shdr *shdr1, const GElf_Shdr *shdr2, + if (shdr1->sh_size > shdr2->sh_size) + return 1; + ++ /* Are they both SHT_GROUP sections? Then compare signatures. */ ++ if (sig1 != NULL && sig2 != NULL) ++ return strcmp (sig1, sig2); ++ + /* Sort by name as last resort. */ + return strcmp (name1, name2); + } +@@ -751,7 +757,8 @@ compare_sections (const void *a, const void *b, bool rel) + return ((s1->shdr.sh_flags & SHF_ALLOC) + ? compare_alloc_sections (s1, s2, rel) + : compare_unalloc_sections (&s1->shdr, &s2->shdr, +- s1->name, s2->name)); ++ s1->name, s2->name, ++ s1->sig, s2->sig)); + } + + static int +@@ -986,6 +993,44 @@ get_section_name (size_t ndx, const GElf_Shdr *shdr, const Elf_Data *shstrtab) + return shstrtab->d_buf + shdr->sh_name; + } + ++/* Returns the signature of a group section, or NULL if the given ++ section isn't a group. */ ++static const char * ++get_group_sig (Elf *elf, GElf_Shdr *shdr) ++{ ++ if (shdr->sh_type != SHT_GROUP) ++ return NULL; ++ ++ Elf_Scn *symscn = elf_getscn (elf, shdr->sh_link); ++ if (symscn == NULL) ++ error (EXIT_FAILURE, 0, _("bad sh_link for group section: %s"), ++ elf_errmsg (-1)); ++ ++ GElf_Shdr symshdr_mem; ++ GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem); ++ if (symshdr == NULL) ++ error (EXIT_FAILURE, 0, _("couldn't get shdr for group section: %s"), ++ elf_errmsg (-1)); ++ ++ Elf_Data *symdata = elf_getdata (symscn, NULL); ++ if (symdata == NULL) ++ error (EXIT_FAILURE, 0, _("bad data for group symbol section: %s"), ++ elf_errmsg (-1)); ++ ++ GElf_Sym sym_mem; ++ GElf_Sym *sym = gelf_getsym (symdata, shdr->sh_info, &sym_mem); ++ if (sym == NULL) ++ error (EXIT_FAILURE, 0, _("couldn't get symbol for group section: %s"), ++ elf_errmsg (-1)); ++ ++ const char *sig = elf_strptr (elf, symshdr->sh_link, sym->st_name); ++ if (sig == NULL) ++ error (EXIT_FAILURE, 0, _("bad symbol name for group section: %s"), ++ elf_errmsg (-1)); ++ ++ return sig; ++} ++ + /* Fix things up when prelink has moved some allocated sections around + and the debuginfo file's section headers no longer match up. + This fills in SECTIONS[0..NALLOC-1].outscn or exits. +@@ -1111,6 +1156,7 @@ find_alloc_sections_prelink (Elf *debug, Elf_Data *debug_shstrtab, + sec->scn = elf_getscn (main, i + 1); /* Really just for ndx. */ + sec->outscn = NULL; + sec->strent = NULL; ++ sec->sig = get_group_sig (main, &sec->shdr); + ++undo_nalloc; + } + } +@@ -1336,6 +1382,7 @@ more sections in stripped file than debug file -- arguments reversed?")); + sections[i].scn = scn; + sections[i].outscn = NULL; + sections[i].strent = NULL; ++ sections[i].sig = get_group_sig (stripped, shdr); + } + + const struct section *stripped_symtab = NULL; +@@ -1354,7 +1401,8 @@ more sections in stripped file than debug file -- arguments reversed?")); + + /* Locate a matching unallocated section in SECTIONS. */ + inline struct section *find_unalloc_section (const GElf_Shdr *shdr, +- const char *name) ++ const char *name, ++ const char *sig) + { + size_t l = nalloc, u = stripped_shnum - 1; + while (l < u) +@@ -1362,7 +1410,8 @@ more sections in stripped file than debug file -- arguments reversed?")); + size_t i = (l + u) / 2; + struct section *sec = §ions[i]; + int cmp = compare_unalloc_sections (shdr, &sec->shdr, +- name, sec->name); ++ name, sec->name, ++ sig, sec->sig); + if (cmp < 0) + u = i; + else if (cmp > 0) +@@ -1435,7 +1484,8 @@ more sections in stripped file than debug file -- arguments reversed?")); + else + { + /* Look for the section that matches. */ +- sec = find_unalloc_section (shdr, name); ++ sec = find_unalloc_section (shdr, name, ++ get_group_sig (unstripped, shdr)); + if (sec == NULL) + { + /* An additional unallocated section is fine if not SHT_NOBITS. diff --git a/elfutils.spec b/elfutils.spec index 64c8bd3..f31fe7d 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.174 -%global baserelease 1 +%global baserelease 2 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -21,6 +21,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches Patch1: elfutils-0.173-new-notes-hack.patch +Patch2: elfutils-0.174-strip-unstrip-group.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -190,6 +191,7 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .notes_hack +%patch2 -p1 -b .strip_unstrip_group # In case the above patches added any new test scripts, make sure they # are executable. @@ -322,6 +324,9 @@ fi %endif %changelog +* Wed Oct 17 2018 Mark Wielaard - 0.174-2 +- Add elfutils-0.174-strip-unstrip-group.patch. + * Fri Sep 14 2018 Mark Wielaard - 0.174-1 - New upstream release - libelf, libdw and all tools now handle extended shnum and shstrndx From 7522b5a5b69b0c8ea30521ccff8665b1e38965cb Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 19 Oct 2018 22:58:41 +0200 Subject: [PATCH 075/216] Update elfutils-0.174-strip-unstrip-group.patch --- elfutils-0.174-strip-unstrip-group.patch | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/elfutils-0.174-strip-unstrip-group.patch b/elfutils-0.174-strip-unstrip-group.patch index 9fcd25c..2fd9919 100644 --- a/elfutils-0.174-strip-unstrip-group.patch +++ b/elfutils-0.174-strip-unstrip-group.patch @@ -187,3 +187,40 @@ index e6f0947..03a0346 100644 if (sec == NULL) { /* An additional unallocated section is fine if not SHT_NOBITS. + +commit eee4269e53154daaf0251371aacd91ec5db3eb30 +Author: Mark Wielaard +Date: Sat Oct 13 10:27:47 2018 +0200 + + unstrip: Renumber the group section indexes. + + When unstripping we might need to renumber the group section indexes. + Just like we do when stripping. + + Signed-off-by: Mark Wielaard + +diff --git a/src/unstrip.c b/src/unstrip.c +index 03a0346..2cfd3b3 100644 +--- a/src/unstrip.c ++++ b/src/unstrip.c +@@ -1708,6 +1708,20 @@ more sections in stripped file than debug file -- arguments reversed?")); + if (shdr_mem.sh_type == SHT_DYNSYM) + stripped_dynsym = sec; + } ++ ++ if (shdr_mem.sh_type == SHT_GROUP) ++ { ++ /* We must adjust all the section indices in the group. ++ Skip the first word, which is the section group flag. ++ Everything else is a section index. */ ++ Elf32_Word *shndx = (Elf32_Word *) outdata->d_buf; ++ for (size_t i = 1; i < shdr_mem.sh_size / sizeof (Elf32_Word); ++i) ++ if (shndx[i] == SHN_UNDEF || shndx[i] >= stripped_shnum) ++ error (EXIT_FAILURE, 0, ++ _("group has invalid section index [%zd]"), i); ++ else ++ shndx[i] = ndx_section[shndx[i] - 1]; ++ } + } + + /* We may need to update the symbol table. */ From cdc732d65794c465513816efadefa46a34cd295b Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 2 Nov 2018 20:57:30 +0100 Subject: [PATCH 076/216] Add elfutils-0.174-libdwfl-sanity-check-core-reads.patch CVE-2018-18310 (#1642605) --- ....174-libdwfl-sanity-check-core-reads.patch | 51 +++++++++++++++++++ elfutils.spec | 8 ++- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.174-libdwfl-sanity-check-core-reads.patch diff --git a/elfutils-0.174-libdwfl-sanity-check-core-reads.patch b/elfutils-0.174-libdwfl-sanity-check-core-reads.patch new file mode 100644 index 0000000..19dda87 --- /dev/null +++ b/elfutils-0.174-libdwfl-sanity-check-core-reads.patch @@ -0,0 +1,51 @@ +commit 20f9de9b5f704cec55df92406a50bcbcfca96acd +Author: Mark Wielaard +Date: Sun Oct 14 16:45:48 2018 +0200 + + libdwfl: Sanity check partial core file data reads. + + There were two issues when reading note data from a core file. + We didn't check if the data we already had in a buffer was big + enough. And if we did get the data, we should check if we got + everything, or just a part of the data. + + https://sourceware.org/bugzilla/show_bug.cgi?id=23752 + + Signed-off-by: Mark Wielaard + +diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c +index 36e5c82..8749884 100644 +--- a/libdwfl/dwfl_segment_report_module.c ++++ b/libdwfl/dwfl_segment_report_module.c +@@ -1,5 +1,5 @@ + /* Sniff out modules from ELF headers visible in memory segments. +- Copyright (C) 2008-2012, 2014, 2015 Red Hat, Inc. ++ Copyright (C) 2008-2012, 2014, 2015, 2018 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -301,7 +301,10 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, + inline bool read_portion (void **data, size_t *data_size, + GElf_Addr vaddr, size_t filesz) + { +- if (vaddr - start + filesz > buffer_available ++ /* Check whether we will have to read the segment data, or if it ++ can be returned from the existing buffer. */ ++ if (filesz > buffer_available ++ || vaddr - start > buffer_available - filesz + /* If we're in string mode, then don't consider the buffer we have + sufficient unless it contains the terminator of the string. */ + || (filesz == 0 && memchr (vaddr - start + buffer, '\0', +@@ -459,6 +462,12 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, + if (read_portion (&data, &data_size, vaddr, filesz)) + return; + ++ /* data_size will be zero if we got everything from the initial ++ buffer, otherwise it will be the size of the new buffer that ++ could be read. */ ++ if (data_size != 0) ++ filesz = data_size; ++ + assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr)); + + void *notes; diff --git a/elfutils.spec b/elfutils.spec index f31fe7d..c0dbcbe 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.174 -%global baserelease 2 +%global baserelease 3 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -22,6 +22,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches Patch1: elfutils-0.173-new-notes-hack.patch Patch2: elfutils-0.174-strip-unstrip-group.patch +Patch3: elfutils-0.174-libdwfl-sanity-check-core-reads.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -192,6 +193,7 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .notes_hack %patch2 -p1 -b .strip_unstrip_group +%patch3 -p1 -b .sanity_check_core_reads # In case the above patches added any new test scripts, make sure they # are executable. @@ -324,6 +326,10 @@ fi %endif %changelog +* Fri Nov 2 2018 Mark Wielaard - 0.174-3 +- Add elfutils-0.174-libdwfl-sanity-check-core-reads.patch + CVE-2018-18310 (#1642605) + * Wed Oct 17 2018 Mark Wielaard - 0.174-2 - Add elfutils-0.174-strip-unstrip-group.patch. From 33c93c324195da974d1a70819674cfcf990aaaab Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 6 Nov 2018 16:46:09 +0100 Subject: [PATCH 077/216] Add elfutils-0.174-size-rec-ar.patch CVE-2018-18520 (#1646478) --- elfutils-0.174-size-rec-ar.patch | 31 +++++++++++++++++++++++++++++++ elfutils.spec | 6 ++++++ 2 files changed, 37 insertions(+) create mode 100644 elfutils-0.174-size-rec-ar.patch diff --git a/elfutils-0.174-size-rec-ar.patch b/elfutils-0.174-size-rec-ar.patch new file mode 100644 index 0000000..091fa49 --- /dev/null +++ b/elfutils-0.174-size-rec-ar.patch @@ -0,0 +1,31 @@ +commit 22d2d082d57a7470fadc0eae67179553f4919209 +Author: Mark Wielaard +Date: Thu Oct 18 23:15:48 2018 +0200 + + size: Handle recursive ELF ar files. + + eu-size didn't handle an ELF ar file that contained an ar file itself + correctly. handle_ar would recursively call itself but close the ELF + file before returning. Only close the ELF file at the top-level. + + https://sourceware.org/bugzilla/show_bug.cgi?id=23787 + + Signed-off-by: Mark Wielaard + +diff --git a/src/size.c b/src/size.c +index 5ff3f2a..f01fd88 100644 +--- a/src/size.c ++++ b/src/size.c +@@ -374,8 +374,10 @@ handle_ar (int fd, Elf *elf, const char *prefix, const char *fname) + INTERNAL_ERROR (fname); + } + +- if (unlikely (elf_end (elf) != 0)) +- INTERNAL_ERROR (fname); ++ /* Only close ELF handle if this was a "top level" ar file. */ ++ if (prefix == NULL) ++ if (unlikely (elf_end (elf) != 0)) ++ INTERNAL_ERROR (fname); + + return result; + } diff --git a/elfutils.spec b/elfutils.spec index c0dbcbe..d68ab78 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -23,6 +23,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: elfutils-0.173-new-notes-hack.patch Patch2: elfutils-0.174-strip-unstrip-group.patch Patch3: elfutils-0.174-libdwfl-sanity-check-core-reads.patch +Patch4: elfutils-0.174-size-rec-ar.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -194,6 +195,7 @@ profiling) of processes. %patch1 -p1 -b .notes_hack %patch2 -p1 -b .strip_unstrip_group %patch3 -p1 -b .sanity_check_core_reads +%patch4 -p1 -b .size_rec_ar # In case the above patches added any new test scripts, make sure they # are executable. @@ -326,6 +328,10 @@ fi %endif %changelog +* Tue Nov 6 2018 Mark Wielaard +- Add elfutils-0.174-size-rec-ar.patch + CVE-2018-18520 (#1646478) + * Fri Nov 2 2018 Mark Wielaard - 0.174-3 - Add elfutils-0.174-libdwfl-sanity-check-core-reads.patch CVE-2018-18310 (#1642605) From c983249916f6e6893d96eddf5339cf43faa1282a Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 6 Nov 2018 16:51:54 +0100 Subject: [PATCH 078/216] 0.174-4 - Add elfutils-0.174-ar-sh_entsize-zero.patch CVE-2018-18521 (#1646483) --- elfutils-0.174-ar-sh_entsize-zero.patch | 27 +++++++++++++++++++++++++ elfutils.spec | 8 ++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.174-ar-sh_entsize-zero.patch diff --git a/elfutils-0.174-ar-sh_entsize-zero.patch b/elfutils-0.174-ar-sh_entsize-zero.patch new file mode 100644 index 0000000..0040033 --- /dev/null +++ b/elfutils-0.174-ar-sh_entsize-zero.patch @@ -0,0 +1,27 @@ +commit 2b16a9be69939822dcafe075413468daac98b327 +Author: Mark Wielaard +Date: Thu Oct 18 19:01:52 2018 +0200 + + arlib: Check that sh_entsize isn't zero. + + A bogus ELF file could have sh_entsize as zero. Don't divide by zero, + but just assume there are no symbols in the section. + + https://sourceware.org/bugzilla/show_bug.cgi?id=23786 + + Signed-off-by: Mark Wielaard + +diff --git a/src/arlib.c b/src/arlib.c +index 778e087..a6521e3 100644 +--- a/src/arlib.c ++++ b/src/arlib.c +@@ -252,6 +252,9 @@ arlib_add_symbols (Elf *elf, const char *arfname, const char *membername, + if (data == NULL) + continue; + ++ if (shdr->sh_entsize == 0) ++ continue; ++ + int nsyms = shdr->sh_size / shdr->sh_entsize; + for (int ndx = shdr->sh_info; ndx < nsyms; ++ndx) + { diff --git a/elfutils.spec b/elfutils.spec index d68ab78..f2a1821 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.174 -%global baserelease 3 +%global baserelease 4 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -24,6 +24,7 @@ Patch1: elfutils-0.173-new-notes-hack.patch Patch2: elfutils-0.174-strip-unstrip-group.patch Patch3: elfutils-0.174-libdwfl-sanity-check-core-reads.patch Patch4: elfutils-0.174-size-rec-ar.patch +Patch5: elfutils-0.174-ar-sh_entsize-zero.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -196,6 +197,7 @@ profiling) of processes. %patch2 -p1 -b .strip_unstrip_group %patch3 -p1 -b .sanity_check_core_reads %patch4 -p1 -b .size_rec_ar +%patch5 -p1 -b .ar_sh_entsize_zero # In case the above patches added any new test scripts, make sure they # are executable. @@ -328,9 +330,11 @@ fi %endif %changelog -* Tue Nov 6 2018 Mark Wielaard +* Tue Nov 6 2018 Mark Wielaard - 0.174-4 - Add elfutils-0.174-size-rec-ar.patch CVE-2018-18520 (#1646478) +- Add elfutils-0.174-ar-sh_entsize-zero.patch + CVE-2018-18521 (#1646483) * Fri Nov 2 2018 Mark Wielaard - 0.174-3 - Add elfutils-0.174-libdwfl-sanity-check-core-reads.patch From 77d585d9e41ef15d39600ad17b5f25664eb2fe1f Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 15 Nov 2018 00:03:22 +0100 Subject: [PATCH 079/216] Add elfutils-0.174-x86_64_unwind.patch. --- elfutils-0.174-x86_64_unwind.patch | 127 +++++++++++++++++++++++++++++ elfutils.spec | 5 ++ 2 files changed, 132 insertions(+) create mode 100644 elfutils-0.174-x86_64_unwind.patch diff --git a/elfutils-0.174-x86_64_unwind.patch b/elfutils-0.174-x86_64_unwind.patch new file mode 100644 index 0000000..b766517 --- /dev/null +++ b/elfutils-0.174-x86_64_unwind.patch @@ -0,0 +1,127 @@ +commit 825e48c4e942e3cbdab1b75c04b8c014867d66ab +Author: Milian Wolff +Date: Mon Oct 29 16:21:26 2018 +0100 + + Also find CFI in sections of type SHT_X86_64_UNWIND + + On my system with g++ (GCC) 8.2.1 20180831 with GNU gold (GNU Binutils + 2.31.1) 1.16, the .eh_frame section does not have type PROGBITS + but rather is using X86_64_UNWIND nowadays: + + ``` + $ echo "int main(){ return 0; }" > test.c + $ gcc test.c + $ readelf --sections a.out | grep .eh_frame + [14] .eh_frame X86_64_UNWIND 0000000000000670 00000670 + [15] .eh_frame_hdr X86_64_UNWIND 0000000000000724 00000724 + ``` + + Without this patch, libdw refuses to use the available unwind + information, leading to broken backtraces while unwinding. With the + patch applied, unwinding works once more in such situations. + + Signed-off-by: Milian Wolff + Signed-off-by: Mark Wielaard + Tested-by: Milian Wolff + +diff --git a/libdw/dwarf_getcfi_elf.c b/libdw/dwarf_getcfi_elf.c +index 315cc02..adcaea0 100644 +--- a/libdw/dwarf_getcfi_elf.c ++++ b/libdw/dwarf_getcfi_elf.c +@@ -298,7 +298,7 @@ getcfi_shdr (Elf *elf, const GElf_Ehdr *ehdr) + } + else if (!strcmp (name, ".eh_frame")) + { +- if (shdr->sh_type == SHT_PROGBITS) ++ if (shdr->sh_type != SHT_NOBITS) + return getcfi_scn_eh_frame (elf, ehdr, scn, shdr, + hdr_scn, hdr_vaddr); + else + +commit 4b0342b85b5b1a3d3636e06e3b5320954828dfb1 +Author: Mark Wielaard +Date: Tue Nov 6 12:01:25 2018 +0100 + + backends: Add x86_64 section_type_name for SHT_X86_64_UNWIND. + + Makes sure that eu-readelf and eu-elflint recognize and show the + x86_64 specific section type correctly. + + Signed-off-by: Mark Wielaard + Tested-by: Milian Wolff + +diff --git a/backends/x86_64_init.c b/backends/x86_64_init.c +index adfa479..49f6c6c 100644 +--- a/backends/x86_64_init.c ++++ b/backends/x86_64_init.c +@@ -1,5 +1,5 @@ + /* Initialization of x86-64 specific backend library. +- Copyright (C) 2002-2009, 2013 Red Hat, Inc. ++ Copyright (C) 2002-2009, 2013, 2018 Red Hat, Inc. + Copyright (C) H.J. Lu , 2015. + This file is part of elfutils. + Written by Ulrich Drepper , 2002. +@@ -55,6 +55,7 @@ x86_64_init (Elf *elf __attribute__ ((unused)), + eh->name = "AMD x86-64"; + x86_64_init_reloc (eh); + HOOK (eh, reloc_simple_type); ++ HOOK (eh, section_type_name); + if (eh->class == ELFCLASS32) + eh->core_note = x32_core_note; + else +diff --git a/backends/x86_64_symbol.c b/backends/x86_64_symbol.c +index e07b180..98457bc 100644 +--- a/backends/x86_64_symbol.c ++++ b/backends/x86_64_symbol.c +@@ -1,5 +1,5 @@ + /* x86_64 specific symbolic name handling. +- Copyright (C) 2002, 2005 Red Hat, Inc. ++ Copyright (C) 2002, 2005, 2018 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 2002. + +@@ -59,3 +59,15 @@ x86_64_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type, + return ELF_T_NUM; + } + } ++ ++/* Return symbolic representation of section type. */ ++const char * ++x86_64_section_type_name (int type, ++ char *buf __attribute__ ((unused)), ++ size_t len __attribute__ ((unused))) ++{ ++ if (type == SHT_X86_64_UNWIND) ++ return "X86_64_UNWIND"; ++ ++ return NULL; ++} + +commit 22ec8efc1dd87cdc7892523457eb55990b967224 +Author: Mark Wielaard +Date: Sat Nov 10 23:33:03 2018 +0100 + + elflint: Allow PT_GNU_EH_FRAME segment to match SHT_X86_64_UNWIND section. + + The gold linker might generate an .eh_frame_hdr with a SHT_X86_64_UNWIND + type instead of a SHT_PROGBITS type. + + Signed-off-by: Mark Wielaard + +diff --git a/src/elflint.c b/src/elflint.c +index 184ca12..810c8bd 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -4633,8 +4633,10 @@ program header offset in ELF header and PHDR entry do not match")); + any = true; + shdr = gelf_getshdr (scn, &shdr_mem); + if (shdr != NULL +- && shdr->sh_type == (is_debuginfo +- ? SHT_NOBITS : SHT_PROGBITS) ++ && ((is_debuginfo && shdr->sh_type == SHT_NOBITS) ++ || (! is_debuginfo ++ && (shdr->sh_type == SHT_PROGBITS ++ || shdr->sh_type == SHT_X86_64_UNWIND))) + && elf_strptr (ebl->elf, shstrndx, shdr->sh_name) != NULL + && ! strcmp (".eh_frame_hdr", + elf_strptr (ebl->elf, shstrndx, shdr->sh_name))) diff --git a/elfutils.spec b/elfutils.spec index f2a1821..cb08fd1 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -25,6 +25,7 @@ Patch2: elfutils-0.174-strip-unstrip-group.patch Patch3: elfutils-0.174-libdwfl-sanity-check-core-reads.patch Patch4: elfutils-0.174-size-rec-ar.patch Patch5: elfutils-0.174-ar-sh_entsize-zero.patch +Patch6: elfutils-0.174-x86_64_unwind.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -198,6 +199,7 @@ profiling) of processes. %patch3 -p1 -b .sanity_check_core_reads %patch4 -p1 -b .size_rec_ar %patch5 -p1 -b .ar_sh_entsize_zero +%patch6 -p1 -b .x86_64_unwind # In case the above patches added any new test scripts, make sure they # are executable. @@ -330,6 +332,9 @@ fi %endif %changelog +* Wed Nov 14 2018 Mark Wielaard +- Add elfutils-0.174-x86_64_unwind.patch. + * Tue Nov 6 2018 Mark Wielaard - 0.174-4 - Add elfutils-0.174-size-rec-ar.patch CVE-2018-18520 (#1646478) From fd33ee5a7a50ec781aac09d258189e413f918b94 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 15 Nov 2018 00:38:15 +0100 Subject: [PATCH 080/216] Add elfutils-0.174-gnu-property-note.patch. --- elfutils-0.173-new-notes-hack.patch | 16 - elfutils-0.174-gnu-property-note.patch | 820 +++++++++++++++++++++++++ elfutils.spec | 3 + 3 files changed, 823 insertions(+), 16 deletions(-) create mode 100644 elfutils-0.174-gnu-property-note.patch diff --git a/elfutils-0.173-new-notes-hack.patch b/elfutils-0.173-new-notes-hack.patch index b47c211..8e607fa 100644 --- a/elfutils-0.173-new-notes-hack.patch +++ b/elfutils-0.173-new-notes-hack.patch @@ -15,19 +15,3 @@ index eec799b2..31092f2e 100644 if (shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS) { GElf_Xword sh_flags = shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS; -@@ -4324,10 +4325,15 @@ section [%2d] '%s': unknown core file note type %" PRIu32 - else - switch (nhdr.n_type) - { -+#define NT_GNU_BUILD_ATTRIBUTE_OPEN 0x100 -+#define NT_GNU_BUILD_ATTRIBUTE_FUNC 0x101 - case NT_GNU_ABI_TAG: - case NT_GNU_HWCAP: - case NT_GNU_BUILD_ID: - case NT_GNU_GOLD_VERSION: -+ case NT_GNU_PROPERTY_TYPE_0: -+ case NT_GNU_BUILD_ATTRIBUTE_OPEN: -+ case NT_GNU_BUILD_ATTRIBUTE_FUNC: - break; - - case 0: diff --git a/elfutils-0.174-gnu-property-note.patch b/elfutils-0.174-gnu-property-note.patch new file mode 100644 index 0000000..e511ed0 --- /dev/null +++ b/elfutils-0.174-gnu-property-note.patch @@ -0,0 +1,820 @@ +commit 5199e15870e05e5b0b9f98c20fc9b5427aa6dd6a +Author: Mark Wielaard +Date: Mon Oct 15 23:35:47 2018 +0200 + + Recognize and parse GNU Property notes. + + GNU Property notes are different from normal notes because they use + variable alignment/padding of their fields. They are 8 byte aligned, + but use 4 byte fields. The name is aligned at 4 bytes and padded so + that, the desc is aligned at 8 bytes. The whole note is padded to + 8 bytes again. For normal notes all fields are both 4 bytes wide and + 4 bytes aligned. + + To recognize these new kind of ELF Notes a new Elf_Type is introduced, + ELF_T_NHDR8. This type is used in the xlate functions to determine + how to align and pad the various fields. Since the fields themselves + can now have different alignments we will have to keep track of the + current alignement and use either NOTE_ALIGN4 or NOTE_ALIGN8 to + determine the padding. + + To set the correct Elf_Type on the Elf_Data we use either the section + sh_addralign or the segment p_align values. Assuming 8 means the + section or segment contains the new style notes, otherwise normal + notes. + + When we cannot determine the "alignment" directly, like when parsing + special kernel sys files, we check the name "GNU" and type + "GNU_PROPERTY_TYPE_0" fields. + + ebl_object_note now parses the new NT_GNU_PROPERTY_TYPE_0 and can + extract the GNU_PROPERTY_STACK_SIZE, GNU_PROPERTY_NO_COPY_ON_PROTECTED + and GNU_PROPERTY_X86_FEATURE_1_AND types GNU_PROPERTY_X86_FEATURE_1_IBT + and GNU_PROPERTY_X86_FEATURE_1_SHSTK. + + Tests are added for extracting the note from sections or segments + as set by gcc -fcf-protection. + + Signed-off-by: Mark Wielaard + +diff --git a/libdwelf/dwelf_elf_gnu_build_id.c b/libdwelf/dwelf_elf_gnu_build_id.c +index 8c78c70..dbcfc82 100644 +--- a/libdwelf/dwelf_elf_gnu_build_id.c ++++ b/libdwelf/dwelf_elf_gnu_build_id.c +@@ -88,7 +88,9 @@ find_elf_build_id (Dwfl_Module *mod, int e_type, Elf *elf, + result = check_notes (elf_getdata_rawchunk (elf, + phdr->p_offset, + phdr->p_filesz, +- ELF_T_NHDR), ++ (phdr->p_align == 8 ++ ? ELF_T_NHDR8 ++ : ELF_T_NHDR)), + phdr->p_vaddr, + build_id_bits, + build_id_elfaddr, +diff --git a/libdwfl/core-file.c b/libdwfl/core-file.c +index 84cb89a..01109f4 100644 +--- a/libdwfl/core-file.c ++++ b/libdwfl/core-file.c +@@ -496,7 +496,9 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable) + Elf_Data *notes = elf_getdata_rawchunk (elf, + notes_phdr.p_offset, + notes_phdr.p_filesz, +- ELF_T_NHDR); ++ (notes_phdr.p_align == 8 ++ ? ELF_T_NHDR8 ++ : ELF_T_NHDR)); + if (likely (notes != NULL)) + { + size_t pos = 0; +diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c +index 8749884..0d633ff 100644 +--- a/libdwfl/dwfl_segment_report_module.c ++++ b/libdwfl/dwfl_segment_report_module.c +@@ -27,7 +27,7 @@ + not, see . */ + + #include +-#include "../libelf/libelfP.h" /* For NOTE_ALIGN. */ ++#include "../libelf/libelfP.h" /* For NOTE_ALIGN4 and NOTE_ALIGN8. */ + #undef _ + #include "libdwflP.h" + #include "common.h" +@@ -451,7 +451,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, + GElf_Addr build_id_vaddr = 0; + + /* Consider a PT_NOTE we've found in the image. */ +- inline void consider_notes (GElf_Addr vaddr, GElf_Xword filesz) ++ inline void consider_notes (GElf_Addr vaddr, GElf_Xword filesz, ++ GElf_Xword align) + { + /* If we have already seen a build ID, we don't care any more. */ + if (build_id != NULL || filesz == 0) +@@ -478,7 +479,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, + notes = malloc (filesz); + if (unlikely (notes == NULL)) + return; +- xlatefrom.d_type = xlateto.d_type = ELF_T_NHDR; ++ xlatefrom.d_type = xlateto.d_type = (align == 8 ++ ? ELF_T_NHDR8 : ELF_T_NHDR); + xlatefrom.d_buf = (void *) data; + xlatefrom.d_size = filesz; + xlateto.d_buf = notes; +@@ -489,15 +491,23 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, + } + + const GElf_Nhdr *nh = notes; +- while ((const void *) nh < (const void *) notes + filesz) +- { +- const void *note_name = nh + 1; +- const void *note_desc = note_name + NOTE_ALIGN (nh->n_namesz); +- if (unlikely ((size_t) ((const void *) notes + filesz +- - note_desc) < nh->n_descsz)) ++ size_t len = 0; ++ while (filesz > len + sizeof (*nh)) ++ { ++ const void *note_name; ++ const void *note_desc; ++ ++ len += sizeof (*nh); ++ note_name = notes + len; ++ ++ len += nh->n_namesz; ++ len = align == 8 ? NOTE_ALIGN8 (len) : NOTE_ALIGN4 (len); ++ note_desc = notes + len; ++ ++ if (unlikely (filesz < len + nh->n_descsz)) + break; + +- if (nh->n_type == NT_GNU_BUILD_ID ++ if (nh->n_type == NT_GNU_BUILD_ID + && nh->n_descsz > 0 + && nh->n_namesz == sizeof "GNU" + && !memcmp (note_name, "GNU", sizeof "GNU")) +@@ -510,7 +520,9 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, + break; + } + +- nh = note_desc + NOTE_ALIGN (nh->n_descsz); ++ len += nh->n_descsz; ++ len = align == 8 ? NOTE_ALIGN8 (len) : NOTE_ALIGN4 (len); ++ nh = (void *) notes + len; + } + + done: +@@ -535,7 +547,7 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, + case PT_NOTE: + /* We calculate from the p_offset of the note segment, + because we don't yet know the bias for its p_vaddr. */ +- consider_notes (start + offset, filesz); ++ consider_notes (start + offset, filesz, align); + break; + + case PT_LOAD: +diff --git a/libdwfl/linux-core-attach.c b/libdwfl/linux-core-attach.c +index 9f05f72..6c99b9e 100644 +--- a/libdwfl/linux-core-attach.c ++++ b/libdwfl/linux-core-attach.c +@@ -355,7 +355,9 @@ dwfl_core_file_attach (Dwfl *dwfl, Elf *core) + if (phdr != NULL && phdr->p_type == PT_NOTE) + { + note_data = elf_getdata_rawchunk (core, phdr->p_offset, +- phdr->p_filesz, ELF_T_NHDR); ++ phdr->p_filesz, (phdr->p_align == 8 ++ ? ELF_T_NHDR8 ++ : ELF_T_NHDR)); + break; + } + } +diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c +index 9d0fef2..360e4ee 100644 +--- a/libdwfl/linux-kernel-modules.c ++++ b/libdwfl/linux-kernel-modules.c +@@ -39,6 +39,7 @@ + #include + #include + ++#include "libelfP.h" + #include "libdwflP.h" + #include + #include +@@ -554,15 +555,41 @@ check_notes (Dwfl_Module *mod, const char *notesfile, + return 1; + + unsigned char *p = buf.data; ++ size_t len = 0; + while (p < &buf.data[n]) + { + /* No translation required since we are reading the native kernel. */ + GElf_Nhdr *nhdr = (void *) p; +- p += sizeof *nhdr; ++ len += sizeof *nhdr; ++ p += len; + unsigned char *name = p; +- p += (nhdr->n_namesz + 3) & -4U; +- unsigned char *bits = p; +- p += (nhdr->n_descsz + 3) & -4U; ++ unsigned char *bits; ++ /* This is somewhat ugly, GNU Property notes use different padding, ++ but all we have is the file content, so we have to actually check ++ the name and type. */ ++ if (nhdr->n_type == NT_GNU_PROPERTY_TYPE_0 ++ && nhdr->n_namesz == sizeof "GNU" ++ && name + nhdr->n_namesz < &buf.data[n] ++ && !memcmp (name, "GNU", sizeof "GNU")) ++ { ++ len += nhdr->n_namesz; ++ len = NOTE_ALIGN8 (len); ++ p = buf.data + len; ++ bits = p; ++ len += nhdr->n_descsz; ++ len = NOTE_ALIGN8 (len); ++ p = buf.data + len; ++ } ++ else ++ { ++ len += nhdr->n_namesz; ++ len = NOTE_ALIGN4 (len); ++ p = buf.data + len; ++ bits = p; ++ len += nhdr->n_descsz; ++ len = NOTE_ALIGN4 (len); ++ p = buf.data + len; ++ } + + if (p <= &buf.data[n] + && nhdr->n_type == NT_GNU_BUILD_ID +diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c +index ca4f155..57e9f52 100644 +--- a/libebl/eblobjnote.c ++++ b/libebl/eblobjnote.c +@@ -1,5 +1,5 @@ + /* Print contents of object file note. +- Copyright (C) 2002, 2007, 2009, 2011, 2015, 2016 Red Hat, Inc. ++ Copyright (C) 2002, 2007, 2009, 2011, 2015, 2016, 2018 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 2002. + +@@ -37,6 +37,8 @@ + #include + #include + ++#include "libelfP.h" ++ + + void + ebl_object_note (Ebl *ebl, const char *name, uint32_t type, +@@ -153,6 +155,187 @@ ebl_object_note (Ebl *ebl, const char *name, uint32_t type, + (int) descsz, desc); + break; + ++ case NT_GNU_PROPERTY_TYPE_0: ++ if (strcmp (name, "GNU") == 0 && descsz > 0) ++ { ++ /* There are at least 2 words. type and datasz. */ ++ while (descsz >= 8) ++ { ++ struct pr_prop ++ { ++ GElf_Word pr_type; ++ GElf_Word pr_datasz; ++ } prop; ++ ++ Elf_Data in = ++ { ++ .d_version = EV_CURRENT, ++ .d_type = ELF_T_WORD, ++ .d_size = 8, ++ .d_buf = (void *) desc ++ }; ++ Elf_Data out = ++ { ++ .d_version = EV_CURRENT, ++ .d_type = ELF_T_WORD, ++ .d_size = descsz, ++ .d_buf = (void *) &prop ++ }; ++ ++ if (gelf_xlatetom (ebl->elf, &out, &in, ++ elf_getident (ebl->elf, ++ NULL)[EI_DATA]) == NULL) ++ { ++ printf ("%s\n", elf_errmsg (-1)); ++ return; ++ } ++ ++ desc += 8; ++ descsz -= 8; ++ ++ int elfclass = gelf_getclass (ebl->elf); ++ char *elfident = elf_getident (ebl->elf, NULL); ++ GElf_Ehdr ehdr; ++ gelf_getehdr (ebl->elf, &ehdr); ++ ++ /* Prefix. */ ++ printf (" "); ++ if (prop.pr_type == GNU_PROPERTY_STACK_SIZE) ++ { ++ printf ("STACK_SIZE "); ++ if (prop.pr_datasz == 4 || prop.pr_datasz == 8) ++ { ++ GElf_Addr addr; ++ in.d_type = ELF_T_ADDR; ++ out.d_type = ELF_T_ADDR; ++ in.d_size = prop.pr_datasz; ++ out.d_size = sizeof (addr); ++ in.d_buf = (void *) desc; ++ out.d_buf = (void *) &addr; ++ ++ if (gelf_xlatetom (ebl->elf, &out, &in, ++ elfident[EI_DATA]) == NULL) ++ { ++ printf ("%s\n", elf_errmsg (-1)); ++ return; ++ } ++ printf ("%#" PRIx64 "\n", addr); ++ } ++ else ++ printf (" (garbage datasz: %" PRIx32 ")\n", ++ prop.pr_datasz); ++ } ++ else if (prop.pr_type == GNU_PROPERTY_NO_COPY_ON_PROTECTED) ++ { ++ printf ("NO_COPY_ON_PROTECTION"); ++ if (prop.pr_datasz == 0) ++ printf ("\n"); ++ else ++ printf (" (garbage datasz: %" PRIx32 ")\n", ++ prop.pr_datasz); ++ } ++ else if (prop.pr_type >= GNU_PROPERTY_LOPROC ++ && prop.pr_type <= GNU_PROPERTY_HIPROC ++ && (ehdr.e_machine == EM_386 ++ || ehdr.e_machine == EM_X86_64)) ++ { ++ printf ("X86 "); ++ if (prop.pr_type == GNU_PROPERTY_X86_FEATURE_1_AND) ++ { ++ printf ("FEATURE_1_AND: "); ++ ++ if (prop.pr_datasz == 4) ++ { ++ GElf_Word data; ++ in.d_type = ELF_T_WORD; ++ out.d_type = ELF_T_WORD; ++ in.d_size = 4; ++ out.d_size = 4; ++ in.d_buf = (void *) desc; ++ out.d_buf = (void *) &data; ++ ++ if (gelf_xlatetom (ebl->elf, &out, &in, ++ elfident[EI_DATA]) == NULL) ++ { ++ printf ("%s\n", elf_errmsg (-1)); ++ return; ++ } ++ printf ("%08" PRIx32 " ", data); ++ ++ if ((data & GNU_PROPERTY_X86_FEATURE_1_IBT) ++ != 0) ++ { ++ printf ("IBT"); ++ data &= ~GNU_PROPERTY_X86_FEATURE_1_IBT; ++ if (data != 0) ++ printf (" "); ++ } ++ ++ if ((data & GNU_PROPERTY_X86_FEATURE_1_SHSTK) ++ != 0) ++ { ++ printf ("SHSTK"); ++ data &= ~GNU_PROPERTY_X86_FEATURE_1_SHSTK; ++ if (data != 0) ++ printf (" "); ++ } ++ ++ if (data != 0) ++ printf ("UNKNOWN"); ++ } ++ else ++ printf ("", ++ prop.pr_datasz); ++ ++ printf ("\n"); ++ } ++ else ++ { ++ printf ("%#" PRIx32, prop.pr_type); ++ if (prop.pr_datasz > 0) ++ { ++ printf (" data: "); ++ size_t i; ++ for (i = 0; i < prop.pr_datasz - 1; i++) ++ printf ("%02" PRIx8 " ", (uint8_t) desc[i]); ++ printf ("%02" PRIx8 "\n", (uint8_t) desc[i]); ++ } ++ } ++ } ++ else ++ { ++ if (prop.pr_type >= GNU_PROPERTY_LOPROC ++ && prop.pr_type <= GNU_PROPERTY_HIPROC) ++ printf ("proc_type %#" PRIx32, prop.pr_type); ++ else if (prop.pr_type >= GNU_PROPERTY_LOUSER ++ && prop.pr_type <= GNU_PROPERTY_HIUSER) ++ printf ("app_type %#" PRIx32, prop.pr_type); ++ else ++ printf ("unknown_type %#" PRIx32, prop.pr_type); ++ ++ if (prop.pr_datasz > 0) ++ { ++ printf (" data: "); ++ size_t i; ++ for (i = 0; i < prop.pr_datasz - 1; i++) ++ printf ("%02" PRIx8 " ", (uint8_t) desc[i]); ++ printf ("%02" PRIx8 "\n", (uint8_t) desc[i]); ++ } ++ } ++ if (elfclass == ELFCLASS32) ++ { ++ desc += NOTE_ALIGN4 (prop.pr_datasz); ++ descsz -= NOTE_ALIGN4 (prop.pr_datasz); ++ } ++ else ++ { ++ desc += NOTE_ALIGN8 (prop.pr_datasz); ++ descsz -= NOTE_ALIGN8 (prop.pr_datasz); ++ } ++ } ++ } ++ break; ++ + case NT_GNU_ABI_TAG: + if (strcmp (name, "GNU") == 0 && descsz >= 8 && descsz % 4 == 0) + { +diff --git a/libebl/eblobjnotetypename.c b/libebl/eblobjnotetypename.c +index db040d2..af23cae 100644 +--- a/libebl/eblobjnotetypename.c ++++ b/libebl/eblobjnotetypename.c +@@ -91,6 +91,7 @@ ebl_object_note_type_name (Ebl *ebl, const char *name, uint32_t type, + KNOWNSTYPE (GNU_HWCAP), + KNOWNSTYPE (GNU_BUILD_ID), + KNOWNSTYPE (GNU_GOLD_VERSION), ++ KNOWNSTYPE (GNU_PROPERTY_TYPE_0), + }; + + /* Handle standard names. */ +diff --git a/libelf/elf32_xlatetom.c b/libelf/elf32_xlatetom.c +index 13cd485..3b94cac 100644 +--- a/libelf/elf32_xlatetom.c ++++ b/libelf/elf32_xlatetom.c +@@ -60,7 +60,7 @@ elfw2(LIBELFBITS, xlatetom) (Elf_Data *dest, const Elf_Data *src, + /* We shouldn't require integer number of records when processing + notes. Payload bytes follow the header immediately, it's not an + array of records as is the case otherwise. */ +- if (src->d_type != ELF_T_NHDR ++ if (src->d_type != ELF_T_NHDR && src->d_type != ELF_T_NHDR8 + && src->d_size % recsize != 0) + { + __libelf_seterrno (ELF_E_INVALID_DATA); +diff --git a/libelf/elf_compress.c b/libelf/elf_compress.c +index 711be59..fd412e8 100644 +--- a/libelf/elf_compress.c ++++ b/libelf/elf_compress.c +@@ -513,7 +513,8 @@ elf_compress (Elf_Scn *scn, int type, unsigned int flags) + + __libelf_reset_rawdata (scn, scn->zdata_base, + scn->zdata_size, scn->zdata_align, +- __libelf_data_type (elf, sh_type)); ++ __libelf_data_type (elf, sh_type, ++ scn->zdata_align)); + + return 1; + } +diff --git a/libelf/elf_compress_gnu.c b/libelf/elf_compress_gnu.c +index dfa7c57..198dc7d 100644 +--- a/libelf/elf_compress_gnu.c ++++ b/libelf/elf_compress_gnu.c +@@ -196,7 +196,7 @@ elf_compress_gnu (Elf_Scn *scn, int inflate, unsigned int flags) + } + + __libelf_reset_rawdata (scn, buf_out, size, sh_addralign, +- __libelf_data_type (elf, sh_type)); ++ __libelf_data_type (elf, sh_type, sh_addralign)); + + scn->zdata_base = buf_out; + +diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c +index 278dfa8..4f80aaf 100644 +--- a/libelf/elf_getdata.c ++++ b/libelf/elf_getdata.c +@@ -65,7 +65,7 @@ static const Elf_Type shtype_map[EV_NUM - 1][TYPEIDX (SHT_HISUNW) + 1] = + [SHT_PREINIT_ARRAY] = ELF_T_ADDR, + [SHT_GROUP] = ELF_T_WORD, + [SHT_SYMTAB_SHNDX] = ELF_T_WORD, +- [SHT_NOTE] = ELF_T_NHDR, ++ [SHT_NOTE] = ELF_T_NHDR, /* Need alignment to guess ELF_T_NHDR8. */ + [TYPEIDX (SHT_GNU_verdef)] = ELF_T_VDEF, + [TYPEIDX (SHT_GNU_verneed)] = ELF_T_VNEED, + [TYPEIDX (SHT_GNU_versym)] = ELF_T_HALF, +@@ -106,6 +106,7 @@ const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] + [ELF_T_GNUHASH] = __alignof__ (Elf32_Word), \ + [ELF_T_AUXV] = __alignof__ (ElfW2(Bits,auxv_t)), \ + [ELF_T_CHDR] = __alignof__ (ElfW2(Bits,Chdr)), \ ++ [ELF_T_NHDR8] = 8 /* Special case for GNU Property note. */ \ + } + [EV_CURRENT - 1] = + { +@@ -118,7 +119,7 @@ const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] + + Elf_Type + internal_function +-__libelf_data_type (Elf *elf, int sh_type) ++__libelf_data_type (Elf *elf, int sh_type, GElf_Xword align) + { + /* Some broken ELF ABI for 64-bit machines use the wrong hash table + entry size. See elf-knowledge.h for more information. */ +@@ -129,7 +130,13 @@ __libelf_data_type (Elf *elf, int sh_type) + return (SH_ENTSIZE_HASH (ehdr) == 4 ? ELF_T_WORD : ELF_T_XWORD); + } + else +- return shtype_map[LIBELF_EV_IDX][TYPEIDX (sh_type)]; ++ { ++ Elf_Type t = shtype_map[LIBELF_EV_IDX][TYPEIDX (sh_type)]; ++ /* Special case for GNU Property notes. */ ++ if (t == ELF_T_NHDR && align == 8) ++ t = ELF_T_NHDR8; ++ return t; ++ } + } + + /* Convert the data in the current section. */ +@@ -272,7 +279,9 @@ __libelf_set_rawdata_wrlock (Elf_Scn *scn) + else + { + Elf_Type t = shtype_map[LIBELF_EV_IDX][TYPEIDX (type)]; +- if (t == ELF_T_VDEF || t == ELF_T_NHDR ++ if (t == ELF_T_NHDR && align == 8) ++ t = ELF_T_NHDR8; ++ if (t == ELF_T_VDEF || t == ELF_T_NHDR || t == ELF_T_NHDR8 + || (t == ELF_T_GNUHASH && elf->class == ELFCLASS64)) + entsize = 1; + else +@@ -357,7 +366,7 @@ __libelf_set_rawdata_wrlock (Elf_Scn *scn) + if ((flags & SHF_COMPRESSED) != 0) + scn->rawdata.d.d_type = ELF_T_CHDR; + else +- scn->rawdata.d.d_type = __libelf_data_type (elf, type); ++ scn->rawdata.d.d_type = __libelf_data_type (elf, type, align); + scn->rawdata.d.d_off = 0; + + /* Make sure the alignment makes sense. d_align should be aligned both +diff --git a/libelf/gelf_fsize.c b/libelf/gelf_fsize.c +index 0c50926..d04ec5d 100644 +--- a/libelf/gelf_fsize.c ++++ b/libelf/gelf_fsize.c +@@ -64,6 +64,8 @@ const size_t __libelf_type_sizes[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] = + [ELF_T_VNEED] = sizeof (ElfW2(LIBELFBITS, Ext_Verneed)), \ + [ELF_T_VNAUX] = sizeof (ElfW2(LIBELFBITS, Ext_Vernaux)), \ + [ELF_T_NHDR] = sizeof (ElfW2(LIBELFBITS, Ext_Nhdr)), \ ++ /* Note the header size is the same, but padding is different. */ \ ++ [ELF_T_NHDR8] = sizeof (ElfW2(LIBELFBITS, Ext_Nhdr)), \ + [ELF_T_SYMINFO] = sizeof (ElfW2(LIBELFBITS, Ext_Syminfo)), \ + [ELF_T_MOVE] = sizeof (ElfW2(LIBELFBITS, Ext_Move)), \ + [ELF_T_LIB] = sizeof (ElfW2(LIBELFBITS, Ext_Lib)), \ +diff --git a/libelf/gelf_getnote.c b/libelf/gelf_getnote.c +index c75edda..6d33b35 100644 +--- a/libelf/gelf_getnote.c ++++ b/libelf/gelf_getnote.c +@@ -1,5 +1,5 @@ + /* Get note information at the supplied offset. +- Copyright (C) 2007, 2014, 2015 Red Hat, Inc. ++ Copyright (C) 2007, 2014, 2015, 2018 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -43,7 +43,7 @@ gelf_getnote (Elf_Data *data, size_t offset, GElf_Nhdr *result, + if (data == NULL) + return 0; + +- if (unlikely (data->d_type != ELF_T_NHDR)) ++ if (unlikely (data->d_type != ELF_T_NHDR && data->d_type != ELF_T_NHDR8)) + { + __libelf_seterrno (ELF_E_INVALID_HANDLE); + return 0; +@@ -69,27 +69,42 @@ gelf_getnote (Elf_Data *data, size_t offset, GElf_Nhdr *result, + const GElf_Nhdr *n = data->d_buf + offset; + offset += sizeof *n; + +- /* Include padding. Check below for overflow. */ +- GElf_Word namesz = NOTE_ALIGN (n->n_namesz); +- GElf_Word descsz = NOTE_ALIGN (n->n_descsz); +- +- if (unlikely (offset > data->d_size +- || data->d_size - offset < namesz +- || (namesz == 0 && n->n_namesz != 0))) ++ if (offset > data->d_size) + offset = 0; + else + { ++ /* This is slightly tricky, offset is guaranteed to be 4 ++ byte aligned, which is what we need for the name_offset. ++ And normally desc_offset is also 4 byte aligned, but not ++ for GNU Property notes, then it should be 8. So align ++ the offset, after adding the namesz, and include padding ++ in descsz to get to the end. */ + *name_offset = offset; +- offset += namesz; +- if (unlikely (offset > data->d_size +- || data->d_size - offset < descsz +- || (descsz == 0 && n->n_descsz != 0))) ++ offset += n->n_namesz; ++ if (offset > data->d_size) + offset = 0; + else + { +- *desc_offset = offset; +- offset += descsz; +- *result = *n; ++ /* Include padding. Check below for overflow. */ ++ GElf_Word descsz = (data->d_type == ELF_T_NHDR8 ++ ? NOTE_ALIGN8 (n->n_descsz) ++ : NOTE_ALIGN4 (n->n_descsz)); ++ ++ if (data->d_type == ELF_T_NHDR8) ++ offset = NOTE_ALIGN8 (offset); ++ else ++ offset = NOTE_ALIGN4 (offset); ++ ++ if (unlikely (offset > data->d_size ++ || data->d_size - offset < descsz ++ || (descsz == 0 && n->n_descsz != 0))) ++ offset = 0; ++ else ++ { ++ *desc_offset = offset; ++ offset += descsz; ++ *result = *n; ++ } + } + } + } +diff --git a/libelf/gelf_xlate.c b/libelf/gelf_xlate.c +index 479f143..b5d6ef3 100644 +--- a/libelf/gelf_xlate.c ++++ b/libelf/gelf_xlate.c +@@ -195,7 +195,8 @@ const xfct_t __elf_xfctstom[EV_NUM - 1][EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] + [ELF_T_VDAUX] = elf_cvt_Verdef, \ + [ELF_T_VNEED] = elf_cvt_Verneed, \ + [ELF_T_VNAUX] = elf_cvt_Verneed, \ +- [ELF_T_NHDR] = elf_cvt_note, \ ++ [ELF_T_NHDR] = elf_cvt_note4, \ ++ [ELF_T_NHDR8] = elf_cvt_note8, \ + [ELF_T_SYMINFO] = ElfW2(Bits, cvt_Syminfo), \ + [ELF_T_MOVE] = ElfW2(Bits, cvt_Move), \ + [ELF_T_LIB] = ElfW2(Bits, cvt_Lib), \ +diff --git a/libelf/libelf.h b/libelf/libelf.h +index d11358c..1ff11c9 100644 +--- a/libelf/libelf.h ++++ b/libelf/libelf.h +@@ -117,6 +117,8 @@ typedef enum + ELF_T_GNUHASH, /* GNU-style hash section. */ + ELF_T_AUXV, /* Elf32_auxv_t, Elf64_auxv_t, ... */ + ELF_T_CHDR, /* Compressed, Elf32_Chdr, Elf64_Chdr, ... */ ++ ELF_T_NHDR8, /* Special GNU Properties note. Same as Nhdr, ++ except padding. */ + /* Keep this the last entry. */ + ELF_T_NUM + } Elf_Type; +diff --git a/libelf/libelfP.h b/libelf/libelfP.h +index ed216c8..fa6d55d 100644 +--- a/libelf/libelfP.h ++++ b/libelf/libelfP.h +@@ -452,7 +452,8 @@ extern const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_ + /* Given an Elf handle and a section type returns the Elf_Data d_type. + Should not be called when SHF_COMPRESSED is set, the d_type should + be ELF_T_BYTE. */ +-extern Elf_Type __libelf_data_type (Elf *elf, int sh_type) internal_function; ++extern Elf_Type __libelf_data_type (Elf *elf, int sh_type, GElf_Xword align) ++ internal_function; + + /* The libelf API does not have such a function but it is still useful. + Get the memory size for the given type. +@@ -624,8 +625,13 @@ extern void __libelf_reset_rawdata (Elf_Scn *scn, void *buf, size_t size, + } \ + } while (0) + +-/* Align offset to 4 bytes as needed for note name and descriptor data. */ +-#define NOTE_ALIGN(n) (((n) + 3) & -4U) ++/* Align offset to 4 bytes as needed for note name and descriptor data. ++ This is almost always used, except for GNU Property notes, which use ++ 8 byte padding... */ ++#define NOTE_ALIGN4(n) (((n) + 3) & -4U) ++ ++/* Special note padding rule for GNU Property notes. */ ++#define NOTE_ALIGN8(n) (((n) + 7) & -8U) + + /* Convenience macro. */ + #define INVALID_NDX(ndx, type, data) \ +diff --git a/libelf/note_xlate.h b/libelf/note_xlate.h +index 62c6f63..9bdc3e2 100644 +--- a/libelf/note_xlate.h ++++ b/libelf/note_xlate.h +@@ -1,5 +1,5 @@ + /* Conversion functions for notes. +- Copyright (C) 2007, 2009, 2014 Red Hat, Inc. ++ Copyright (C) 2007, 2009, 2014, 2018 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -27,38 +27,60 @@ + not, see . */ + + static void +-elf_cvt_note (void *dest, const void *src, size_t len, int encode) ++elf_cvt_note (void *dest, const void *src, size_t len, int encode, ++ bool nhdr8) + { ++ /* Note that the header is always the same size, but the padding ++ differs for GNU Property notes. */ + assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr)); + + while (len >= sizeof (Elf32_Nhdr)) + { ++ /* Convert the header. */ + (1 ? Elf32_cvt_Nhdr : Elf64_cvt_Nhdr) (dest, src, sizeof (Elf32_Nhdr), + encode); + const Elf32_Nhdr *n = encode ? src : dest; +- Elf32_Word namesz = NOTE_ALIGN (n->n_namesz); +- Elf32_Word descsz = NOTE_ALIGN (n->n_descsz); + +- len -= sizeof *n; +- src += sizeof *n; +- dest += sizeof *n; ++ size_t note_len = sizeof *n; + +- if (namesz > len) ++ /* desc needs to be aligned. */ ++ note_len += n->n_namesz; ++ note_len = nhdr8 ? NOTE_ALIGN8 (note_len) : NOTE_ALIGN4 (note_len); ++ if (note_len > len || note_len < 8) + break; +- len -= namesz; +- if (descsz > len) ++ ++ /* data as a whole needs to be aligned. */ ++ note_len += n->n_descsz; ++ note_len = nhdr8 ? NOTE_ALIGN8 (note_len) : NOTE_ALIGN4 (note_len); ++ if (note_len > len || note_len < 8) + break; +- len -= descsz; + ++ /* Copy or skip the note data. */ ++ size_t note_data_len = note_len - sizeof *n; ++ src += sizeof *n; ++ dest += sizeof *n; + if (src != dest) +- memcpy (dest, src, namesz + descsz); ++ memcpy (dest, src, note_data_len); + +- src += namesz + descsz; +- dest += namesz + descsz; ++ src += note_data_len; ++ dest += note_data_len; ++ len -= note_len; + } + +- /* Copy opver any leftover data unconcerted. Probably part of ++ /* Copy over any leftover data unconverted. Probably part of + truncated name/desc data. */ + if (unlikely (len > 0) && src != dest) + memcpy (dest, src, len); + } ++ ++static void ++elf_cvt_note4 (void *dest, const void *src, size_t len, int encode) ++{ ++ elf_cvt_note (dest, src, len, encode, false); ++} ++ ++static void ++elf_cvt_note8 (void *dest, const void *src, size_t len, int encode) ++{ ++ elf_cvt_note (dest, src, len, encode, true); ++} +diff --git a/src/elflint.c b/src/elflint.c +index 3d44595..fa3af4c 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -4331,6 +4331,7 @@ section [%2d] '%s': unknown core file note type %" PRIu32 + case NT_GNU_HWCAP: + case NT_GNU_BUILD_ID: + case NT_GNU_GOLD_VERSION: ++ case NT_GNU_PROPERTY_TYPE_0: + break; + + case 0: +@@ -4376,7 +4377,8 @@ phdr[%d]: no note entries defined for the type of file\n"), + GElf_Off notes_size = 0; + Elf_Data *data = elf_getdata_rawchunk (ebl->elf, + phdr->p_offset, phdr->p_filesz, +- ELF_T_NHDR); ++ (phdr->p_align == 8 ++ ? ELF_T_NHDR8 : ELF_T_NHDR)); + if (data != NULL && data->d_buf != NULL) + notes_size = check_note_data (ebl, ehdr, data, 0, cnt, phdr->p_offset); + +diff --git a/src/readelf.c b/src/readelf.c +index 72ae04e..ccd07eb 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -12300,7 +12300,8 @@ handle_notes (Ebl *ebl, GElf_Ehdr *ehdr) + handle_notes_data (ebl, ehdr, phdr->p_offset, + elf_getdata_rawchunk (ebl->elf, + phdr->p_offset, phdr->p_filesz, +- ELF_T_NHDR)); ++ (phdr->p_align == 8 ++ ? ELF_T_NHDR8 : ELF_T_NHDR))); + } + } + diff --git a/elfutils.spec b/elfutils.spec index cb08fd1..e0832ba 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -26,6 +26,7 @@ Patch3: elfutils-0.174-libdwfl-sanity-check-core-reads.patch Patch4: elfutils-0.174-size-rec-ar.patch Patch5: elfutils-0.174-ar-sh_entsize-zero.patch Patch6: elfutils-0.174-x86_64_unwind.patch +Patch7: elfutils-0.174-gnu-property-note.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -200,6 +201,7 @@ profiling) of processes. %patch4 -p1 -b .size_rec_ar %patch5 -p1 -b .ar_sh_entsize_zero %patch6 -p1 -b .x86_64_unwind +%patch7 -p1 -b .gnu_prop_note # In case the above patches added any new test scripts, make sure they # are executable. @@ -334,6 +336,7 @@ fi %changelog * Wed Nov 14 2018 Mark Wielaard - Add elfutils-0.174-x86_64_unwind.patch. +- Add elfutils-0.174-gnu-property-note.patch. * Tue Nov 6 2018 Mark Wielaard - 0.174-4 - Add elfutils-0.174-size-rec-ar.patch From 95b280f1eb4e7428df80f147c50e7e4ad5ab5813 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 15 Nov 2018 00:43:39 +0100 Subject: [PATCH 081/216] Add elfutils-0.174-version-note.patch. --- elfutils-0.174-version-note.patch | 156 ++++++++++++++++++++++++++++++ elfutils.spec | 3 + 2 files changed, 159 insertions(+) create mode 100644 elfutils-0.174-version-note.patch diff --git a/elfutils-0.174-version-note.patch b/elfutils-0.174-version-note.patch new file mode 100644 index 0000000..fb33d83 --- /dev/null +++ b/elfutils-0.174-version-note.patch @@ -0,0 +1,156 @@ +commit 7a3f6fe60b8519b5372f5a5521ccbac59411f33f +Author: Mark Wielaard +Date: Sun Nov 11 23:50:41 2018 +0100 + + Recognize NT_VERSION notes. + + NT_VERSION notes are emitted by the gas .version directive. + They have an empty description and (ab)use the owner name to store the + version data string. + + Signed-off-by: Mark Wielaard + +diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c +index 57e9f52..8fda7d9 100644 +--- a/libebl/eblobjnote.c ++++ b/libebl/eblobjnote.c +@@ -135,6 +135,14 @@ ebl_object_note (Ebl *ebl, const char *name, uint32_t type, + return; + } + ++ /* NT_VERSION doesn't have any info. All data is in the name. */ ++ if (descsz == 0 && type == NT_VERSION) ++ return; ++ ++ /* Everything else should have the "GNU" owner name. */ ++ if (strcmp ("GNU", name) != 0) ++ return; ++ + switch (type) + { + case NT_GNU_BUILD_ID: +@@ -337,7 +345,7 @@ ebl_object_note (Ebl *ebl, const char *name, uint32_t type, + break; + + case NT_GNU_ABI_TAG: +- if (strcmp (name, "GNU") == 0 && descsz >= 8 && descsz % 4 == 0) ++ if (descsz >= 8 && descsz % 4 == 0) + { + Elf_Data in = + { +diff --git a/libebl/eblobjnotetypename.c b/libebl/eblobjnotetypename.c +index af23cae..8cdd781 100644 +--- a/libebl/eblobjnotetypename.c ++++ b/libebl/eblobjnotetypename.c +@@ -39,6 +39,7 @@ + + const char * + ebl_object_note_type_name (Ebl *ebl, const char *name, uint32_t type, ++ GElf_Word descsz, + char *buf, size_t len) + { + const char *res = ebl->object_note_type_name (name, type, buf, len); +@@ -80,14 +81,19 @@ ebl_object_note_type_name (Ebl *ebl, const char *name, uint32_t type, + + if (strcmp (name, "GNU") != 0) + { ++ /* NT_VERSION is special, all data is in the name. */ ++ if (descsz == 0 && type == NT_VERSION) ++ return "VERSION"; ++ + snprintf (buf, len, "%s: %" PRIu32, gettext (""), type); + return buf; + } + ++ /* And finally all the "GNU" note types. */ + static const char *knowntypes[] = + { + #define KNOWNSTYPE(name) [NT_##name] = #name +- KNOWNSTYPE (VERSION), ++ KNOWNSTYPE (GNU_ABI_TAG), + KNOWNSTYPE (GNU_HWCAP), + KNOWNSTYPE (GNU_BUILD_ID), + KNOWNSTYPE (GNU_GOLD_VERSION), +diff --git a/libebl/libebl.h b/libebl/libebl.h +index a34fe48..5830654 100644 +--- a/libebl/libebl.h ++++ b/libebl/libebl.h +@@ -175,8 +175,8 @@ extern const char *ebl_core_note_type_name (Ebl *ebl, uint32_t type, char *buf, + + /* Return name of the note section type for an object file. */ + extern const char *ebl_object_note_type_name (Ebl *ebl, const char *name, +- uint32_t type, char *buf, +- size_t len); ++ uint32_t type, GElf_Word descsz, ++ char *buf, size_t len); + + /* Print information about object note if available. */ + extern void ebl_object_note (Ebl *ebl, const char *name, uint32_t type, +diff --git a/src/elflint.c b/src/elflint.c +index fa3af4c..dff74ee 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -1,5 +1,5 @@ + /* Pedantic checking of ELF files compliance with gABI/psABI spec. +- Copyright (C) 2001-2015, 2017 Red Hat, Inc. ++ Copyright (C) 2001-2015, 2017, 2018 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 2001. + +@@ -4332,7 +4332,17 @@ section [%2d] '%s': unknown core file note type %" PRIu32 + case NT_GNU_BUILD_ID: + case NT_GNU_GOLD_VERSION: + case NT_GNU_PROPERTY_TYPE_0: +- break; ++ if (nhdr.n_namesz == sizeof ELF_NOTE_GNU ++ && strcmp (data->d_buf + name_offset, ELF_NOTE_GNU) == 0) ++ break; ++ else ++ { ++ /* NT_VERSION is 1, same as NT_GNU_ABI_TAG. It has no ++ descriptor and (ab)uses the name as version string. */ ++ if (nhdr.n_descsz == 0 && nhdr.n_type == NT_VERSION) ++ break; ++ } ++ goto unknown_note; + + case 0: + /* Linux vDSOs use a type 0 note for the kernel version word. */ +@@ -4341,16 +4351,21 @@ section [%2d] '%s': unknown core file note type %" PRIu32 + break; + FALLTHROUGH; + default: ++ { ++ unknown_note: + if (shndx == 0) + ERROR (gettext ("\ +-phdr[%d]: unknown object file note type %" PRIu32 " at offset %zu\n"), +- phndx, (uint32_t) nhdr.n_type, offset); ++phdr[%d]: unknown object file note type %" PRIu32 " with owner name '%s' at offset %zu\n"), ++ phndx, (uint32_t) nhdr.n_type, ++ (char *) data->d_buf + name_offset, offset); + else + ERROR (gettext ("\ + section [%2d] '%s': unknown object file note type %" PRIu32 +- " at offset %zu\n"), ++ " with owner name '%s' at offset %zu\n"), + shndx, section_name (ebl, shndx), +- (uint32_t) nhdr.n_type, offset); ++ (uint32_t) nhdr.n_type, ++ (char *) data->d_buf + name_offset, offset); ++ } + } + } + +diff --git a/src/readelf.c b/src/readelf.c +index c6c3fb3..659e34f 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -12201,6 +12201,7 @@ handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr, + ? ebl_core_note_type_name (ebl, nhdr.n_type, + buf, sizeof (buf)) + : ebl_object_note_type_name (ebl, name, nhdr.n_type, ++ nhdr.n_descsz, + buf2, sizeof (buf2))); + + /* Filter out invalid entries. */ diff --git a/elfutils.spec b/elfutils.spec index e0832ba..5814cd5 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -27,6 +27,7 @@ Patch4: elfutils-0.174-size-rec-ar.patch Patch5: elfutils-0.174-ar-sh_entsize-zero.patch Patch6: elfutils-0.174-x86_64_unwind.patch Patch7: elfutils-0.174-gnu-property-note.patch +Patch8: elfutils-0.174-version-note.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -202,6 +203,7 @@ profiling) of processes. %patch5 -p1 -b .ar_sh_entsize_zero %patch6 -p1 -b .x86_64_unwind %patch7 -p1 -b .gnu_prop_note +%patch8 -p1 -b .version_note # In case the above patches added any new test scripts, make sure they # are executable. @@ -337,6 +339,7 @@ fi * Wed Nov 14 2018 Mark Wielaard - Add elfutils-0.174-x86_64_unwind.patch. - Add elfutils-0.174-gnu-property-note.patch. +- Add elfutils-0.174-version-note.patch. * Tue Nov 6 2018 Mark Wielaard - 0.174-4 - Add elfutils-0.174-size-rec-ar.patch From a39405c33ba268b1fd5effd6b1a9a977995ca159 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 15 Nov 2018 00:55:41 +0100 Subject: [PATCH 082/216] 0.174-5 Add elfutils-0.174-gnu-attribute-note.patch --- elfutils-0.174-gnu-attribute-note.patch | 373 ++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 378 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.174-gnu-attribute-note.patch diff --git a/elfutils-0.174-gnu-attribute-note.patch b/elfutils-0.174-gnu-attribute-note.patch new file mode 100644 index 0000000..ae884a6 --- /dev/null +++ b/elfutils-0.174-gnu-attribute-note.patch @@ -0,0 +1,373 @@ +commit 72e30c2e0cb49a9a300667fdd5ff09082f717950 +Author: Mark Wielaard +Date: Mon Nov 12 23:34:24 2018 +0100 + + Handle GNU Build Attribute ELF Notes. + + GNU Build Attribute ELF Notes are generated by the GCC annobin plugin + and described at https://fedoraproject.org/wiki/Toolchain/Watermark + + Unfortunately the constants aren't yet described in the standard glibc + elf.h so they have been added to the elfutils specific elf-knowledge.h. + + The notes abuse the name owner field to encode some data not in the + description. This makes it a bit hard to parse. We have to match the + note owner name prefix (to "GA") to be sure the type is valid. We also + cannot rely on the owner name being a valid C string since the attribute + name and value can contain zero (terminators). So pass around namesz + to the ebl note parsing functions. + + eu-elflint will recognize and eu-readelf -n will now show the notes: + + Note section [27] '.gnu.build.attributes' of 56080 bytes at offset 0x114564: + Owner Data size Type + GA 16 GNU Build Attribute OPEN + Address Range: 0x2f30f - 0x2f30f + VERSION: "3p8" + GA 0 GNU Build Attribute OPEN + TOOL: "gcc 8.2.1 20180801" + GA 0 GNU Build Attribute OPEN + "GOW": 45 + GA 0 GNU Build Attribute OPEN + STACK_PROT: 0 + GA 0 GNU Build Attribute OPEN + "stack_clash": TRUE + GA 0 GNU Build Attribute OPEN + "cf_protection": 0 + GA 0 GNU Build Attribute OPEN + "GLIBCXX_ASSERTIONS": TRUE + GA 0 GNU Build Attribute OPEN + "FORTIFY": 0 + GA 0 GNU Build Attribute OPEN + PIC: 3 + GA 0 GNU Build Attribute OPEN + SHORT_ENUM: FALSE + GA 0 GNU Build Attribute OPEN + ABI: c001100000012 + GA 0 GNU Build Attribute OPEN + "stack_realign": FALSE + + A new test was added to run-readelf -n for the existing annobin file. + + Signed-off-by: Mark Wielaard + +diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c +index 8fda7d9..58ac86d 100644 +--- a/libebl/eblobjnote.c ++++ b/libebl/eblobjnote.c +@@ -37,11 +37,14 @@ + #include + #include + ++#include "common.h" + #include "libelfP.h" ++#include "libdwP.h" ++#include "memory-access.h" + + + void +-ebl_object_note (Ebl *ebl, const char *name, uint32_t type, ++ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name, uint32_t type, + uint32_t descsz, const char *desc) + { + if (! ebl->object_note (name, type, descsz, desc)) +@@ -135,6 +138,152 @@ ebl_object_note (Ebl *ebl, const char *name, uint32_t type, + return; + } + ++ if (strncmp (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX, ++ strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0 ++ && (type == NT_GNU_BUILD_ATTRIBUTE_OPEN ++ || type == NT_GNU_BUILD_ATTRIBUTE_FUNC)) ++ { ++ /* There might or might not be a pair of addresses in the desc. */ ++ if (descsz > 0) ++ { ++ printf (" Address Range: "); ++ ++ union ++ { ++ Elf64_Addr a64[2]; ++ Elf32_Addr a32[2]; ++ } addrs; ++ ++ size_t addr_size = gelf_fsize (ebl->elf, ELF_T_ADDR, ++ 2, EV_CURRENT); ++ if (descsz != addr_size) ++ printf ("\n"); ++ else ++ { ++ Elf_Data src = ++ { ++ .d_type = ELF_T_ADDR, .d_version = EV_CURRENT, ++ .d_buf = (void *) desc, .d_size = descsz ++ }; ++ ++ Elf_Data dst = ++ { ++ .d_type = ELF_T_ADDR, .d_version = EV_CURRENT, ++ .d_buf = &addrs, .d_size = descsz ++ }; ++ ++ if (gelf_xlatetom (ebl->elf, &dst, &src, ++ elf_getident (ebl->elf, ++ NULL)[EI_DATA]) == NULL) ++ printf ("%s\n", elf_errmsg (-1)); ++ else ++ { ++ if (addr_size == 4) ++ printf ("%#" PRIx32 " - %#" PRIx32 "\n", ++ addrs.a32[0], addrs.a32[1]); ++ else ++ printf ("%#" PRIx64 " - %#" PRIx64 "\n", ++ addrs.a64[0], addrs.a64[1]); ++ } ++ } ++ } ++ ++ /* Most data actually is inside the name. ++ https://fedoraproject.org/wiki/Toolchain/Watermark */ ++ ++ /* We need at least 2 chars of data to describe the ++ attribute and value encodings. */ ++ const char *data = (name ++ + strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)); ++ if (namesz < 2) ++ { ++ printf ("\n"); ++ return; ++ } ++ ++ printf (" "); ++ ++ /* In most cases the value comes right after the encoding bytes. */ ++ const char *value = &data[2]; ++ switch (data[1]) ++ { ++ case GNU_BUILD_ATTRIBUTE_VERSION: ++ printf ("VERSION: "); ++ break; ++ case GNU_BUILD_ATTRIBUTE_STACK_PROT: ++ printf ("STACK_PROT: "); ++ break; ++ case GNU_BUILD_ATTRIBUTE_RELRO: ++ printf ("RELRO: "); ++ break; ++ case GNU_BUILD_ATTRIBUTE_STACK_SIZE: ++ printf ("STACK_SIZE: "); ++ break; ++ case GNU_BUILD_ATTRIBUTE_TOOL: ++ printf ("TOOL: "); ++ break; ++ case GNU_BUILD_ATTRIBUTE_ABI: ++ printf ("ABI: "); ++ break; ++ case GNU_BUILD_ATTRIBUTE_PIC: ++ printf ("PIC: "); ++ break; ++ case GNU_BUILD_ATTRIBUTE_SHORT_ENUM: ++ printf ("SHORT_ENUM: "); ++ break; ++ case 32 ... 126: ++ printf ("\"%s\": ", &data[1]); ++ value += strlen (&data[1]) + 1; ++ break; ++ default: ++ printf (": "); ++ break; ++ } ++ ++ switch (data[0]) ++ { ++ case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC: ++ { ++ /* Any numbers are always in (unsigned) little endian. */ ++ static const Dwarf dbg ++ = { .other_byte_order = MY_ELFDATA != ELFDATA2LSB }; ++ size_t bytes = namesz - (value - name); ++ uint64_t val; ++ if (bytes == 1) ++ val = *(unsigned char *) value; ++ else if (bytes == 2) ++ val = read_2ubyte_unaligned (&dbg, value); ++ else if (bytes == 4) ++ val = read_4ubyte_unaligned (&dbg, value); ++ else if (bytes == 8) ++ val = read_8ubyte_unaligned (&dbg, value); ++ else ++ goto unknown; ++ printf ("%" PRIx64, val); ++ } ++ break; ++ case GNU_BUILD_ATTRIBUTE_TYPE_STRING: ++ printf ("\"%s\"", value); ++ break; ++ case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE: ++ printf ("TRUE"); ++ break; ++ case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE: ++ printf ("FALSE"); ++ break; ++ default: ++ { ++ unknown: ++ printf (""); ++ } ++ break; ++ } ++ ++ printf ("\n"); ++ ++ return; ++ } ++ + /* NT_VERSION doesn't have any info. All data is in the name. */ + if (descsz == 0 && type == NT_VERSION) + return; +diff --git a/libebl/eblobjnotetypename.c b/libebl/eblobjnotetypename.c +index 8cdd781..29a5391 100644 +--- a/libebl/eblobjnotetypename.c ++++ b/libebl/eblobjnotetypename.c +@@ -1,5 +1,5 @@ + /* Return note type name. +- Copyright (C) 2002, 2007, 2009, 2011, 2016 Red Hat, Inc. ++ Copyright (C) 2002, 2007, 2009, 2011, 2016, 2018 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 2002. + +@@ -79,6 +79,29 @@ ebl_object_note_type_name (Ebl *ebl, const char *name, uint32_t type, + } + } + ++ if (strncmp (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX, ++ strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0) ++ { ++ /* GNU Build Attribute notes (ab)use the owner name to store ++ most of their data. Don't decode everything here. Just ++ the type.*/ ++ char *t = buf; ++ const char *gba = "GNU Build Attribute"; ++ int w = snprintf (t, len, "%s ", gba); ++ t += w; ++ len -= w; ++ if (type == NT_GNU_BUILD_ATTRIBUTE_OPEN) ++ w = snprintf (t, len, "OPEN"); ++ else if (type == NT_GNU_BUILD_ATTRIBUTE_FUNC) ++ w = snprintf (t, len, "FUNC"); ++ else ++ w = snprintf (t, len, "%x", type); ++ t += w; ++ len -= w; ++ ++ return buf; ++ } ++ + if (strcmp (name, "GNU") != 0) + { + /* NT_VERSION is special, all data is in the name. */ +diff --git a/libebl/libebl.h b/libebl/libebl.h +index 5830654..ca9b9fe 100644 +--- a/libebl/libebl.h ++++ b/libebl/libebl.h +@@ -179,8 +179,8 @@ extern const char *ebl_object_note_type_name (Ebl *ebl, const char *name, + char *buf, size_t len); + + /* Print information about object note if available. */ +-extern void ebl_object_note (Ebl *ebl, const char *name, uint32_t type, +- uint32_t descsz, const char *desc); ++extern void ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name, ++ uint32_t type, uint32_t descsz, const char *desc); + + /* Check whether an attribute in a .gnu_attributes section is recognized. + Fills in *TAG_NAME with the name for this tag. +diff --git a/libelf/elf-knowledge.h b/libelf/elf-knowledge.h +index 64f5887..9d3be0f 100644 +--- a/libelf/elf-knowledge.h ++++ b/libelf/elf-knowledge.h +@@ -77,4 +77,25 @@ + || ((Ehdr)->e_machine == EM_S390 \ + && (Ehdr)->e_ident[EI_CLASS] == ELFCLASS64) ? 8 : 4) + ++/* GNU Annobin notes are not fully standardized and abuses the owner name. */ ++ ++#define ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX "GA" ++ ++#define NT_GNU_BUILD_ATTRIBUTE_OPEN 0x100 ++#define NT_GNU_BUILD_ATTRIBUTE_FUNC 0x101 ++ ++#define GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC '*' ++#define GNU_BUILD_ATTRIBUTE_TYPE_STRING '$' ++#define GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE '+' ++#define GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE '!' ++ ++#define GNU_BUILD_ATTRIBUTE_VERSION 1 ++#define GNU_BUILD_ATTRIBUTE_STACK_PROT 2 ++#define GNU_BUILD_ATTRIBUTE_RELRO 3 ++#define GNU_BUILD_ATTRIBUTE_STACK_SIZE 4 ++#define GNU_BUILD_ATTRIBUTE_TOOL 5 ++#define GNU_BUILD_ATTRIBUTE_ABI 6 ++#define GNU_BUILD_ATTRIBUTE_PIC 7 ++#define GNU_BUILD_ATTRIBUTE_SHORT_ENUM 8 ++ + #endif /* elf-knowledge.h */ +diff --git a/src/elflint.c b/src/elflint.c +index dff74ee..184ca12 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -4344,6 +4344,19 @@ section [%2d] '%s': unknown core file note type %" PRIu32 + } + goto unknown_note; + ++ case NT_GNU_BUILD_ATTRIBUTE_OPEN: ++ case NT_GNU_BUILD_ATTRIBUTE_FUNC: ++ /* GNU Build Attributes store most data in the owner ++ name, which must start with the ++ ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX "GA". */ ++ if (nhdr.n_namesz >= sizeof ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX ++ && strncmp (data->d_buf + name_offset, ++ ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX, ++ strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0) ++ break; ++ else ++ goto unknown_note; ++ + case 0: + /* Linux vDSOs use a type 0 note for the kernel version word. */ + if (nhdr.n_namesz == sizeof "Linux" +diff --git a/src/readelf.c b/src/readelf.c +index 659e34f..3a73710 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -12193,10 +12193,21 @@ handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr, + const char *name = nhdr.n_namesz == 0 ? "" : data->d_buf + name_offset; + const char *desc = data->d_buf + desc_offset; + ++ /* GNU Build Attributes are weird, they store most of their data ++ into the owner name field. Extract just the owner name ++ prefix here, then use the rest later as data. */ ++ bool is_gnu_build_attr ++ = strncmp (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX, ++ strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0; ++ const char *print_name = (is_gnu_build_attr ++ ? ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX : name); ++ size_t print_namesz = (is_gnu_build_attr ++ ? strlen (print_name) : nhdr.n_namesz); ++ + char buf[100]; + char buf2[100]; + printf (gettext (" %-13.*s %9" PRId32 " %s\n"), +- (int) nhdr.n_namesz, name, nhdr.n_descsz, ++ (int) print_namesz, print_name, nhdr.n_descsz, + ehdr->e_type == ET_CORE + ? ebl_core_note_type_name (ebl, nhdr.n_type, + buf, sizeof (buf)) +@@ -12237,7 +12248,8 @@ handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr, + handle_core_note (ebl, &nhdr, name, desc); + } + else +- ebl_object_note (ebl, name, nhdr.n_type, nhdr.n_descsz, desc); ++ ebl_object_note (ebl, nhdr.n_namesz, name, nhdr.n_type, ++ nhdr.n_descsz, desc); + } + } + diff --git a/elfutils.spec b/elfutils.spec index 5814cd5..aa17080 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.174 -%global baserelease 4 +%global baserelease 5 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -28,6 +28,7 @@ Patch5: elfutils-0.174-ar-sh_entsize-zero.patch Patch6: elfutils-0.174-x86_64_unwind.patch Patch7: elfutils-0.174-gnu-property-note.patch Patch8: elfutils-0.174-version-note.patch +Patch9: elfutils-0.174-gnu-attribute-note.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -204,6 +205,7 @@ profiling) of processes. %patch6 -p1 -b .x86_64_unwind %patch7 -p1 -b .gnu_prop_note %patch8 -p1 -b .version_note +%patch9 -p1 -b .gnu_attr_note # In case the above patches added any new test scripts, make sure they # are executable. @@ -336,10 +338,11 @@ fi %endif %changelog -* Wed Nov 14 2018 Mark Wielaard +* Wed Nov 14 2018 Mark Wielaard - 0.174-5 - Add elfutils-0.174-x86_64_unwind.patch. - Add elfutils-0.174-gnu-property-note.patch. - Add elfutils-0.174-version-note.patch. +- Add elfutils-0.174-gnu-attribute-note.patch * Tue Nov 6 2018 Mark Wielaard - 0.174-4 - Add elfutils-0.174-size-rec-ar.patch From d4c2009b2165e28d9eb271f23e5d83aa9ea80f3d Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 16 Nov 2018 13:51:06 +0100 Subject: [PATCH 083/216] New upstream release 0.175 --- .gitignore | 1 + elfutils-0.173-new-notes-hack.patch | 17 - elfutils-0.174-ar-sh_entsize-zero.patch | 27 - elfutils-0.174-gnu-attribute-note.patch | 373 -------- elfutils-0.174-gnu-property-note.patch | 820 ------------------ ....174-libdwfl-sanity-check-core-reads.patch | 51 -- elfutils-0.174-size-rec-ar.patch | 31 - elfutils-0.174-strip-unstrip-group.patch | 226 ----- elfutils-0.174-version-note.patch | 156 ---- elfutils-0.174-x86_64_unwind.patch | 127 --- elfutils.spec | 33 +- sources | 2 +- 12 files changed, 15 insertions(+), 1849 deletions(-) delete mode 100644 elfutils-0.173-new-notes-hack.patch delete mode 100644 elfutils-0.174-ar-sh_entsize-zero.patch delete mode 100644 elfutils-0.174-gnu-attribute-note.patch delete mode 100644 elfutils-0.174-gnu-property-note.patch delete mode 100644 elfutils-0.174-libdwfl-sanity-check-core-reads.patch delete mode 100644 elfutils-0.174-size-rec-ar.patch delete mode 100644 elfutils-0.174-strip-unstrip-group.patch delete mode 100644 elfutils-0.174-version-note.patch delete mode 100644 elfutils-0.174-x86_64_unwind.patch diff --git a/.gitignore b/.gitignore index e08fcd1..7a15c87 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ /elfutils-0.172.tar.bz2 /elfutils-0.173.tar.bz2 /elfutils-0.174.tar.bz2 +/elfutils-0.175.tar.bz2 diff --git a/elfutils-0.173-new-notes-hack.patch b/elfutils-0.173-new-notes-hack.patch deleted file mode 100644 index 8e607fa..0000000 --- a/elfutils-0.173-new-notes-hack.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/src/elflint.c b/src/elflint.c -index eec799b2..31092f2e 100644 ---- a/src/elflint.c -+++ b/src/elflint.c -@@ -3905,10 +3905,11 @@ section [%2zu] '%s': size not multiple of entry size\n"), - cnt, section_name (ebl, cnt), - (int) shdr->sh_type); - -+#define SHF_GNU_BUILD_NOTE (1 << 20) - #define ALL_SH_FLAGS (SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR | SHF_MERGE \ - | SHF_STRINGS | SHF_INFO_LINK | SHF_LINK_ORDER \ - | SHF_OS_NONCONFORMING | SHF_GROUP | SHF_TLS \ -- | SHF_COMPRESSED) -+ | SHF_COMPRESSED | SHF_GNU_BUILD_NOTE) - if (shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS) - { - GElf_Xword sh_flags = shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS; diff --git a/elfutils-0.174-ar-sh_entsize-zero.patch b/elfutils-0.174-ar-sh_entsize-zero.patch deleted file mode 100644 index 0040033..0000000 --- a/elfutils-0.174-ar-sh_entsize-zero.patch +++ /dev/null @@ -1,27 +0,0 @@ -commit 2b16a9be69939822dcafe075413468daac98b327 -Author: Mark Wielaard -Date: Thu Oct 18 19:01:52 2018 +0200 - - arlib: Check that sh_entsize isn't zero. - - A bogus ELF file could have sh_entsize as zero. Don't divide by zero, - but just assume there are no symbols in the section. - - https://sourceware.org/bugzilla/show_bug.cgi?id=23786 - - Signed-off-by: Mark Wielaard - -diff --git a/src/arlib.c b/src/arlib.c -index 778e087..a6521e3 100644 ---- a/src/arlib.c -+++ b/src/arlib.c -@@ -252,6 +252,9 @@ arlib_add_symbols (Elf *elf, const char *arfname, const char *membername, - if (data == NULL) - continue; - -+ if (shdr->sh_entsize == 0) -+ continue; -+ - int nsyms = shdr->sh_size / shdr->sh_entsize; - for (int ndx = shdr->sh_info; ndx < nsyms; ++ndx) - { diff --git a/elfutils-0.174-gnu-attribute-note.patch b/elfutils-0.174-gnu-attribute-note.patch deleted file mode 100644 index ae884a6..0000000 --- a/elfutils-0.174-gnu-attribute-note.patch +++ /dev/null @@ -1,373 +0,0 @@ -commit 72e30c2e0cb49a9a300667fdd5ff09082f717950 -Author: Mark Wielaard -Date: Mon Nov 12 23:34:24 2018 +0100 - - Handle GNU Build Attribute ELF Notes. - - GNU Build Attribute ELF Notes are generated by the GCC annobin plugin - and described at https://fedoraproject.org/wiki/Toolchain/Watermark - - Unfortunately the constants aren't yet described in the standard glibc - elf.h so they have been added to the elfutils specific elf-knowledge.h. - - The notes abuse the name owner field to encode some data not in the - description. This makes it a bit hard to parse. We have to match the - note owner name prefix (to "GA") to be sure the type is valid. We also - cannot rely on the owner name being a valid C string since the attribute - name and value can contain zero (terminators). So pass around namesz - to the ebl note parsing functions. - - eu-elflint will recognize and eu-readelf -n will now show the notes: - - Note section [27] '.gnu.build.attributes' of 56080 bytes at offset 0x114564: - Owner Data size Type - GA 16 GNU Build Attribute OPEN - Address Range: 0x2f30f - 0x2f30f - VERSION: "3p8" - GA 0 GNU Build Attribute OPEN - TOOL: "gcc 8.2.1 20180801" - GA 0 GNU Build Attribute OPEN - "GOW": 45 - GA 0 GNU Build Attribute OPEN - STACK_PROT: 0 - GA 0 GNU Build Attribute OPEN - "stack_clash": TRUE - GA 0 GNU Build Attribute OPEN - "cf_protection": 0 - GA 0 GNU Build Attribute OPEN - "GLIBCXX_ASSERTIONS": TRUE - GA 0 GNU Build Attribute OPEN - "FORTIFY": 0 - GA 0 GNU Build Attribute OPEN - PIC: 3 - GA 0 GNU Build Attribute OPEN - SHORT_ENUM: FALSE - GA 0 GNU Build Attribute OPEN - ABI: c001100000012 - GA 0 GNU Build Attribute OPEN - "stack_realign": FALSE - - A new test was added to run-readelf -n for the existing annobin file. - - Signed-off-by: Mark Wielaard - -diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c -index 8fda7d9..58ac86d 100644 ---- a/libebl/eblobjnote.c -+++ b/libebl/eblobjnote.c -@@ -37,11 +37,14 @@ - #include - #include - -+#include "common.h" - #include "libelfP.h" -+#include "libdwP.h" -+#include "memory-access.h" - - - void --ebl_object_note (Ebl *ebl, const char *name, uint32_t type, -+ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name, uint32_t type, - uint32_t descsz, const char *desc) - { - if (! ebl->object_note (name, type, descsz, desc)) -@@ -135,6 +138,152 @@ ebl_object_note (Ebl *ebl, const char *name, uint32_t type, - return; - } - -+ if (strncmp (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX, -+ strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0 -+ && (type == NT_GNU_BUILD_ATTRIBUTE_OPEN -+ || type == NT_GNU_BUILD_ATTRIBUTE_FUNC)) -+ { -+ /* There might or might not be a pair of addresses in the desc. */ -+ if (descsz > 0) -+ { -+ printf (" Address Range: "); -+ -+ union -+ { -+ Elf64_Addr a64[2]; -+ Elf32_Addr a32[2]; -+ } addrs; -+ -+ size_t addr_size = gelf_fsize (ebl->elf, ELF_T_ADDR, -+ 2, EV_CURRENT); -+ if (descsz != addr_size) -+ printf ("\n"); -+ else -+ { -+ Elf_Data src = -+ { -+ .d_type = ELF_T_ADDR, .d_version = EV_CURRENT, -+ .d_buf = (void *) desc, .d_size = descsz -+ }; -+ -+ Elf_Data dst = -+ { -+ .d_type = ELF_T_ADDR, .d_version = EV_CURRENT, -+ .d_buf = &addrs, .d_size = descsz -+ }; -+ -+ if (gelf_xlatetom (ebl->elf, &dst, &src, -+ elf_getident (ebl->elf, -+ NULL)[EI_DATA]) == NULL) -+ printf ("%s\n", elf_errmsg (-1)); -+ else -+ { -+ if (addr_size == 4) -+ printf ("%#" PRIx32 " - %#" PRIx32 "\n", -+ addrs.a32[0], addrs.a32[1]); -+ else -+ printf ("%#" PRIx64 " - %#" PRIx64 "\n", -+ addrs.a64[0], addrs.a64[1]); -+ } -+ } -+ } -+ -+ /* Most data actually is inside the name. -+ https://fedoraproject.org/wiki/Toolchain/Watermark */ -+ -+ /* We need at least 2 chars of data to describe the -+ attribute and value encodings. */ -+ const char *data = (name -+ + strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)); -+ if (namesz < 2) -+ { -+ printf ("\n"); -+ return; -+ } -+ -+ printf (" "); -+ -+ /* In most cases the value comes right after the encoding bytes. */ -+ const char *value = &data[2]; -+ switch (data[1]) -+ { -+ case GNU_BUILD_ATTRIBUTE_VERSION: -+ printf ("VERSION: "); -+ break; -+ case GNU_BUILD_ATTRIBUTE_STACK_PROT: -+ printf ("STACK_PROT: "); -+ break; -+ case GNU_BUILD_ATTRIBUTE_RELRO: -+ printf ("RELRO: "); -+ break; -+ case GNU_BUILD_ATTRIBUTE_STACK_SIZE: -+ printf ("STACK_SIZE: "); -+ break; -+ case GNU_BUILD_ATTRIBUTE_TOOL: -+ printf ("TOOL: "); -+ break; -+ case GNU_BUILD_ATTRIBUTE_ABI: -+ printf ("ABI: "); -+ break; -+ case GNU_BUILD_ATTRIBUTE_PIC: -+ printf ("PIC: "); -+ break; -+ case GNU_BUILD_ATTRIBUTE_SHORT_ENUM: -+ printf ("SHORT_ENUM: "); -+ break; -+ case 32 ... 126: -+ printf ("\"%s\": ", &data[1]); -+ value += strlen (&data[1]) + 1; -+ break; -+ default: -+ printf (": "); -+ break; -+ } -+ -+ switch (data[0]) -+ { -+ case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC: -+ { -+ /* Any numbers are always in (unsigned) little endian. */ -+ static const Dwarf dbg -+ = { .other_byte_order = MY_ELFDATA != ELFDATA2LSB }; -+ size_t bytes = namesz - (value - name); -+ uint64_t val; -+ if (bytes == 1) -+ val = *(unsigned char *) value; -+ else if (bytes == 2) -+ val = read_2ubyte_unaligned (&dbg, value); -+ else if (bytes == 4) -+ val = read_4ubyte_unaligned (&dbg, value); -+ else if (bytes == 8) -+ val = read_8ubyte_unaligned (&dbg, value); -+ else -+ goto unknown; -+ printf ("%" PRIx64, val); -+ } -+ break; -+ case GNU_BUILD_ATTRIBUTE_TYPE_STRING: -+ printf ("\"%s\"", value); -+ break; -+ case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE: -+ printf ("TRUE"); -+ break; -+ case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE: -+ printf ("FALSE"); -+ break; -+ default: -+ { -+ unknown: -+ printf (""); -+ } -+ break; -+ } -+ -+ printf ("\n"); -+ -+ return; -+ } -+ - /* NT_VERSION doesn't have any info. All data is in the name. */ - if (descsz == 0 && type == NT_VERSION) - return; -diff --git a/libebl/eblobjnotetypename.c b/libebl/eblobjnotetypename.c -index 8cdd781..29a5391 100644 ---- a/libebl/eblobjnotetypename.c -+++ b/libebl/eblobjnotetypename.c -@@ -1,5 +1,5 @@ - /* Return note type name. -- Copyright (C) 2002, 2007, 2009, 2011, 2016 Red Hat, Inc. -+ Copyright (C) 2002, 2007, 2009, 2011, 2016, 2018 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 2002. - -@@ -79,6 +79,29 @@ ebl_object_note_type_name (Ebl *ebl, const char *name, uint32_t type, - } - } - -+ if (strncmp (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX, -+ strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0) -+ { -+ /* GNU Build Attribute notes (ab)use the owner name to store -+ most of their data. Don't decode everything here. Just -+ the type.*/ -+ char *t = buf; -+ const char *gba = "GNU Build Attribute"; -+ int w = snprintf (t, len, "%s ", gba); -+ t += w; -+ len -= w; -+ if (type == NT_GNU_BUILD_ATTRIBUTE_OPEN) -+ w = snprintf (t, len, "OPEN"); -+ else if (type == NT_GNU_BUILD_ATTRIBUTE_FUNC) -+ w = snprintf (t, len, "FUNC"); -+ else -+ w = snprintf (t, len, "%x", type); -+ t += w; -+ len -= w; -+ -+ return buf; -+ } -+ - if (strcmp (name, "GNU") != 0) - { - /* NT_VERSION is special, all data is in the name. */ -diff --git a/libebl/libebl.h b/libebl/libebl.h -index 5830654..ca9b9fe 100644 ---- a/libebl/libebl.h -+++ b/libebl/libebl.h -@@ -179,8 +179,8 @@ extern const char *ebl_object_note_type_name (Ebl *ebl, const char *name, - char *buf, size_t len); - - /* Print information about object note if available. */ --extern void ebl_object_note (Ebl *ebl, const char *name, uint32_t type, -- uint32_t descsz, const char *desc); -+extern void ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name, -+ uint32_t type, uint32_t descsz, const char *desc); - - /* Check whether an attribute in a .gnu_attributes section is recognized. - Fills in *TAG_NAME with the name for this tag. -diff --git a/libelf/elf-knowledge.h b/libelf/elf-knowledge.h -index 64f5887..9d3be0f 100644 ---- a/libelf/elf-knowledge.h -+++ b/libelf/elf-knowledge.h -@@ -77,4 +77,25 @@ - || ((Ehdr)->e_machine == EM_S390 \ - && (Ehdr)->e_ident[EI_CLASS] == ELFCLASS64) ? 8 : 4) - -+/* GNU Annobin notes are not fully standardized and abuses the owner name. */ -+ -+#define ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX "GA" -+ -+#define NT_GNU_BUILD_ATTRIBUTE_OPEN 0x100 -+#define NT_GNU_BUILD_ATTRIBUTE_FUNC 0x101 -+ -+#define GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC '*' -+#define GNU_BUILD_ATTRIBUTE_TYPE_STRING '$' -+#define GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE '+' -+#define GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE '!' -+ -+#define GNU_BUILD_ATTRIBUTE_VERSION 1 -+#define GNU_BUILD_ATTRIBUTE_STACK_PROT 2 -+#define GNU_BUILD_ATTRIBUTE_RELRO 3 -+#define GNU_BUILD_ATTRIBUTE_STACK_SIZE 4 -+#define GNU_BUILD_ATTRIBUTE_TOOL 5 -+#define GNU_BUILD_ATTRIBUTE_ABI 6 -+#define GNU_BUILD_ATTRIBUTE_PIC 7 -+#define GNU_BUILD_ATTRIBUTE_SHORT_ENUM 8 -+ - #endif /* elf-knowledge.h */ -diff --git a/src/elflint.c b/src/elflint.c -index dff74ee..184ca12 100644 ---- a/src/elflint.c -+++ b/src/elflint.c -@@ -4344,6 +4344,19 @@ section [%2d] '%s': unknown core file note type %" PRIu32 - } - goto unknown_note; - -+ case NT_GNU_BUILD_ATTRIBUTE_OPEN: -+ case NT_GNU_BUILD_ATTRIBUTE_FUNC: -+ /* GNU Build Attributes store most data in the owner -+ name, which must start with the -+ ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX "GA". */ -+ if (nhdr.n_namesz >= sizeof ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX -+ && strncmp (data->d_buf + name_offset, -+ ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX, -+ strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0) -+ break; -+ else -+ goto unknown_note; -+ - case 0: - /* Linux vDSOs use a type 0 note for the kernel version word. */ - if (nhdr.n_namesz == sizeof "Linux" -diff --git a/src/readelf.c b/src/readelf.c -index 659e34f..3a73710 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -12193,10 +12193,21 @@ handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr, - const char *name = nhdr.n_namesz == 0 ? "" : data->d_buf + name_offset; - const char *desc = data->d_buf + desc_offset; - -+ /* GNU Build Attributes are weird, they store most of their data -+ into the owner name field. Extract just the owner name -+ prefix here, then use the rest later as data. */ -+ bool is_gnu_build_attr -+ = strncmp (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX, -+ strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0; -+ const char *print_name = (is_gnu_build_attr -+ ? ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX : name); -+ size_t print_namesz = (is_gnu_build_attr -+ ? strlen (print_name) : nhdr.n_namesz); -+ - char buf[100]; - char buf2[100]; - printf (gettext (" %-13.*s %9" PRId32 " %s\n"), -- (int) nhdr.n_namesz, name, nhdr.n_descsz, -+ (int) print_namesz, print_name, nhdr.n_descsz, - ehdr->e_type == ET_CORE - ? ebl_core_note_type_name (ebl, nhdr.n_type, - buf, sizeof (buf)) -@@ -12237,7 +12248,8 @@ handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr, - handle_core_note (ebl, &nhdr, name, desc); - } - else -- ebl_object_note (ebl, name, nhdr.n_type, nhdr.n_descsz, desc); -+ ebl_object_note (ebl, nhdr.n_namesz, name, nhdr.n_type, -+ nhdr.n_descsz, desc); - } - } - diff --git a/elfutils-0.174-gnu-property-note.patch b/elfutils-0.174-gnu-property-note.patch deleted file mode 100644 index e511ed0..0000000 --- a/elfutils-0.174-gnu-property-note.patch +++ /dev/null @@ -1,820 +0,0 @@ -commit 5199e15870e05e5b0b9f98c20fc9b5427aa6dd6a -Author: Mark Wielaard -Date: Mon Oct 15 23:35:47 2018 +0200 - - Recognize and parse GNU Property notes. - - GNU Property notes are different from normal notes because they use - variable alignment/padding of their fields. They are 8 byte aligned, - but use 4 byte fields. The name is aligned at 4 bytes and padded so - that, the desc is aligned at 8 bytes. The whole note is padded to - 8 bytes again. For normal notes all fields are both 4 bytes wide and - 4 bytes aligned. - - To recognize these new kind of ELF Notes a new Elf_Type is introduced, - ELF_T_NHDR8. This type is used in the xlate functions to determine - how to align and pad the various fields. Since the fields themselves - can now have different alignments we will have to keep track of the - current alignement and use either NOTE_ALIGN4 or NOTE_ALIGN8 to - determine the padding. - - To set the correct Elf_Type on the Elf_Data we use either the section - sh_addralign or the segment p_align values. Assuming 8 means the - section or segment contains the new style notes, otherwise normal - notes. - - When we cannot determine the "alignment" directly, like when parsing - special kernel sys files, we check the name "GNU" and type - "GNU_PROPERTY_TYPE_0" fields. - - ebl_object_note now parses the new NT_GNU_PROPERTY_TYPE_0 and can - extract the GNU_PROPERTY_STACK_SIZE, GNU_PROPERTY_NO_COPY_ON_PROTECTED - and GNU_PROPERTY_X86_FEATURE_1_AND types GNU_PROPERTY_X86_FEATURE_1_IBT - and GNU_PROPERTY_X86_FEATURE_1_SHSTK. - - Tests are added for extracting the note from sections or segments - as set by gcc -fcf-protection. - - Signed-off-by: Mark Wielaard - -diff --git a/libdwelf/dwelf_elf_gnu_build_id.c b/libdwelf/dwelf_elf_gnu_build_id.c -index 8c78c70..dbcfc82 100644 ---- a/libdwelf/dwelf_elf_gnu_build_id.c -+++ b/libdwelf/dwelf_elf_gnu_build_id.c -@@ -88,7 +88,9 @@ find_elf_build_id (Dwfl_Module *mod, int e_type, Elf *elf, - result = check_notes (elf_getdata_rawchunk (elf, - phdr->p_offset, - phdr->p_filesz, -- ELF_T_NHDR), -+ (phdr->p_align == 8 -+ ? ELF_T_NHDR8 -+ : ELF_T_NHDR)), - phdr->p_vaddr, - build_id_bits, - build_id_elfaddr, -diff --git a/libdwfl/core-file.c b/libdwfl/core-file.c -index 84cb89a..01109f4 100644 ---- a/libdwfl/core-file.c -+++ b/libdwfl/core-file.c -@@ -496,7 +496,9 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable) - Elf_Data *notes = elf_getdata_rawchunk (elf, - notes_phdr.p_offset, - notes_phdr.p_filesz, -- ELF_T_NHDR); -+ (notes_phdr.p_align == 8 -+ ? ELF_T_NHDR8 -+ : ELF_T_NHDR)); - if (likely (notes != NULL)) - { - size_t pos = 0; -diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c -index 8749884..0d633ff 100644 ---- a/libdwfl/dwfl_segment_report_module.c -+++ b/libdwfl/dwfl_segment_report_module.c -@@ -27,7 +27,7 @@ - not, see . */ - - #include --#include "../libelf/libelfP.h" /* For NOTE_ALIGN. */ -+#include "../libelf/libelfP.h" /* For NOTE_ALIGN4 and NOTE_ALIGN8. */ - #undef _ - #include "libdwflP.h" - #include "common.h" -@@ -451,7 +451,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - GElf_Addr build_id_vaddr = 0; - - /* Consider a PT_NOTE we've found in the image. */ -- inline void consider_notes (GElf_Addr vaddr, GElf_Xword filesz) -+ inline void consider_notes (GElf_Addr vaddr, GElf_Xword filesz, -+ GElf_Xword align) - { - /* If we have already seen a build ID, we don't care any more. */ - if (build_id != NULL || filesz == 0) -@@ -478,7 +479,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - notes = malloc (filesz); - if (unlikely (notes == NULL)) - return; -- xlatefrom.d_type = xlateto.d_type = ELF_T_NHDR; -+ xlatefrom.d_type = xlateto.d_type = (align == 8 -+ ? ELF_T_NHDR8 : ELF_T_NHDR); - xlatefrom.d_buf = (void *) data; - xlatefrom.d_size = filesz; - xlateto.d_buf = notes; -@@ -489,15 +491,23 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - } - - const GElf_Nhdr *nh = notes; -- while ((const void *) nh < (const void *) notes + filesz) -- { -- const void *note_name = nh + 1; -- const void *note_desc = note_name + NOTE_ALIGN (nh->n_namesz); -- if (unlikely ((size_t) ((const void *) notes + filesz -- - note_desc) < nh->n_descsz)) -+ size_t len = 0; -+ while (filesz > len + sizeof (*nh)) -+ { -+ const void *note_name; -+ const void *note_desc; -+ -+ len += sizeof (*nh); -+ note_name = notes + len; -+ -+ len += nh->n_namesz; -+ len = align == 8 ? NOTE_ALIGN8 (len) : NOTE_ALIGN4 (len); -+ note_desc = notes + len; -+ -+ if (unlikely (filesz < len + nh->n_descsz)) - break; - -- if (nh->n_type == NT_GNU_BUILD_ID -+ if (nh->n_type == NT_GNU_BUILD_ID - && nh->n_descsz > 0 - && nh->n_namesz == sizeof "GNU" - && !memcmp (note_name, "GNU", sizeof "GNU")) -@@ -510,7 +520,9 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - break; - } - -- nh = note_desc + NOTE_ALIGN (nh->n_descsz); -+ len += nh->n_descsz; -+ len = align == 8 ? NOTE_ALIGN8 (len) : NOTE_ALIGN4 (len); -+ nh = (void *) notes + len; - } - - done: -@@ -535,7 +547,7 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - case PT_NOTE: - /* We calculate from the p_offset of the note segment, - because we don't yet know the bias for its p_vaddr. */ -- consider_notes (start + offset, filesz); -+ consider_notes (start + offset, filesz, align); - break; - - case PT_LOAD: -diff --git a/libdwfl/linux-core-attach.c b/libdwfl/linux-core-attach.c -index 9f05f72..6c99b9e 100644 ---- a/libdwfl/linux-core-attach.c -+++ b/libdwfl/linux-core-attach.c -@@ -355,7 +355,9 @@ dwfl_core_file_attach (Dwfl *dwfl, Elf *core) - if (phdr != NULL && phdr->p_type == PT_NOTE) - { - note_data = elf_getdata_rawchunk (core, phdr->p_offset, -- phdr->p_filesz, ELF_T_NHDR); -+ phdr->p_filesz, (phdr->p_align == 8 -+ ? ELF_T_NHDR8 -+ : ELF_T_NHDR)); - break; - } - } -diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c -index 9d0fef2..360e4ee 100644 ---- a/libdwfl/linux-kernel-modules.c -+++ b/libdwfl/linux-kernel-modules.c -@@ -39,6 +39,7 @@ - #include - #include - -+#include "libelfP.h" - #include "libdwflP.h" - #include - #include -@@ -554,15 +555,41 @@ check_notes (Dwfl_Module *mod, const char *notesfile, - return 1; - - unsigned char *p = buf.data; -+ size_t len = 0; - while (p < &buf.data[n]) - { - /* No translation required since we are reading the native kernel. */ - GElf_Nhdr *nhdr = (void *) p; -- p += sizeof *nhdr; -+ len += sizeof *nhdr; -+ p += len; - unsigned char *name = p; -- p += (nhdr->n_namesz + 3) & -4U; -- unsigned char *bits = p; -- p += (nhdr->n_descsz + 3) & -4U; -+ unsigned char *bits; -+ /* This is somewhat ugly, GNU Property notes use different padding, -+ but all we have is the file content, so we have to actually check -+ the name and type. */ -+ if (nhdr->n_type == NT_GNU_PROPERTY_TYPE_0 -+ && nhdr->n_namesz == sizeof "GNU" -+ && name + nhdr->n_namesz < &buf.data[n] -+ && !memcmp (name, "GNU", sizeof "GNU")) -+ { -+ len += nhdr->n_namesz; -+ len = NOTE_ALIGN8 (len); -+ p = buf.data + len; -+ bits = p; -+ len += nhdr->n_descsz; -+ len = NOTE_ALIGN8 (len); -+ p = buf.data + len; -+ } -+ else -+ { -+ len += nhdr->n_namesz; -+ len = NOTE_ALIGN4 (len); -+ p = buf.data + len; -+ bits = p; -+ len += nhdr->n_descsz; -+ len = NOTE_ALIGN4 (len); -+ p = buf.data + len; -+ } - - if (p <= &buf.data[n] - && nhdr->n_type == NT_GNU_BUILD_ID -diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c -index ca4f155..57e9f52 100644 ---- a/libebl/eblobjnote.c -+++ b/libebl/eblobjnote.c -@@ -1,5 +1,5 @@ - /* Print contents of object file note. -- Copyright (C) 2002, 2007, 2009, 2011, 2015, 2016 Red Hat, Inc. -+ Copyright (C) 2002, 2007, 2009, 2011, 2015, 2016, 2018 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 2002. - -@@ -37,6 +37,8 @@ - #include - #include - -+#include "libelfP.h" -+ - - void - ebl_object_note (Ebl *ebl, const char *name, uint32_t type, -@@ -153,6 +155,187 @@ ebl_object_note (Ebl *ebl, const char *name, uint32_t type, - (int) descsz, desc); - break; - -+ case NT_GNU_PROPERTY_TYPE_0: -+ if (strcmp (name, "GNU") == 0 && descsz > 0) -+ { -+ /* There are at least 2 words. type and datasz. */ -+ while (descsz >= 8) -+ { -+ struct pr_prop -+ { -+ GElf_Word pr_type; -+ GElf_Word pr_datasz; -+ } prop; -+ -+ Elf_Data in = -+ { -+ .d_version = EV_CURRENT, -+ .d_type = ELF_T_WORD, -+ .d_size = 8, -+ .d_buf = (void *) desc -+ }; -+ Elf_Data out = -+ { -+ .d_version = EV_CURRENT, -+ .d_type = ELF_T_WORD, -+ .d_size = descsz, -+ .d_buf = (void *) &prop -+ }; -+ -+ if (gelf_xlatetom (ebl->elf, &out, &in, -+ elf_getident (ebl->elf, -+ NULL)[EI_DATA]) == NULL) -+ { -+ printf ("%s\n", elf_errmsg (-1)); -+ return; -+ } -+ -+ desc += 8; -+ descsz -= 8; -+ -+ int elfclass = gelf_getclass (ebl->elf); -+ char *elfident = elf_getident (ebl->elf, NULL); -+ GElf_Ehdr ehdr; -+ gelf_getehdr (ebl->elf, &ehdr); -+ -+ /* Prefix. */ -+ printf (" "); -+ if (prop.pr_type == GNU_PROPERTY_STACK_SIZE) -+ { -+ printf ("STACK_SIZE "); -+ if (prop.pr_datasz == 4 || prop.pr_datasz == 8) -+ { -+ GElf_Addr addr; -+ in.d_type = ELF_T_ADDR; -+ out.d_type = ELF_T_ADDR; -+ in.d_size = prop.pr_datasz; -+ out.d_size = sizeof (addr); -+ in.d_buf = (void *) desc; -+ out.d_buf = (void *) &addr; -+ -+ if (gelf_xlatetom (ebl->elf, &out, &in, -+ elfident[EI_DATA]) == NULL) -+ { -+ printf ("%s\n", elf_errmsg (-1)); -+ return; -+ } -+ printf ("%#" PRIx64 "\n", addr); -+ } -+ else -+ printf (" (garbage datasz: %" PRIx32 ")\n", -+ prop.pr_datasz); -+ } -+ else if (prop.pr_type == GNU_PROPERTY_NO_COPY_ON_PROTECTED) -+ { -+ printf ("NO_COPY_ON_PROTECTION"); -+ if (prop.pr_datasz == 0) -+ printf ("\n"); -+ else -+ printf (" (garbage datasz: %" PRIx32 ")\n", -+ prop.pr_datasz); -+ } -+ else if (prop.pr_type >= GNU_PROPERTY_LOPROC -+ && prop.pr_type <= GNU_PROPERTY_HIPROC -+ && (ehdr.e_machine == EM_386 -+ || ehdr.e_machine == EM_X86_64)) -+ { -+ printf ("X86 "); -+ if (prop.pr_type == GNU_PROPERTY_X86_FEATURE_1_AND) -+ { -+ printf ("FEATURE_1_AND: "); -+ -+ if (prop.pr_datasz == 4) -+ { -+ GElf_Word data; -+ in.d_type = ELF_T_WORD; -+ out.d_type = ELF_T_WORD; -+ in.d_size = 4; -+ out.d_size = 4; -+ in.d_buf = (void *) desc; -+ out.d_buf = (void *) &data; -+ -+ if (gelf_xlatetom (ebl->elf, &out, &in, -+ elfident[EI_DATA]) == NULL) -+ { -+ printf ("%s\n", elf_errmsg (-1)); -+ return; -+ } -+ printf ("%08" PRIx32 " ", data); -+ -+ if ((data & GNU_PROPERTY_X86_FEATURE_1_IBT) -+ != 0) -+ { -+ printf ("IBT"); -+ data &= ~GNU_PROPERTY_X86_FEATURE_1_IBT; -+ if (data != 0) -+ printf (" "); -+ } -+ -+ if ((data & GNU_PROPERTY_X86_FEATURE_1_SHSTK) -+ != 0) -+ { -+ printf ("SHSTK"); -+ data &= ~GNU_PROPERTY_X86_FEATURE_1_SHSTK; -+ if (data != 0) -+ printf (" "); -+ } -+ -+ if (data != 0) -+ printf ("UNKNOWN"); -+ } -+ else -+ printf ("", -+ prop.pr_datasz); -+ -+ printf ("\n"); -+ } -+ else -+ { -+ printf ("%#" PRIx32, prop.pr_type); -+ if (prop.pr_datasz > 0) -+ { -+ printf (" data: "); -+ size_t i; -+ for (i = 0; i < prop.pr_datasz - 1; i++) -+ printf ("%02" PRIx8 " ", (uint8_t) desc[i]); -+ printf ("%02" PRIx8 "\n", (uint8_t) desc[i]); -+ } -+ } -+ } -+ else -+ { -+ if (prop.pr_type >= GNU_PROPERTY_LOPROC -+ && prop.pr_type <= GNU_PROPERTY_HIPROC) -+ printf ("proc_type %#" PRIx32, prop.pr_type); -+ else if (prop.pr_type >= GNU_PROPERTY_LOUSER -+ && prop.pr_type <= GNU_PROPERTY_HIUSER) -+ printf ("app_type %#" PRIx32, prop.pr_type); -+ else -+ printf ("unknown_type %#" PRIx32, prop.pr_type); -+ -+ if (prop.pr_datasz > 0) -+ { -+ printf (" data: "); -+ size_t i; -+ for (i = 0; i < prop.pr_datasz - 1; i++) -+ printf ("%02" PRIx8 " ", (uint8_t) desc[i]); -+ printf ("%02" PRIx8 "\n", (uint8_t) desc[i]); -+ } -+ } -+ if (elfclass == ELFCLASS32) -+ { -+ desc += NOTE_ALIGN4 (prop.pr_datasz); -+ descsz -= NOTE_ALIGN4 (prop.pr_datasz); -+ } -+ else -+ { -+ desc += NOTE_ALIGN8 (prop.pr_datasz); -+ descsz -= NOTE_ALIGN8 (prop.pr_datasz); -+ } -+ } -+ } -+ break; -+ - case NT_GNU_ABI_TAG: - if (strcmp (name, "GNU") == 0 && descsz >= 8 && descsz % 4 == 0) - { -diff --git a/libebl/eblobjnotetypename.c b/libebl/eblobjnotetypename.c -index db040d2..af23cae 100644 ---- a/libebl/eblobjnotetypename.c -+++ b/libebl/eblobjnotetypename.c -@@ -91,6 +91,7 @@ ebl_object_note_type_name (Ebl *ebl, const char *name, uint32_t type, - KNOWNSTYPE (GNU_HWCAP), - KNOWNSTYPE (GNU_BUILD_ID), - KNOWNSTYPE (GNU_GOLD_VERSION), -+ KNOWNSTYPE (GNU_PROPERTY_TYPE_0), - }; - - /* Handle standard names. */ -diff --git a/libelf/elf32_xlatetom.c b/libelf/elf32_xlatetom.c -index 13cd485..3b94cac 100644 ---- a/libelf/elf32_xlatetom.c -+++ b/libelf/elf32_xlatetom.c -@@ -60,7 +60,7 @@ elfw2(LIBELFBITS, xlatetom) (Elf_Data *dest, const Elf_Data *src, - /* We shouldn't require integer number of records when processing - notes. Payload bytes follow the header immediately, it's not an - array of records as is the case otherwise. */ -- if (src->d_type != ELF_T_NHDR -+ if (src->d_type != ELF_T_NHDR && src->d_type != ELF_T_NHDR8 - && src->d_size % recsize != 0) - { - __libelf_seterrno (ELF_E_INVALID_DATA); -diff --git a/libelf/elf_compress.c b/libelf/elf_compress.c -index 711be59..fd412e8 100644 ---- a/libelf/elf_compress.c -+++ b/libelf/elf_compress.c -@@ -513,7 +513,8 @@ elf_compress (Elf_Scn *scn, int type, unsigned int flags) - - __libelf_reset_rawdata (scn, scn->zdata_base, - scn->zdata_size, scn->zdata_align, -- __libelf_data_type (elf, sh_type)); -+ __libelf_data_type (elf, sh_type, -+ scn->zdata_align)); - - return 1; - } -diff --git a/libelf/elf_compress_gnu.c b/libelf/elf_compress_gnu.c -index dfa7c57..198dc7d 100644 ---- a/libelf/elf_compress_gnu.c -+++ b/libelf/elf_compress_gnu.c -@@ -196,7 +196,7 @@ elf_compress_gnu (Elf_Scn *scn, int inflate, unsigned int flags) - } - - __libelf_reset_rawdata (scn, buf_out, size, sh_addralign, -- __libelf_data_type (elf, sh_type)); -+ __libelf_data_type (elf, sh_type, sh_addralign)); - - scn->zdata_base = buf_out; - -diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c -index 278dfa8..4f80aaf 100644 ---- a/libelf/elf_getdata.c -+++ b/libelf/elf_getdata.c -@@ -65,7 +65,7 @@ static const Elf_Type shtype_map[EV_NUM - 1][TYPEIDX (SHT_HISUNW) + 1] = - [SHT_PREINIT_ARRAY] = ELF_T_ADDR, - [SHT_GROUP] = ELF_T_WORD, - [SHT_SYMTAB_SHNDX] = ELF_T_WORD, -- [SHT_NOTE] = ELF_T_NHDR, -+ [SHT_NOTE] = ELF_T_NHDR, /* Need alignment to guess ELF_T_NHDR8. */ - [TYPEIDX (SHT_GNU_verdef)] = ELF_T_VDEF, - [TYPEIDX (SHT_GNU_verneed)] = ELF_T_VNEED, - [TYPEIDX (SHT_GNU_versym)] = ELF_T_HALF, -@@ -106,6 +106,7 @@ const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] - [ELF_T_GNUHASH] = __alignof__ (Elf32_Word), \ - [ELF_T_AUXV] = __alignof__ (ElfW2(Bits,auxv_t)), \ - [ELF_T_CHDR] = __alignof__ (ElfW2(Bits,Chdr)), \ -+ [ELF_T_NHDR8] = 8 /* Special case for GNU Property note. */ \ - } - [EV_CURRENT - 1] = - { -@@ -118,7 +119,7 @@ const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] - - Elf_Type - internal_function --__libelf_data_type (Elf *elf, int sh_type) -+__libelf_data_type (Elf *elf, int sh_type, GElf_Xword align) - { - /* Some broken ELF ABI for 64-bit machines use the wrong hash table - entry size. See elf-knowledge.h for more information. */ -@@ -129,7 +130,13 @@ __libelf_data_type (Elf *elf, int sh_type) - return (SH_ENTSIZE_HASH (ehdr) == 4 ? ELF_T_WORD : ELF_T_XWORD); - } - else -- return shtype_map[LIBELF_EV_IDX][TYPEIDX (sh_type)]; -+ { -+ Elf_Type t = shtype_map[LIBELF_EV_IDX][TYPEIDX (sh_type)]; -+ /* Special case for GNU Property notes. */ -+ if (t == ELF_T_NHDR && align == 8) -+ t = ELF_T_NHDR8; -+ return t; -+ } - } - - /* Convert the data in the current section. */ -@@ -272,7 +279,9 @@ __libelf_set_rawdata_wrlock (Elf_Scn *scn) - else - { - Elf_Type t = shtype_map[LIBELF_EV_IDX][TYPEIDX (type)]; -- if (t == ELF_T_VDEF || t == ELF_T_NHDR -+ if (t == ELF_T_NHDR && align == 8) -+ t = ELF_T_NHDR8; -+ if (t == ELF_T_VDEF || t == ELF_T_NHDR || t == ELF_T_NHDR8 - || (t == ELF_T_GNUHASH && elf->class == ELFCLASS64)) - entsize = 1; - else -@@ -357,7 +366,7 @@ __libelf_set_rawdata_wrlock (Elf_Scn *scn) - if ((flags & SHF_COMPRESSED) != 0) - scn->rawdata.d.d_type = ELF_T_CHDR; - else -- scn->rawdata.d.d_type = __libelf_data_type (elf, type); -+ scn->rawdata.d.d_type = __libelf_data_type (elf, type, align); - scn->rawdata.d.d_off = 0; - - /* Make sure the alignment makes sense. d_align should be aligned both -diff --git a/libelf/gelf_fsize.c b/libelf/gelf_fsize.c -index 0c50926..d04ec5d 100644 ---- a/libelf/gelf_fsize.c -+++ b/libelf/gelf_fsize.c -@@ -64,6 +64,8 @@ const size_t __libelf_type_sizes[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] = - [ELF_T_VNEED] = sizeof (ElfW2(LIBELFBITS, Ext_Verneed)), \ - [ELF_T_VNAUX] = sizeof (ElfW2(LIBELFBITS, Ext_Vernaux)), \ - [ELF_T_NHDR] = sizeof (ElfW2(LIBELFBITS, Ext_Nhdr)), \ -+ /* Note the header size is the same, but padding is different. */ \ -+ [ELF_T_NHDR8] = sizeof (ElfW2(LIBELFBITS, Ext_Nhdr)), \ - [ELF_T_SYMINFO] = sizeof (ElfW2(LIBELFBITS, Ext_Syminfo)), \ - [ELF_T_MOVE] = sizeof (ElfW2(LIBELFBITS, Ext_Move)), \ - [ELF_T_LIB] = sizeof (ElfW2(LIBELFBITS, Ext_Lib)), \ -diff --git a/libelf/gelf_getnote.c b/libelf/gelf_getnote.c -index c75edda..6d33b35 100644 ---- a/libelf/gelf_getnote.c -+++ b/libelf/gelf_getnote.c -@@ -1,5 +1,5 @@ - /* Get note information at the supplied offset. -- Copyright (C) 2007, 2014, 2015 Red Hat, Inc. -+ Copyright (C) 2007, 2014, 2015, 2018 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -43,7 +43,7 @@ gelf_getnote (Elf_Data *data, size_t offset, GElf_Nhdr *result, - if (data == NULL) - return 0; - -- if (unlikely (data->d_type != ELF_T_NHDR)) -+ if (unlikely (data->d_type != ELF_T_NHDR && data->d_type != ELF_T_NHDR8)) - { - __libelf_seterrno (ELF_E_INVALID_HANDLE); - return 0; -@@ -69,27 +69,42 @@ gelf_getnote (Elf_Data *data, size_t offset, GElf_Nhdr *result, - const GElf_Nhdr *n = data->d_buf + offset; - offset += sizeof *n; - -- /* Include padding. Check below for overflow. */ -- GElf_Word namesz = NOTE_ALIGN (n->n_namesz); -- GElf_Word descsz = NOTE_ALIGN (n->n_descsz); -- -- if (unlikely (offset > data->d_size -- || data->d_size - offset < namesz -- || (namesz == 0 && n->n_namesz != 0))) -+ if (offset > data->d_size) - offset = 0; - else - { -+ /* This is slightly tricky, offset is guaranteed to be 4 -+ byte aligned, which is what we need for the name_offset. -+ And normally desc_offset is also 4 byte aligned, but not -+ for GNU Property notes, then it should be 8. So align -+ the offset, after adding the namesz, and include padding -+ in descsz to get to the end. */ - *name_offset = offset; -- offset += namesz; -- if (unlikely (offset > data->d_size -- || data->d_size - offset < descsz -- || (descsz == 0 && n->n_descsz != 0))) -+ offset += n->n_namesz; -+ if (offset > data->d_size) - offset = 0; - else - { -- *desc_offset = offset; -- offset += descsz; -- *result = *n; -+ /* Include padding. Check below for overflow. */ -+ GElf_Word descsz = (data->d_type == ELF_T_NHDR8 -+ ? NOTE_ALIGN8 (n->n_descsz) -+ : NOTE_ALIGN4 (n->n_descsz)); -+ -+ if (data->d_type == ELF_T_NHDR8) -+ offset = NOTE_ALIGN8 (offset); -+ else -+ offset = NOTE_ALIGN4 (offset); -+ -+ if (unlikely (offset > data->d_size -+ || data->d_size - offset < descsz -+ || (descsz == 0 && n->n_descsz != 0))) -+ offset = 0; -+ else -+ { -+ *desc_offset = offset; -+ offset += descsz; -+ *result = *n; -+ } - } - } - } -diff --git a/libelf/gelf_xlate.c b/libelf/gelf_xlate.c -index 479f143..b5d6ef3 100644 ---- a/libelf/gelf_xlate.c -+++ b/libelf/gelf_xlate.c -@@ -195,7 +195,8 @@ const xfct_t __elf_xfctstom[EV_NUM - 1][EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] - [ELF_T_VDAUX] = elf_cvt_Verdef, \ - [ELF_T_VNEED] = elf_cvt_Verneed, \ - [ELF_T_VNAUX] = elf_cvt_Verneed, \ -- [ELF_T_NHDR] = elf_cvt_note, \ -+ [ELF_T_NHDR] = elf_cvt_note4, \ -+ [ELF_T_NHDR8] = elf_cvt_note8, \ - [ELF_T_SYMINFO] = ElfW2(Bits, cvt_Syminfo), \ - [ELF_T_MOVE] = ElfW2(Bits, cvt_Move), \ - [ELF_T_LIB] = ElfW2(Bits, cvt_Lib), \ -diff --git a/libelf/libelf.h b/libelf/libelf.h -index d11358c..1ff11c9 100644 ---- a/libelf/libelf.h -+++ b/libelf/libelf.h -@@ -117,6 +117,8 @@ typedef enum - ELF_T_GNUHASH, /* GNU-style hash section. */ - ELF_T_AUXV, /* Elf32_auxv_t, Elf64_auxv_t, ... */ - ELF_T_CHDR, /* Compressed, Elf32_Chdr, Elf64_Chdr, ... */ -+ ELF_T_NHDR8, /* Special GNU Properties note. Same as Nhdr, -+ except padding. */ - /* Keep this the last entry. */ - ELF_T_NUM - } Elf_Type; -diff --git a/libelf/libelfP.h b/libelf/libelfP.h -index ed216c8..fa6d55d 100644 ---- a/libelf/libelfP.h -+++ b/libelf/libelfP.h -@@ -452,7 +452,8 @@ extern const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_ - /* Given an Elf handle and a section type returns the Elf_Data d_type. - Should not be called when SHF_COMPRESSED is set, the d_type should - be ELF_T_BYTE. */ --extern Elf_Type __libelf_data_type (Elf *elf, int sh_type) internal_function; -+extern Elf_Type __libelf_data_type (Elf *elf, int sh_type, GElf_Xword align) -+ internal_function; - - /* The libelf API does not have such a function but it is still useful. - Get the memory size for the given type. -@@ -624,8 +625,13 @@ extern void __libelf_reset_rawdata (Elf_Scn *scn, void *buf, size_t size, - } \ - } while (0) - --/* Align offset to 4 bytes as needed for note name and descriptor data. */ --#define NOTE_ALIGN(n) (((n) + 3) & -4U) -+/* Align offset to 4 bytes as needed for note name and descriptor data. -+ This is almost always used, except for GNU Property notes, which use -+ 8 byte padding... */ -+#define NOTE_ALIGN4(n) (((n) + 3) & -4U) -+ -+/* Special note padding rule for GNU Property notes. */ -+#define NOTE_ALIGN8(n) (((n) + 7) & -8U) - - /* Convenience macro. */ - #define INVALID_NDX(ndx, type, data) \ -diff --git a/libelf/note_xlate.h b/libelf/note_xlate.h -index 62c6f63..9bdc3e2 100644 ---- a/libelf/note_xlate.h -+++ b/libelf/note_xlate.h -@@ -1,5 +1,5 @@ - /* Conversion functions for notes. -- Copyright (C) 2007, 2009, 2014 Red Hat, Inc. -+ Copyright (C) 2007, 2009, 2014, 2018 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -27,38 +27,60 @@ - not, see . */ - - static void --elf_cvt_note (void *dest, const void *src, size_t len, int encode) -+elf_cvt_note (void *dest, const void *src, size_t len, int encode, -+ bool nhdr8) - { -+ /* Note that the header is always the same size, but the padding -+ differs for GNU Property notes. */ - assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr)); - - while (len >= sizeof (Elf32_Nhdr)) - { -+ /* Convert the header. */ - (1 ? Elf32_cvt_Nhdr : Elf64_cvt_Nhdr) (dest, src, sizeof (Elf32_Nhdr), - encode); - const Elf32_Nhdr *n = encode ? src : dest; -- Elf32_Word namesz = NOTE_ALIGN (n->n_namesz); -- Elf32_Word descsz = NOTE_ALIGN (n->n_descsz); - -- len -= sizeof *n; -- src += sizeof *n; -- dest += sizeof *n; -+ size_t note_len = sizeof *n; - -- if (namesz > len) -+ /* desc needs to be aligned. */ -+ note_len += n->n_namesz; -+ note_len = nhdr8 ? NOTE_ALIGN8 (note_len) : NOTE_ALIGN4 (note_len); -+ if (note_len > len || note_len < 8) - break; -- len -= namesz; -- if (descsz > len) -+ -+ /* data as a whole needs to be aligned. */ -+ note_len += n->n_descsz; -+ note_len = nhdr8 ? NOTE_ALIGN8 (note_len) : NOTE_ALIGN4 (note_len); -+ if (note_len > len || note_len < 8) - break; -- len -= descsz; - -+ /* Copy or skip the note data. */ -+ size_t note_data_len = note_len - sizeof *n; -+ src += sizeof *n; -+ dest += sizeof *n; - if (src != dest) -- memcpy (dest, src, namesz + descsz); -+ memcpy (dest, src, note_data_len); - -- src += namesz + descsz; -- dest += namesz + descsz; -+ src += note_data_len; -+ dest += note_data_len; -+ len -= note_len; - } - -- /* Copy opver any leftover data unconcerted. Probably part of -+ /* Copy over any leftover data unconverted. Probably part of - truncated name/desc data. */ - if (unlikely (len > 0) && src != dest) - memcpy (dest, src, len); - } -+ -+static void -+elf_cvt_note4 (void *dest, const void *src, size_t len, int encode) -+{ -+ elf_cvt_note (dest, src, len, encode, false); -+} -+ -+static void -+elf_cvt_note8 (void *dest, const void *src, size_t len, int encode) -+{ -+ elf_cvt_note (dest, src, len, encode, true); -+} -diff --git a/src/elflint.c b/src/elflint.c -index 3d44595..fa3af4c 100644 ---- a/src/elflint.c -+++ b/src/elflint.c -@@ -4331,6 +4331,7 @@ section [%2d] '%s': unknown core file note type %" PRIu32 - case NT_GNU_HWCAP: - case NT_GNU_BUILD_ID: - case NT_GNU_GOLD_VERSION: -+ case NT_GNU_PROPERTY_TYPE_0: - break; - - case 0: -@@ -4376,7 +4377,8 @@ phdr[%d]: no note entries defined for the type of file\n"), - GElf_Off notes_size = 0; - Elf_Data *data = elf_getdata_rawchunk (ebl->elf, - phdr->p_offset, phdr->p_filesz, -- ELF_T_NHDR); -+ (phdr->p_align == 8 -+ ? ELF_T_NHDR8 : ELF_T_NHDR)); - if (data != NULL && data->d_buf != NULL) - notes_size = check_note_data (ebl, ehdr, data, 0, cnt, phdr->p_offset); - -diff --git a/src/readelf.c b/src/readelf.c -index 72ae04e..ccd07eb 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -12300,7 +12300,8 @@ handle_notes (Ebl *ebl, GElf_Ehdr *ehdr) - handle_notes_data (ebl, ehdr, phdr->p_offset, - elf_getdata_rawchunk (ebl->elf, - phdr->p_offset, phdr->p_filesz, -- ELF_T_NHDR)); -+ (phdr->p_align == 8 -+ ? ELF_T_NHDR8 : ELF_T_NHDR))); - } - } - diff --git a/elfutils-0.174-libdwfl-sanity-check-core-reads.patch b/elfutils-0.174-libdwfl-sanity-check-core-reads.patch deleted file mode 100644 index 19dda87..0000000 --- a/elfutils-0.174-libdwfl-sanity-check-core-reads.patch +++ /dev/null @@ -1,51 +0,0 @@ -commit 20f9de9b5f704cec55df92406a50bcbcfca96acd -Author: Mark Wielaard -Date: Sun Oct 14 16:45:48 2018 +0200 - - libdwfl: Sanity check partial core file data reads. - - There were two issues when reading note data from a core file. - We didn't check if the data we already had in a buffer was big - enough. And if we did get the data, we should check if we got - everything, or just a part of the data. - - https://sourceware.org/bugzilla/show_bug.cgi?id=23752 - - Signed-off-by: Mark Wielaard - -diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c -index 36e5c82..8749884 100644 ---- a/libdwfl/dwfl_segment_report_module.c -+++ b/libdwfl/dwfl_segment_report_module.c -@@ -1,5 +1,5 @@ - /* Sniff out modules from ELF headers visible in memory segments. -- Copyright (C) 2008-2012, 2014, 2015 Red Hat, Inc. -+ Copyright (C) 2008-2012, 2014, 2015, 2018 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -301,7 +301,10 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - inline bool read_portion (void **data, size_t *data_size, - GElf_Addr vaddr, size_t filesz) - { -- if (vaddr - start + filesz > buffer_available -+ /* Check whether we will have to read the segment data, or if it -+ can be returned from the existing buffer. */ -+ if (filesz > buffer_available -+ || vaddr - start > buffer_available - filesz - /* If we're in string mode, then don't consider the buffer we have - sufficient unless it contains the terminator of the string. */ - || (filesz == 0 && memchr (vaddr - start + buffer, '\0', -@@ -459,6 +462,12 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - if (read_portion (&data, &data_size, vaddr, filesz)) - return; - -+ /* data_size will be zero if we got everything from the initial -+ buffer, otherwise it will be the size of the new buffer that -+ could be read. */ -+ if (data_size != 0) -+ filesz = data_size; -+ - assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr)); - - void *notes; diff --git a/elfutils-0.174-size-rec-ar.patch b/elfutils-0.174-size-rec-ar.patch deleted file mode 100644 index 091fa49..0000000 --- a/elfutils-0.174-size-rec-ar.patch +++ /dev/null @@ -1,31 +0,0 @@ -commit 22d2d082d57a7470fadc0eae67179553f4919209 -Author: Mark Wielaard -Date: Thu Oct 18 23:15:48 2018 +0200 - - size: Handle recursive ELF ar files. - - eu-size didn't handle an ELF ar file that contained an ar file itself - correctly. handle_ar would recursively call itself but close the ELF - file before returning. Only close the ELF file at the top-level. - - https://sourceware.org/bugzilla/show_bug.cgi?id=23787 - - Signed-off-by: Mark Wielaard - -diff --git a/src/size.c b/src/size.c -index 5ff3f2a..f01fd88 100644 ---- a/src/size.c -+++ b/src/size.c -@@ -374,8 +374,10 @@ handle_ar (int fd, Elf *elf, const char *prefix, const char *fname) - INTERNAL_ERROR (fname); - } - -- if (unlikely (elf_end (elf) != 0)) -- INTERNAL_ERROR (fname); -+ /* Only close ELF handle if this was a "top level" ar file. */ -+ if (prefix == NULL) -+ if (unlikely (elf_end (elf) != 0)) -+ INTERNAL_ERROR (fname); - - return result; - } diff --git a/elfutils-0.174-strip-unstrip-group.patch b/elfutils-0.174-strip-unstrip-group.patch deleted file mode 100644 index 2fd9919..0000000 --- a/elfutils-0.174-strip-unstrip-group.patch +++ /dev/null @@ -1,226 +0,0 @@ -commit c06ab0bbb4761a69d2f188675d21d1a9131e9ecb -Author: Mark Wielaard -Date: Sat Oct 13 10:27:47 2018 +0200 - - strip, unstrip: Handle SHT_GROUP correctly. - - The usage of annobin in Fedora showed a couple of bugs when using - eu-strip and eu-unstrip on ET_REL files that contain multiple group - sections. - - When stripping we should not remove the SHF_GROUP flag from sections - even if the group section itself might be removed. Either the section - itself gets removed, and so the flag doesn't matter. Or it gets moved - together with the group section into the debug file, and then it still - needs to have the flag set. Also we would "renumber" the section group - flag field (which isn't a section index, and so shouldn't be changed). - - Often the group sections have the exact same name (".group"), flags - (none) and sometimes the same sizes. Which makes matching them hard. - Extract the group signature and compare those when comparing two - group sections. - - Signed-off-by: Mark Wielaard - -diff --git a/src/strip.c b/src/strip.c -index 1f7b3ca..fdebc5e 100644 ---- a/src/strip.c -+++ b/src/strip.c -@@ -792,9 +792,13 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - - if (shdr_info[shdr_info[cnt].group_idx].idx == 0) - { -- /* The section group section will be removed. */ -+ /* The section group section might be removed. -+ Don't remove the SHF_GROUP flag. The section is -+ either also removed, in which case the flag doesn't matter. -+ Or it moves with the group into the debug file, then -+ it will be reconnected with the new group and should -+ still have the flag set. */ - shdr_info[cnt].group_idx = 0; -- shdr_info[cnt].shdr.sh_flags &= ~SHF_GROUP; - } - } - -@@ -1368,7 +1372,9 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - && shdr_info[cnt].data->d_buf != NULL); - - Elf32_Word *grpref = (Elf32_Word *) shdr_info[cnt].data->d_buf; -- for (size_t inner = 0; -+ /* First word is the section group flag. -+ Followed by section indexes, that need to be renumbered. */ -+ for (size_t inner = 1; - inner < shdr_info[cnt].data->d_size / sizeof (Elf32_Word); - ++inner) - if (grpref[inner] < shnum) -diff --git a/src/unstrip.c b/src/unstrip.c -index e6f0947..03a0346 100644 ---- a/src/unstrip.c -+++ b/src/unstrip.c -@@ -696,6 +696,7 @@ struct section - { - Elf_Scn *scn; - const char *name; -+ const char *sig; - Elf_Scn *outscn; - Dwelf_Strent *strent; - GElf_Shdr shdr; -@@ -720,7 +721,8 @@ compare_alloc_sections (const struct section *s1, const struct section *s2, - - static int - compare_unalloc_sections (const GElf_Shdr *shdr1, const GElf_Shdr *shdr2, -- const char *name1, const char *name2) -+ const char *name1, const char *name2, -+ const char *sig1, const char *sig2) - { - /* Sort by sh_flags as an arbitrary ordering. */ - if (shdr1->sh_flags < shdr2->sh_flags) -@@ -734,6 +736,10 @@ compare_unalloc_sections (const GElf_Shdr *shdr1, const GElf_Shdr *shdr2, - if (shdr1->sh_size > shdr2->sh_size) - return 1; - -+ /* Are they both SHT_GROUP sections? Then compare signatures. */ -+ if (sig1 != NULL && sig2 != NULL) -+ return strcmp (sig1, sig2); -+ - /* Sort by name as last resort. */ - return strcmp (name1, name2); - } -@@ -751,7 +757,8 @@ compare_sections (const void *a, const void *b, bool rel) - return ((s1->shdr.sh_flags & SHF_ALLOC) - ? compare_alloc_sections (s1, s2, rel) - : compare_unalloc_sections (&s1->shdr, &s2->shdr, -- s1->name, s2->name)); -+ s1->name, s2->name, -+ s1->sig, s2->sig)); - } - - static int -@@ -986,6 +993,44 @@ get_section_name (size_t ndx, const GElf_Shdr *shdr, const Elf_Data *shstrtab) - return shstrtab->d_buf + shdr->sh_name; - } - -+/* Returns the signature of a group section, or NULL if the given -+ section isn't a group. */ -+static const char * -+get_group_sig (Elf *elf, GElf_Shdr *shdr) -+{ -+ if (shdr->sh_type != SHT_GROUP) -+ return NULL; -+ -+ Elf_Scn *symscn = elf_getscn (elf, shdr->sh_link); -+ if (symscn == NULL) -+ error (EXIT_FAILURE, 0, _("bad sh_link for group section: %s"), -+ elf_errmsg (-1)); -+ -+ GElf_Shdr symshdr_mem; -+ GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem); -+ if (symshdr == NULL) -+ error (EXIT_FAILURE, 0, _("couldn't get shdr for group section: %s"), -+ elf_errmsg (-1)); -+ -+ Elf_Data *symdata = elf_getdata (symscn, NULL); -+ if (symdata == NULL) -+ error (EXIT_FAILURE, 0, _("bad data for group symbol section: %s"), -+ elf_errmsg (-1)); -+ -+ GElf_Sym sym_mem; -+ GElf_Sym *sym = gelf_getsym (symdata, shdr->sh_info, &sym_mem); -+ if (sym == NULL) -+ error (EXIT_FAILURE, 0, _("couldn't get symbol for group section: %s"), -+ elf_errmsg (-1)); -+ -+ const char *sig = elf_strptr (elf, symshdr->sh_link, sym->st_name); -+ if (sig == NULL) -+ error (EXIT_FAILURE, 0, _("bad symbol name for group section: %s"), -+ elf_errmsg (-1)); -+ -+ return sig; -+} -+ - /* Fix things up when prelink has moved some allocated sections around - and the debuginfo file's section headers no longer match up. - This fills in SECTIONS[0..NALLOC-1].outscn or exits. -@@ -1111,6 +1156,7 @@ find_alloc_sections_prelink (Elf *debug, Elf_Data *debug_shstrtab, - sec->scn = elf_getscn (main, i + 1); /* Really just for ndx. */ - sec->outscn = NULL; - sec->strent = NULL; -+ sec->sig = get_group_sig (main, &sec->shdr); - ++undo_nalloc; - } - } -@@ -1336,6 +1382,7 @@ more sections in stripped file than debug file -- arguments reversed?")); - sections[i].scn = scn; - sections[i].outscn = NULL; - sections[i].strent = NULL; -+ sections[i].sig = get_group_sig (stripped, shdr); - } - - const struct section *stripped_symtab = NULL; -@@ -1354,7 +1401,8 @@ more sections in stripped file than debug file -- arguments reversed?")); - - /* Locate a matching unallocated section in SECTIONS. */ - inline struct section *find_unalloc_section (const GElf_Shdr *shdr, -- const char *name) -+ const char *name, -+ const char *sig) - { - size_t l = nalloc, u = stripped_shnum - 1; - while (l < u) -@@ -1362,7 +1410,8 @@ more sections in stripped file than debug file -- arguments reversed?")); - size_t i = (l + u) / 2; - struct section *sec = §ions[i]; - int cmp = compare_unalloc_sections (shdr, &sec->shdr, -- name, sec->name); -+ name, sec->name, -+ sig, sec->sig); - if (cmp < 0) - u = i; - else if (cmp > 0) -@@ -1435,7 +1484,8 @@ more sections in stripped file than debug file -- arguments reversed?")); - else - { - /* Look for the section that matches. */ -- sec = find_unalloc_section (shdr, name); -+ sec = find_unalloc_section (shdr, name, -+ get_group_sig (unstripped, shdr)); - if (sec == NULL) - { - /* An additional unallocated section is fine if not SHT_NOBITS. - -commit eee4269e53154daaf0251371aacd91ec5db3eb30 -Author: Mark Wielaard -Date: Sat Oct 13 10:27:47 2018 +0200 - - unstrip: Renumber the group section indexes. - - When unstripping we might need to renumber the group section indexes. - Just like we do when stripping. - - Signed-off-by: Mark Wielaard - -diff --git a/src/unstrip.c b/src/unstrip.c -index 03a0346..2cfd3b3 100644 ---- a/src/unstrip.c -+++ b/src/unstrip.c -@@ -1708,6 +1708,20 @@ more sections in stripped file than debug file -- arguments reversed?")); - if (shdr_mem.sh_type == SHT_DYNSYM) - stripped_dynsym = sec; - } -+ -+ if (shdr_mem.sh_type == SHT_GROUP) -+ { -+ /* We must adjust all the section indices in the group. -+ Skip the first word, which is the section group flag. -+ Everything else is a section index. */ -+ Elf32_Word *shndx = (Elf32_Word *) outdata->d_buf; -+ for (size_t i = 1; i < shdr_mem.sh_size / sizeof (Elf32_Word); ++i) -+ if (shndx[i] == SHN_UNDEF || shndx[i] >= stripped_shnum) -+ error (EXIT_FAILURE, 0, -+ _("group has invalid section index [%zd]"), i); -+ else -+ shndx[i] = ndx_section[shndx[i] - 1]; -+ } - } - - /* We may need to update the symbol table. */ diff --git a/elfutils-0.174-version-note.patch b/elfutils-0.174-version-note.patch deleted file mode 100644 index fb33d83..0000000 --- a/elfutils-0.174-version-note.patch +++ /dev/null @@ -1,156 +0,0 @@ -commit 7a3f6fe60b8519b5372f5a5521ccbac59411f33f -Author: Mark Wielaard -Date: Sun Nov 11 23:50:41 2018 +0100 - - Recognize NT_VERSION notes. - - NT_VERSION notes are emitted by the gas .version directive. - They have an empty description and (ab)use the owner name to store the - version data string. - - Signed-off-by: Mark Wielaard - -diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c -index 57e9f52..8fda7d9 100644 ---- a/libebl/eblobjnote.c -+++ b/libebl/eblobjnote.c -@@ -135,6 +135,14 @@ ebl_object_note (Ebl *ebl, const char *name, uint32_t type, - return; - } - -+ /* NT_VERSION doesn't have any info. All data is in the name. */ -+ if (descsz == 0 && type == NT_VERSION) -+ return; -+ -+ /* Everything else should have the "GNU" owner name. */ -+ if (strcmp ("GNU", name) != 0) -+ return; -+ - switch (type) - { - case NT_GNU_BUILD_ID: -@@ -337,7 +345,7 @@ ebl_object_note (Ebl *ebl, const char *name, uint32_t type, - break; - - case NT_GNU_ABI_TAG: -- if (strcmp (name, "GNU") == 0 && descsz >= 8 && descsz % 4 == 0) -+ if (descsz >= 8 && descsz % 4 == 0) - { - Elf_Data in = - { -diff --git a/libebl/eblobjnotetypename.c b/libebl/eblobjnotetypename.c -index af23cae..8cdd781 100644 ---- a/libebl/eblobjnotetypename.c -+++ b/libebl/eblobjnotetypename.c -@@ -39,6 +39,7 @@ - - const char * - ebl_object_note_type_name (Ebl *ebl, const char *name, uint32_t type, -+ GElf_Word descsz, - char *buf, size_t len) - { - const char *res = ebl->object_note_type_name (name, type, buf, len); -@@ -80,14 +81,19 @@ ebl_object_note_type_name (Ebl *ebl, const char *name, uint32_t type, - - if (strcmp (name, "GNU") != 0) - { -+ /* NT_VERSION is special, all data is in the name. */ -+ if (descsz == 0 && type == NT_VERSION) -+ return "VERSION"; -+ - snprintf (buf, len, "%s: %" PRIu32, gettext (""), type); - return buf; - } - -+ /* And finally all the "GNU" note types. */ - static const char *knowntypes[] = - { - #define KNOWNSTYPE(name) [NT_##name] = #name -- KNOWNSTYPE (VERSION), -+ KNOWNSTYPE (GNU_ABI_TAG), - KNOWNSTYPE (GNU_HWCAP), - KNOWNSTYPE (GNU_BUILD_ID), - KNOWNSTYPE (GNU_GOLD_VERSION), -diff --git a/libebl/libebl.h b/libebl/libebl.h -index a34fe48..5830654 100644 ---- a/libebl/libebl.h -+++ b/libebl/libebl.h -@@ -175,8 +175,8 @@ extern const char *ebl_core_note_type_name (Ebl *ebl, uint32_t type, char *buf, - - /* Return name of the note section type for an object file. */ - extern const char *ebl_object_note_type_name (Ebl *ebl, const char *name, -- uint32_t type, char *buf, -- size_t len); -+ uint32_t type, GElf_Word descsz, -+ char *buf, size_t len); - - /* Print information about object note if available. */ - extern void ebl_object_note (Ebl *ebl, const char *name, uint32_t type, -diff --git a/src/elflint.c b/src/elflint.c -index fa3af4c..dff74ee 100644 ---- a/src/elflint.c -+++ b/src/elflint.c -@@ -1,5 +1,5 @@ - /* Pedantic checking of ELF files compliance with gABI/psABI spec. -- Copyright (C) 2001-2015, 2017 Red Hat, Inc. -+ Copyright (C) 2001-2015, 2017, 2018 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 2001. - -@@ -4332,7 +4332,17 @@ section [%2d] '%s': unknown core file note type %" PRIu32 - case NT_GNU_BUILD_ID: - case NT_GNU_GOLD_VERSION: - case NT_GNU_PROPERTY_TYPE_0: -- break; -+ if (nhdr.n_namesz == sizeof ELF_NOTE_GNU -+ && strcmp (data->d_buf + name_offset, ELF_NOTE_GNU) == 0) -+ break; -+ else -+ { -+ /* NT_VERSION is 1, same as NT_GNU_ABI_TAG. It has no -+ descriptor and (ab)uses the name as version string. */ -+ if (nhdr.n_descsz == 0 && nhdr.n_type == NT_VERSION) -+ break; -+ } -+ goto unknown_note; - - case 0: - /* Linux vDSOs use a type 0 note for the kernel version word. */ -@@ -4341,16 +4351,21 @@ section [%2d] '%s': unknown core file note type %" PRIu32 - break; - FALLTHROUGH; - default: -+ { -+ unknown_note: - if (shndx == 0) - ERROR (gettext ("\ --phdr[%d]: unknown object file note type %" PRIu32 " at offset %zu\n"), -- phndx, (uint32_t) nhdr.n_type, offset); -+phdr[%d]: unknown object file note type %" PRIu32 " with owner name '%s' at offset %zu\n"), -+ phndx, (uint32_t) nhdr.n_type, -+ (char *) data->d_buf + name_offset, offset); - else - ERROR (gettext ("\ - section [%2d] '%s': unknown object file note type %" PRIu32 -- " at offset %zu\n"), -+ " with owner name '%s' at offset %zu\n"), - shndx, section_name (ebl, shndx), -- (uint32_t) nhdr.n_type, offset); -+ (uint32_t) nhdr.n_type, -+ (char *) data->d_buf + name_offset, offset); -+ } - } - } - -diff --git a/src/readelf.c b/src/readelf.c -index c6c3fb3..659e34f 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -12201,6 +12201,7 @@ handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr, - ? ebl_core_note_type_name (ebl, nhdr.n_type, - buf, sizeof (buf)) - : ebl_object_note_type_name (ebl, name, nhdr.n_type, -+ nhdr.n_descsz, - buf2, sizeof (buf2))); - - /* Filter out invalid entries. */ diff --git a/elfutils-0.174-x86_64_unwind.patch b/elfutils-0.174-x86_64_unwind.patch deleted file mode 100644 index b766517..0000000 --- a/elfutils-0.174-x86_64_unwind.patch +++ /dev/null @@ -1,127 +0,0 @@ -commit 825e48c4e942e3cbdab1b75c04b8c014867d66ab -Author: Milian Wolff -Date: Mon Oct 29 16:21:26 2018 +0100 - - Also find CFI in sections of type SHT_X86_64_UNWIND - - On my system with g++ (GCC) 8.2.1 20180831 with GNU gold (GNU Binutils - 2.31.1) 1.16, the .eh_frame section does not have type PROGBITS - but rather is using X86_64_UNWIND nowadays: - - ``` - $ echo "int main(){ return 0; }" > test.c - $ gcc test.c - $ readelf --sections a.out | grep .eh_frame - [14] .eh_frame X86_64_UNWIND 0000000000000670 00000670 - [15] .eh_frame_hdr X86_64_UNWIND 0000000000000724 00000724 - ``` - - Without this patch, libdw refuses to use the available unwind - information, leading to broken backtraces while unwinding. With the - patch applied, unwinding works once more in such situations. - - Signed-off-by: Milian Wolff - Signed-off-by: Mark Wielaard - Tested-by: Milian Wolff - -diff --git a/libdw/dwarf_getcfi_elf.c b/libdw/dwarf_getcfi_elf.c -index 315cc02..adcaea0 100644 ---- a/libdw/dwarf_getcfi_elf.c -+++ b/libdw/dwarf_getcfi_elf.c -@@ -298,7 +298,7 @@ getcfi_shdr (Elf *elf, const GElf_Ehdr *ehdr) - } - else if (!strcmp (name, ".eh_frame")) - { -- if (shdr->sh_type == SHT_PROGBITS) -+ if (shdr->sh_type != SHT_NOBITS) - return getcfi_scn_eh_frame (elf, ehdr, scn, shdr, - hdr_scn, hdr_vaddr); - else - -commit 4b0342b85b5b1a3d3636e06e3b5320954828dfb1 -Author: Mark Wielaard -Date: Tue Nov 6 12:01:25 2018 +0100 - - backends: Add x86_64 section_type_name for SHT_X86_64_UNWIND. - - Makes sure that eu-readelf and eu-elflint recognize and show the - x86_64 specific section type correctly. - - Signed-off-by: Mark Wielaard - Tested-by: Milian Wolff - -diff --git a/backends/x86_64_init.c b/backends/x86_64_init.c -index adfa479..49f6c6c 100644 ---- a/backends/x86_64_init.c -+++ b/backends/x86_64_init.c -@@ -1,5 +1,5 @@ - /* Initialization of x86-64 specific backend library. -- Copyright (C) 2002-2009, 2013 Red Hat, Inc. -+ Copyright (C) 2002-2009, 2013, 2018 Red Hat, Inc. - Copyright (C) H.J. Lu , 2015. - This file is part of elfutils. - Written by Ulrich Drepper , 2002. -@@ -55,6 +55,7 @@ x86_64_init (Elf *elf __attribute__ ((unused)), - eh->name = "AMD x86-64"; - x86_64_init_reloc (eh); - HOOK (eh, reloc_simple_type); -+ HOOK (eh, section_type_name); - if (eh->class == ELFCLASS32) - eh->core_note = x32_core_note; - else -diff --git a/backends/x86_64_symbol.c b/backends/x86_64_symbol.c -index e07b180..98457bc 100644 ---- a/backends/x86_64_symbol.c -+++ b/backends/x86_64_symbol.c -@@ -1,5 +1,5 @@ - /* x86_64 specific symbolic name handling. -- Copyright (C) 2002, 2005 Red Hat, Inc. -+ Copyright (C) 2002, 2005, 2018 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 2002. - -@@ -59,3 +59,15 @@ x86_64_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type, - return ELF_T_NUM; - } - } -+ -+/* Return symbolic representation of section type. */ -+const char * -+x86_64_section_type_name (int type, -+ char *buf __attribute__ ((unused)), -+ size_t len __attribute__ ((unused))) -+{ -+ if (type == SHT_X86_64_UNWIND) -+ return "X86_64_UNWIND"; -+ -+ return NULL; -+} - -commit 22ec8efc1dd87cdc7892523457eb55990b967224 -Author: Mark Wielaard -Date: Sat Nov 10 23:33:03 2018 +0100 - - elflint: Allow PT_GNU_EH_FRAME segment to match SHT_X86_64_UNWIND section. - - The gold linker might generate an .eh_frame_hdr with a SHT_X86_64_UNWIND - type instead of a SHT_PROGBITS type. - - Signed-off-by: Mark Wielaard - -diff --git a/src/elflint.c b/src/elflint.c -index 184ca12..810c8bd 100644 ---- a/src/elflint.c -+++ b/src/elflint.c -@@ -4633,8 +4633,10 @@ program header offset in ELF header and PHDR entry do not match")); - any = true; - shdr = gelf_getshdr (scn, &shdr_mem); - if (shdr != NULL -- && shdr->sh_type == (is_debuginfo -- ? SHT_NOBITS : SHT_PROGBITS) -+ && ((is_debuginfo && shdr->sh_type == SHT_NOBITS) -+ || (! is_debuginfo -+ && (shdr->sh_type == SHT_PROGBITS -+ || shdr->sh_type == SHT_X86_64_UNWIND))) - && elf_strptr (ebl->elf, shstrndx, shdr->sh_name) != NULL - && ! strcmp (".eh_frame_hdr", - elf_strptr (ebl->elf, shstrndx, shdr->sh_name))) diff --git a/elfutils.spec b/elfutils.spec index aa17080..053d3c8 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.174 -%global baserelease 5 +Version: 0.175 +%global baserelease 1 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,15 +20,6 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -Patch1: elfutils-0.173-new-notes-hack.patch -Patch2: elfutils-0.174-strip-unstrip-group.patch -Patch3: elfutils-0.174-libdwfl-sanity-check-core-reads.patch -Patch4: elfutils-0.174-size-rec-ar.patch -Patch5: elfutils-0.174-ar-sh_entsize-zero.patch -Patch6: elfutils-0.174-x86_64_unwind.patch -Patch7: elfutils-0.174-gnu-property-note.patch -Patch8: elfutils-0.174-version-note.patch -Patch9: elfutils-0.174-gnu-attribute-note.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -197,15 +188,6 @@ profiling) of processes. %setup -q # Apply patches -%patch1 -p1 -b .notes_hack -%patch2 -p1 -b .strip_unstrip_group -%patch3 -p1 -b .sanity_check_core_reads -%patch4 -p1 -b .size_rec_ar -%patch5 -p1 -b .ar_sh_entsize_zero -%patch6 -p1 -b .x86_64_unwind -%patch7 -p1 -b .gnu_prop_note -%patch8 -p1 -b .version_note -%patch9 -p1 -b .gnu_attr_note # In case the above patches added any new test scripts, make sure they # are executable. @@ -338,6 +320,17 @@ fi %endif %changelog +* Fri Nov 16 2018 Mark Wielaard - 0.175-1 +- New upstream release. + - readelf: Handle multiple .debug_macro sections. + - strip: Add strip --reloc-debug-sections-only option. + Handle relocations against GNU compressed sections. + - libdwelf: New function dwelf_elf_begin. + - libcpu: Recognize bpf jump variants BPF_JLT, BPF_JLE, BPF_JSLT + and BPF_JSLE. + - backends: RISCV handles ADD/SUB relocations. +- Remove all patches. + * Wed Nov 14 2018 Mark Wielaard - 0.174-5 - Add elfutils-0.174-x86_64_unwind.patch. - Add elfutils-0.174-gnu-property-note.patch. diff --git a/sources b/sources index 87eea34..f4f122f 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.174.tar.bz2) = 696708309c2a9a076099748809ecdc0490f4a8a842b2efc1aae0d746e7c5a8b203743f5626739eff837216b0c052696516b2821f5d3cc3f2eef86597c96d42df +SHA512 (elfutils-0.175.tar.bz2) = 2c3168a34bbc8f22425faa263fc24ec50df39258a4f9ace4e6cd88e9764c435fee70c1a82db8273dbab70a75e5216a200bebf05af1d3ea77e444e35d71a4ed84 From e639c76faeecd6c7c89e77a99d5dd29db02b1b74 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 4 Dec 2018 00:12:00 +0100 Subject: [PATCH 084/216] 0.175-2 - Add elfutils-0.175-gnu-props-32.patch. --- elfutils-0.175-gnu-props-32.patch | 58 +++++++++++++++++++++++++++++++ elfutils.spec | 7 +++- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.175-gnu-props-32.patch diff --git a/elfutils-0.175-gnu-props-32.patch b/elfutils-0.175-gnu-props-32.patch new file mode 100644 index 0000000..ff9305b --- /dev/null +++ b/elfutils-0.175-gnu-props-32.patch @@ -0,0 +1,58 @@ +commit e8b9832af19e5975fb2a9dbe729eaba0373c781f +Author: Mark Wielaard +Date: Mon Dec 3 00:03:39 2018 +0100 + + libebl: Fix reading GNU_PROPERTY_STACK_SIZE reading from 32bit notes. + + When reading a GNU_PROPERTY_STACK_SIZE we need to use the proper data + type. GElf_Addr is 64bit always and when reading a 32bit size part of + it would not be initialized. Use either Elf32_Addr or Elf64_Addr to + read and print the data. + + Add 32bit and 64bit, little and big endian testcases. + + Signed-off-by: Mark Wielaard + +diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c +index 58ac86d..c19ea37 100644 +--- a/libebl/eblobjnote.c ++++ b/libebl/eblobjnote.c +@@ -360,15 +360,22 @@ ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name, uint32_t type, + if (prop.pr_type == GNU_PROPERTY_STACK_SIZE) + { + printf ("STACK_SIZE "); +- if (prop.pr_datasz == 4 || prop.pr_datasz == 8) ++ union ++ { ++ Elf64_Addr a64; ++ Elf32_Addr a32; ++ } addr; ++ if ((elfclass == ELFCLASS32 && prop.pr_datasz == 4) ++ || (elfclass == ELFCLASS64 && prop.pr_datasz == 8)) + { +- GElf_Addr addr; + in.d_type = ELF_T_ADDR; + out.d_type = ELF_T_ADDR; + in.d_size = prop.pr_datasz; +- out.d_size = sizeof (addr); ++ out.d_size = prop.pr_datasz; + in.d_buf = (void *) desc; +- out.d_buf = (void *) &addr; ++ out.d_buf = (elfclass == ELFCLASS32 ++ ? (void *) &addr.a32 ++ : (void *) &addr.a64); + + if (gelf_xlatetom (ebl->elf, &out, &in, + elfident[EI_DATA]) == NULL) +@@ -376,7 +383,10 @@ ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name, uint32_t type, + printf ("%s\n", elf_errmsg (-1)); + return; + } +- printf ("%#" PRIx64 "\n", addr); ++ if (elfclass == ELFCLASS32) ++ printf ("%#" PRIx32 "\n", addr.a32); ++ else ++ printf ("%#" PRIx64 "\n", addr.a64); + } + else + printf (" (garbage datasz: %" PRIx32 ")\n", diff --git a/elfutils.spec b/elfutils.spec index 053d3c8..90a6884 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.175 -%global baserelease 1 +%global baserelease 2 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -20,6 +20,7 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches +Patch1: elfutils-0.175-gnu-props-32.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -188,6 +189,7 @@ profiling) of processes. %setup -q # Apply patches +%patch1 -p1 -b .gnu_prop_32 # In case the above patches added any new test scripts, make sure they # are executable. @@ -320,6 +322,9 @@ fi %endif %changelog +* Mon Dec 3 2018 Mark Wielaard - 0.175-2 +- Add elfutils-0.175-gnu-props-32.patch. + * Fri Nov 16 2018 Mark Wielaard - 0.175-1 - New upstream release. - readelf: Handle multiple .debug_macro sections. From c2eceee3300adc4f951fe069bd2ec65cb11171b7 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Mon, 28 Jan 2019 20:17:43 +0100 Subject: [PATCH 085/216] Remove obsolete Group tag References: https://fedoraproject.org/wiki/Changes/Remove_Group_Tag --- elfutils.spec | 8 -------- 1 file changed, 8 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 90a6884..3d1ceee 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -5,7 +5,6 @@ Version: 0.175 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) -Group: Development/Tools Release: %{baserelease}%{?dist} @@ -58,7 +57,6 @@ elfcompress (to compress or decompress ELF sections). %package libs Summary: Libraries to handle compiled objects -Group: Development/Tools License: GPLv2+ or LGPLv3+ %if 0%{!?_isa:1} Provides: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -76,7 +74,6 @@ other programs using these libraries. %package devel Summary: Development libraries to handle compiled objects -Group: Development/Tools License: GPLv2+ or LGPLv3+ %if 0%{!?_isa:1} Provides: elfutils-devel%{depsuffix} = %{version}-%{release} @@ -93,7 +90,6 @@ assembler interface. %package devel-static Summary: Static archives to handle compiled objects -Group: Development/Tools License: GPLv2+ or LGPLv3+ %if 0%{!?_isa:1} Provides: elfutils-devel-static%{depsuffix} = %{version}-%{release} @@ -107,7 +103,6 @@ with the code to handle compiled objects. %package libelf Summary: Library to read and write ELF files -Group: Development/Tools License: GPLv2+ or LGPLv3+ %if 0%{!?_isa:1} Provides: elfutils-libelf%{depsuffix} = %{version}-%{release} @@ -122,7 +117,6 @@ elfutils package use it also to generate new ELF files. %package libelf-devel Summary: Development support for libelf -Group: Development/Tools License: GPLv2+ or LGPLv3+ %if 0%{!?_isa:1} Provides: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} @@ -138,7 +132,6 @@ different sections of an ELF file. %package libelf-devel-static Summary: Static archive of libelf -Group: Development/Tools License: GPLv2+ or LGPLv3+ %if 0%{!?_isa:1} Provides: elfutils-libelf-devel-static%{depsuffix} = %{version}-%{release} @@ -152,7 +145,6 @@ for libelf. %if %{provide_yama_scope} %package default-yama-scope Summary: Default yama attach scope sysctl setting -Group: Development/Tools License: GPLv2+ or LGPLv3+ Provides: default-yama-scope BuildArch: noarch From a44cc9595595cd7caa6e3e12533df0b959153a4b Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 31 Jan 2019 18:30:54 +0000 Subject: [PATCH 086/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_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 3d1ceee..0d68318 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.175 -%global baserelease 2 +%global baserelease 3 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -314,6 +314,9 @@ fi %endif %changelog +* Thu Jan 31 2019 Fedora Release Engineering - 0.175-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + * Mon Dec 3 2018 Mark Wielaard - 0.175-2 - Add elfutils-0.175-gnu-props-32.patch. From dfe2b39ed28d4d3b3de3baec2eedece786f1aceb Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 15 Feb 2019 17:24:43 +0100 Subject: [PATCH 087/216] 0.176-1 - New upstream release. - backends: riscv improved core file and return value location support. - Fixes CVE-2019-7146, CVE-2019-7148, CVE-2019-7149, CVE-2019-7150, CVE-2019-7664, CVE-2019-7665. --- .gitignore | 1 + elfutils-0.175-gnu-props-32.patch | 58 ------------------------------- elfutils-0.176-gcc-pr88835.patch | 28 +++++++++++++++ elfutils.spec | 14 +++++--- sources | 2 +- 5 files changed, 40 insertions(+), 63 deletions(-) delete mode 100644 elfutils-0.175-gnu-props-32.patch create mode 100644 elfutils-0.176-gcc-pr88835.patch diff --git a/.gitignore b/.gitignore index 7a15c87..8f51d6c 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ /elfutils-0.173.tar.bz2 /elfutils-0.174.tar.bz2 /elfutils-0.175.tar.bz2 +/elfutils-0.176.tar.bz2 diff --git a/elfutils-0.175-gnu-props-32.patch b/elfutils-0.175-gnu-props-32.patch deleted file mode 100644 index ff9305b..0000000 --- a/elfutils-0.175-gnu-props-32.patch +++ /dev/null @@ -1,58 +0,0 @@ -commit e8b9832af19e5975fb2a9dbe729eaba0373c781f -Author: Mark Wielaard -Date: Mon Dec 3 00:03:39 2018 +0100 - - libebl: Fix reading GNU_PROPERTY_STACK_SIZE reading from 32bit notes. - - When reading a GNU_PROPERTY_STACK_SIZE we need to use the proper data - type. GElf_Addr is 64bit always and when reading a 32bit size part of - it would not be initialized. Use either Elf32_Addr or Elf64_Addr to - read and print the data. - - Add 32bit and 64bit, little and big endian testcases. - - Signed-off-by: Mark Wielaard - -diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c -index 58ac86d..c19ea37 100644 ---- a/libebl/eblobjnote.c -+++ b/libebl/eblobjnote.c -@@ -360,15 +360,22 @@ ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name, uint32_t type, - if (prop.pr_type == GNU_PROPERTY_STACK_SIZE) - { - printf ("STACK_SIZE "); -- if (prop.pr_datasz == 4 || prop.pr_datasz == 8) -+ union -+ { -+ Elf64_Addr a64; -+ Elf32_Addr a32; -+ } addr; -+ if ((elfclass == ELFCLASS32 && prop.pr_datasz == 4) -+ || (elfclass == ELFCLASS64 && prop.pr_datasz == 8)) - { -- GElf_Addr addr; - in.d_type = ELF_T_ADDR; - out.d_type = ELF_T_ADDR; - in.d_size = prop.pr_datasz; -- out.d_size = sizeof (addr); -+ out.d_size = prop.pr_datasz; - in.d_buf = (void *) desc; -- out.d_buf = (void *) &addr; -+ out.d_buf = (elfclass == ELFCLASS32 -+ ? (void *) &addr.a32 -+ : (void *) &addr.a64); - - if (gelf_xlatetom (ebl->elf, &out, &in, - elfident[EI_DATA]) == NULL) -@@ -376,7 +383,10 @@ ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name, uint32_t type, - printf ("%s\n", elf_errmsg (-1)); - return; - } -- printf ("%#" PRIx64 "\n", addr); -+ if (elfclass == ELFCLASS32) -+ printf ("%#" PRIx32 "\n", addr.a32); -+ else -+ printf ("%#" PRIx64 "\n", addr.a64); - } - else - printf (" (garbage datasz: %" PRIx32 ")\n", diff --git a/elfutils-0.176-gcc-pr88835.patch b/elfutils-0.176-gcc-pr88835.patch new file mode 100644 index 0000000..6571f49 --- /dev/null +++ b/elfutils-0.176-gcc-pr88835.patch @@ -0,0 +1,28 @@ +Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88835 + +diff --git a/src/readelf.c b/src/readelf.c +index 33706bd..b55844c 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -10143,7 +10143,7 @@ print_debug_str_section (Dwfl_Module *dwflmod __attribute__ ((unused)), + ++digits; + tmp >>= 4; + } +- digits = MAX (4, digits); ++ digits = MIN (16, MAX (4, digits)); + + printf (gettext ("\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n" + " %*s String\n"), +diff --git a/tests/backtrace.c b/tests/backtrace.c +index 05e8ef8..d621fbf 100644 +--- a/tests/backtrace.c ++++ b/tests/backtrace.c +@@ -185,7 +185,7 @@ frame_callback (Dwfl_Frame *state, void *frame_arg) + symname = dwfl_module_addrname (mod, pc_adjusted); + + printf ("#%2d %#" PRIx64 "%4s\t%s\n", *framenop, (uint64_t) pc, +- ! isactivation ? "- 1" : "", symname); ++ ! isactivation ? "- 1" : "", symname ?: ""); + pid_t tid = dwfl_thread_tid (thread); + callback_verify (tid, *framenop, pc, symname, dwfl); + (*framenop)++; diff --git a/elfutils.spec b/elfutils.spec index 0d68318..40c9e37 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.175 -%global baserelease 3 +Version: 0.176 +%global baserelease 1 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -19,7 +19,7 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -Patch1: elfutils-0.175-gnu-props-32.patch +Patch1: elfutils-0.176-gcc-pr88835.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -181,7 +181,7 @@ profiling) of processes. %setup -q # Apply patches -%patch1 -p1 -b .gnu_prop_32 +%patch1 -p1 -b .gcc-pr88835 # In case the above patches added any new test scripts, make sure they # are executable. @@ -314,6 +314,12 @@ fi %endif %changelog +* Fri Feb 15 2019 Mark Wielaard - 0.176-1 +- New upstream release. + - backends: riscv improved core file and return value location support. + - Fixes CVE-2019-7146, CVE-2019-7148, CVE-2019-7149, CVE-2019-7150, + CVE-2019-7664, CVE-2019-7665. + * Thu Jan 31 2019 Fedora Release Engineering - 0.175-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild diff --git a/sources b/sources index f4f122f..5277574 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.175.tar.bz2) = 2c3168a34bbc8f22425faa263fc24ec50df39258a4f9ace4e6cd88e9764c435fee70c1a82db8273dbab70a75e5216a200bebf05af1d3ea77e444e35d71a4ed84 +SHA512 (elfutils-0.176.tar.bz2) = 7f032913be363a43229ded85d495dcf7542b3c85974aaaba0d984228dc9ac1721da3dc388d3fa02325a80940161db7e9ad2c9e4521a424ad8a7d050c0902915b From 9b6b1462afef0b0f63f4f493c064d039b81f1c1c Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 6 Mar 2019 15:55:16 +0100 Subject: [PATCH 088/216] Remove part of the workaround that is no longer needed. https://bugzilla.redhat.com/show_bug.cgi?id=1674849 --- elfutils-0.176-gcc-pr88835.patch | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/elfutils-0.176-gcc-pr88835.patch b/elfutils-0.176-gcc-pr88835.patch index 6571f49..4ea955d 100644 --- a/elfutils-0.176-gcc-pr88835.patch +++ b/elfutils-0.176-gcc-pr88835.patch @@ -1,18 +1,5 @@ Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88835 -diff --git a/src/readelf.c b/src/readelf.c -index 33706bd..b55844c 100644 ---- a/src/readelf.c -+++ b/src/readelf.c -@@ -10143,7 +10143,7 @@ print_debug_str_section (Dwfl_Module *dwflmod __attribute__ ((unused)), - ++digits; - tmp >>= 4; - } -- digits = MAX (4, digits); -+ digits = MIN (16, MAX (4, digits)); - - printf (gettext ("\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n" - " %*s String\n"), diff --git a/tests/backtrace.c b/tests/backtrace.c index 05e8ef8..d621fbf 100644 --- a/tests/backtrace.c From c9690396b3ec4878447ccc81c6e114f5b14a7187 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 30 Apr 2019 21:58:14 +0200 Subject: [PATCH 089/216] Update elfutils-0.176-gcc-pr88835.patch --- elfutils-0.176-gcc-pr88835.patch | 14 ++++++++++++++ elfutils.spec | 3 +++ 2 files changed, 17 insertions(+) diff --git a/elfutils-0.176-gcc-pr88835.patch b/elfutils-0.176-gcc-pr88835.patch index 4ea955d..455ef26 100644 --- a/elfutils-0.176-gcc-pr88835.patch +++ b/elfutils-0.176-gcc-pr88835.patch @@ -13,3 +13,17 @@ index 05e8ef8..d621fbf 100644 pid_t tid = dwfl_thread_tid (thread); callback_verify (tid, *framenop, pc, symname, dwfl); (*framenop)++; + +diff --git a/tests/backtrace-dwarf.c b/tests/backtrace-dwarf.c +index dfbf185..f446bc3 100644 +--- a/tests/backtrace-dwarf.c ++++ b/tests/backtrace-dwarf.c +@@ -101,7 +101,7 @@ frame_callback (Dwfl_Frame *state, void *frame_arg) + if (mod) + symname = dwfl_module_addrname (mod, pc_adjusted); + +- printf ("%#" PRIx64 "\t%s\n", (uint64_t) pc, symname); ++ printf ("%#" PRIx64 "\t%s\n", (uint64_t) pc, symname ?: ""); + + if (symname && (strcmp (symname, "main") == 0 + || strcmp (symname, ".main") == 0)) diff --git a/elfutils.spec b/elfutils.spec index 40c9e37..10e0884 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -314,6 +314,9 @@ fi %endif %changelog +* Tue Apr 30 2019 Mark Wielaard +- Update elfutils-0.176-gcc-pr88835.patch. + * Fri Feb 15 2019 Mark Wielaard - 0.176-1 - New upstream release. - backends: riscv improved core file and return value location support. From 03172c99718981755f8db57a63560bb1f6664783 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 30 Apr 2019 22:02:21 +0200 Subject: [PATCH 090/216] Add elfutils-0.176-pt-gnu-prop.patch --- elfutils-0.176-pt-gnu-prop.patch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 elfutils-0.176-pt-gnu-prop.patch diff --git a/elfutils-0.176-pt-gnu-prop.patch b/elfutils-0.176-pt-gnu-prop.patch new file mode 100644 index 0000000..917765b --- /dev/null +++ b/elfutils-0.176-pt-gnu-prop.patch @@ -0,0 +1,18 @@ +diff --git a/src/elflint.c b/src/elflint.c +index 810c8bd..1acf1bc 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -4483,8 +4483,13 @@ only executables, shared objects, and core files can have program headers\n")); + continue; + } + ++#ifndef PT_GNU_PROPERTY ++#define PT_GNU_PROPERTY (PT_LOOS + 0x474e553) ++#endif ++ + if (phdr->p_type >= PT_NUM && phdr->p_type != PT_GNU_EH_FRAME + && phdr->p_type != PT_GNU_STACK && phdr->p_type != PT_GNU_RELRO ++ && phdr->p_type != PT_GNU_PROPERTY + /* Check for a known machine-specific type. */ + && ebl_segment_type_name (ebl, phdr->p_type, NULL, 0) == NULL) + ERROR (gettext ("\ From d597c797b79cc0585b32cb3678d2f82d0c8025ec Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 30 Apr 2019 22:55:13 +0200 Subject: [PATCH 091/216] Add elfutils-0.176-pt-gnu-prop.patch --- elfutils.spec | 3 +++ 1 file changed, 3 insertions(+) diff --git a/elfutils.spec b/elfutils.spec index 10e0884..0399d48 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -20,6 +20,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches Patch1: elfutils-0.176-gcc-pr88835.patch +Patch2: elfutils-0.176-pt-gnu-prop.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -182,6 +183,7 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .gcc-pr88835 +%patch2 -p1 -b .pt-gnu-prop # In case the above patches added any new test scripts, make sure they # are executable. @@ -316,6 +318,7 @@ fi %changelog * Tue Apr 30 2019 Mark Wielaard - Update elfutils-0.176-gcc-pr88835.patch. +- Add elfutils-0.176-pt-gnu-prop.patch * Fri Feb 15 2019 Mark Wielaard - 0.176-1 - New upstream release. From 9989c790c6e65e890768c0d45485f1873a22c251 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 30 Apr 2019 22:56:31 +0200 Subject: [PATCH 092/216] 0.176-2 - Add elfutils-0.176-xlate-note.patch --- elfutils-0.176-xlate-note.patch | 486 ++++++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 491 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.176-xlate-note.patch diff --git a/elfutils-0.176-xlate-note.patch b/elfutils-0.176-xlate-note.patch new file mode 100644 index 0000000..e3bbf48 --- /dev/null +++ b/elfutils-0.176-xlate-note.patch @@ -0,0 +1,486 @@ +commit 28b5f578ae772bb2404c3847e4e22ad1c407af54 +Author: Mark Wielaard +Date: Tue Apr 30 13:00:17 2019 +0200 + + libelf: If xlate can only convert the ELF note header, just do that. + + When we started parsing new style ELF_T_NHDR8 notes we added extra + checks on alignment and padding. When those failed we would stop + converting and just return the rest of the ELF Note unconverted. + In the case were we just had enough data for just the ELF Note header + and the destionation and source weren't the same we would then + accidentially throw away the Note header conversion we just did. + + Fix that by indicating we did correctly convert just the header. + + Adds testcase that compares parsing ELF notes with gelf_getnote + and parsing the raw data by hand using elf32_xlatetom using just + the Note header and ignoring the (raw) note data. + + Signed-off-by: Mark Wielaard + +diff --git a/libelf/note_xlate.h b/libelf/note_xlate.h +index bc9950f..7e2784b 100644 +--- a/libelf/note_xlate.h ++++ b/libelf/note_xlate.h +@@ -47,13 +47,25 @@ elf_cvt_note (void *dest, const void *src, size_t len, int encode, + note_len += n->n_namesz; + note_len = nhdr8 ? NOTE_ALIGN8 (note_len) : NOTE_ALIGN4 (note_len); + if (note_len > len || note_len < sizeof *n) +- break; ++ { ++ /* Header was translated, nothing else. */ ++ len -= sizeof *n; ++ src += sizeof *n; ++ dest += sizeof *n; ++ break; ++ } + + /* data as a whole needs to be aligned. */ + note_len += n->n_descsz; + note_len = nhdr8 ? NOTE_ALIGN8 (note_len) : NOTE_ALIGN4 (note_len); + if (note_len > len || note_len < sizeof *n) +- break; ++ { ++ /* Header was translated, nothing else. */ ++ len -= sizeof *n; ++ src += sizeof *n; ++ dest += sizeof *n; ++ break; ++ } + + /* Copy or skip the note data. */ + size_t note_data_len = note_len - sizeof *n; +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 1b0c7d3..498c1db 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -60,7 +60,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \ + fillfile dwarf_default_lower_bound dwarf-die-addr-die \ + get-units-invalid get-units-split attr-integrate-skel \ + all-dwarf-ranges unit-info next_cfi \ +- elfcopy addsections ++ elfcopy addsections xlate_notes + + asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ + asm-tst6 asm-tst7 asm-tst8 asm-tst9 +@@ -159,7 +159,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \ + run-next-cfi.sh run-next-cfi-self.sh \ + run-copyadd-sections.sh run-copymany-sections.sh \ + run-typeiter-many.sh run-strip-test-many.sh \ +- run-strip-version.sh ++ run-strip-version.sh run-xlate-note.sh + + if !BIARCH + export ELFUTILS_DISABLE_BIARCH = 1 +@@ -423,7 +423,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ + testfile-debug-rel-ppc64-g.o.bz2 \ + testfile-debug-rel-ppc64-z.o.bz2 \ + testfile-debug-rel-ppc64.o.bz2 \ +- run-strip-version.sh testfile-version.bz2 ++ run-strip-version.sh testfile-version.bz2 \ ++ run-xlate-note.sh + + if USE_VALGRIND + valgrind_cmd='valgrind -q --leak-check=full --error-exitcode=1' +@@ -593,6 +594,7 @@ unit_info_LDADD = $(libdw) + next_cfi_LDADD = $(libelf) $(libdw) + elfcopy_LDADD = $(libelf) + addsections_LDADD = $(libelf) ++xlate_notes_LDADD = $(libelf) + + # We want to test the libelf header against the system elf.h header. + # Don't include any -I CPPFLAGS. Except when we install our own elf.h. +diff --git a/tests/run-xlate-note.sh b/tests/run-xlate-note.sh +new file mode 100755 +index 0000000..a907418 +--- /dev/null ++++ b/tests/run-xlate-note.sh +@@ -0,0 +1,93 @@ ++# Copyright (C) 2019 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 ++ ++testfiles testfileppc32 ++testrun_compare ${abs_top_builddir}/tests/xlate_notes testfileppc32 << EOF ++Notes in section 2: ++type: 1,1, namesz: 4,4, descsz: 16,16 ++Notes in section 3: ++type: 3,3, namesz: 4,4, descsz: 20,20 ++EOF ++ ++testfiles testfileppc64 ++testrun_compare ${abs_top_builddir}/tests/xlate_notes testfileppc64 << EOF ++Notes in section 2: ++type: 1,1, namesz: 4,4, descsz: 16,16 ++Notes in section 3: ++type: 3,3, namesz: 4,4, descsz: 20,20 ++EOF ++ ++testfiles testfiles390 ++testrun_compare ${abs_top_builddir}/tests/xlate_notes testfiles390 << EOF ++Notes in section 2: ++type: 1,1, namesz: 4,4, descsz: 16,16 ++Notes in section 3: ++type: 3,3, namesz: 4,4, descsz: 20,20 ++EOF ++ ++testfiles testfiles390x ++testrun_compare ${abs_top_builddir}/tests/xlate_notes testfiles390x << EOF ++Notes in section 2: ++type: 1,1, namesz: 4,4, descsz: 16,16 ++Notes in section 3: ++type: 3,3, namesz: 4,4, descsz: 20,20 ++EOF ++ ++testfiles testfileaarch64 ++testrun_compare ${abs_top_builddir}/tests/xlate_notes testfileaarch64 << EOF ++Notes in section 2: ++type: 1,1, namesz: 4,4, descsz: 16,16 ++Notes in section 3: ++type: 3,3, namesz: 4,4, descsz: 20,20 ++EOF ++ ++testfiles testfilearm ++testrun_compare ${abs_top_builddir}/tests/xlate_notes testfilearm << EOF ++Notes in section 2: ++type: 1,1, namesz: 4,4, descsz: 16,16 ++Notes in section 3: ++type: 3,3, namesz: 4,4, descsz: 20,20 ++EOF ++ ++testfiles testfile_gnu_props.32be.o ++testrun_compare ${abs_top_builddir}/tests/xlate_notes testfile_gnu_props.32be.o << EOF ++Notes in section 4: ++type: 5,5, namesz: 4,4, descsz: 12,12 ++type: 5,5, namesz: 4,4, descsz: 8,8 ++EOF ++ ++testfiles testfile_gnu_props.32le.o ++testrun_compare ${abs_top_builddir}/tests/xlate_notes testfile_gnu_props.32le.o << EOF ++Notes in section 4: ++type: 5,5, namesz: 4,4, descsz: 12,12 ++type: 5,5, namesz: 4,4, descsz: 8,8 ++EOF ++ ++testfiles testfile_gnu_props.64be.o ++testrun_compare ${abs_top_builddir}/tests/xlate_notes testfile_gnu_props.64be.o << EOF ++Notes in section 4: ++type: 5,5, namesz: 4,4, descsz: 16,16 ++type: 5,5, namesz: 4,4, descsz: 8,8 ++EOF ++ ++testfiles testfile_gnu_props.64le.o ++testrun_compare ${abs_top_builddir}/tests/xlate_notes testfile_gnu_props.64le.o << EOF ++Notes in section 4: ++type: 5,5, namesz: 4,4, descsz: 16,16 ++type: 5,5, namesz: 4,4, descsz: 8,8 ++EOF +diff --git a/tests/xlate_notes.c b/tests/xlate_notes.c +new file mode 100644 +index 0000000..90a4ae2 +--- /dev/null ++++ b/tests/xlate_notes.c +@@ -0,0 +1,157 @@ ++/* Test program for extracting ELF Note headers and getting whole notes. ++ Copyright (C) 2019 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 . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ELFUTILS_HEADER(elf) ++#include ++ ++int ++main (int argc, char *argv[]) ++{ ++ if (argc != 2) ++ { ++ printf ("No ELF file given as argument\n"); ++ exit (1); ++ } ++ ++ const char *fname = argv[1]; ++ ++ // Initialize libelf. ++ elf_version (EV_CURRENT); ++ ++ /* Read the ELF from disk now. */ ++ int fd = open (fname, O_RDONLY); ++ if (fd == -1) ++ { ++ printf ("cannot open '%s': %s\n", fname, strerror (errno)); ++ exit (1); ++ } ++ ++ Elf *elf = elf_begin (fd, ELF_C_READ, NULL); ++ if (elf == NULL) ++ { ++ printf ("cannot create ELF descriptor: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ GElf_Ehdr ehdr; ++ if (gelf_getehdr (elf, &ehdr) == NULL) ++ { ++ printf ("cannot get Ehdr: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ /* Search for all SHT_NOTE sections. */ ++ Elf_Scn *scn = NULL; ++ while ((scn = elf_nextscn (elf, scn)) != NULL) ++ { ++ /* Get the header. */ ++ GElf_Shdr shdr; ++ if (gelf_getshdr (scn, &shdr) == NULL) ++ { ++ printf ("couldn't get shdr: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ if (shdr.sh_type == SHT_NOTE) ++ { ++ printf ("Notes in section %zd:\n", elf_ndxscn (scn)); ++ ++ Elf_Data *raw = elf_rawdata (scn, NULL); ++ if (raw == NULL) ++ { ++ printf ("couldn't get raw data: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ Elf_Data *data = elf_getdata (scn, NULL); ++ if (data == NULL) ++ { ++ printf ("couldn't get data: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ size_t off = 0; ++ size_t next; ++ GElf_Nhdr nhdr; ++ size_t n_off; ++ size_t d_off; ++ while ((next = gelf_getnote (data, off, &nhdr, &n_off, &d_off)) > 0) ++ { ++ /* Now just get the note header "raw" (don't ++ copy/translate the note data). This only handles ++ traditional GNU ELF Notes, so we still use the next ++ from gelf_getnote (padding is different for new style ++ ELF_T_NHDR8 notes). */ ++ Elf32_Nhdr nh; ++ Elf_Data src = ++ { ++ .d_version = EV_CURRENT, .d_type = ELF_T_NHDR, ++ .d_size = sizeof nh ++ }; ++ Elf_Data dst = src; ++ src.d_buf = raw->d_buf + off; ++ dst.d_buf = &nh; ++ ++ if (elf32_xlatetom (&dst, &src, ehdr.e_ident[EI_DATA]) == NULL) ++ { ++ printf ("couldn't xlate note: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ printf ("type: %" PRId32 ",%" PRId32 ++ ", namesz: %" PRId32 ",%" PRId32 ++ ", descsz: %" PRId32 ",%" PRId32 "\n", ++ nhdr.n_type, nh.n_type, ++ nhdr.n_namesz, nh.n_namesz, ++ nhdr.n_descsz, nh.n_descsz); ++ ++ if (nhdr.n_type != nh.n_type ++ || nhdr.n_namesz != nh.n_namesz ++ || nhdr.n_descsz != nh.n_descsz) ++ { ++ printf ("Nhdrs not equal!\n"); ++ exit (1); ++ } ++ ++ off = next; ++ } ++ } ++ ++ } ++ ++ if (elf_end (elf) != 0) ++ { ++ printf ("failure in elf_end: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ close (fd); ++ ++ return 0; ++} +diff -ur elfutils-0.176.orig/tests/Makefile.in elfutils-0.176/tests/Makefile.in +--- elfutils-0.176.orig/tests/Makefile.in 2019-04-30 22:42:49.534655124 +0200 ++++ elfutils-0.176/tests/Makefile.in 2019-04-30 22:46:30.046656790 +0200 +@@ -131,8 +131,8 @@ + get-units-invalid$(EXEEXT) get-units-split$(EXEEXT) \ + attr-integrate-skel$(EXEEXT) all-dwarf-ranges$(EXEEXT) \ + unit-info$(EXEEXT) next_cfi$(EXEEXT) elfcopy$(EXEEXT) \ +- addsections$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \ +- $(am__EXEEXT_4) ++ addsections$(EXEEXT) xlate_notes$(EXEEXT) $(am__EXEEXT_1) \ ++ $(am__EXEEXT_2) $(am__EXEEXT_4) + @BIARCH_TRUE@am__append_5 = backtrace-child-biarch + TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile$(EXEEXT) \ + test-nlist$(EXEEXT) update1$(EXEEXT) update2$(EXEEXT) \ +@@ -211,8 +211,8 @@ + run-unit-info.sh run-reloc-bpf.sh run-next-cfi.sh \ + run-next-cfi-self.sh run-copyadd-sections.sh \ + run-copymany-sections.sh run-typeiter-many.sh \ +- run-strip-test-many.sh run-strip-version.sh $(am__EXEEXT_2) \ +- $(am__append_8) $(am__EXEEXT_5) ++ run-strip-test-many.sh run-strip-version.sh run-xlate-note.sh \ ++ $(am__EXEEXT_2) $(am__append_8) $(am__EXEEXT_5) + @STANDALONE_FALSE@am__append_6 = msg_tst system-elf-libelf-test + @STANDALONE_FALSE@am__append_7 = msg_tst system-elf-libelf-test + @LZMA_TRUE@am__append_8 = run-readelf-s.sh run-dwflsyms.sh +@@ -606,6 +606,9 @@ + vendorelf_SOURCES = vendorelf.c + vendorelf_OBJECTS = vendorelf.$(OBJEXT) + vendorelf_DEPENDENCIES = $(am__DEPENDENCIES_2) ++xlate_notes_SOURCES = xlate_notes.c ++xlate_notes_OBJECTS = xlate_notes.$(OBJEXT) ++xlate_notes_DEPENDENCIES = $(am__DEPENDENCIES_2) + zstrptr_SOURCES = zstrptr.c + zstrptr_OBJECTS = zstrptr.$(OBJEXT) + zstrptr_DEPENDENCIES = $(am__DEPENDENCIES_2) +@@ -683,7 +686,7 @@ + ./$(DEPDIR)/update2.Po ./$(DEPDIR)/update3.Po \ + ./$(DEPDIR)/update4.Po ./$(DEPDIR)/varlocs.Po \ + ./$(DEPDIR)/vdsosyms.Po ./$(DEPDIR)/vendorelf.Po \ +- ./$(DEPDIR)/zstrptr.Po ++ ./$(DEPDIR)/xlate_notes.Po ./$(DEPDIR)/zstrptr.Po + am__mv = mv -f + AM_V_lt = $(am__v_lt_@AM_V@) + am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +@@ -726,7 +729,8 @@ + showptable.c strptr.c system-elf-libelf-test.c \ + test-elf_cntl_gelf_getshdr.c test-flag-nobits.c test-nlist.c \ + typeiter.c typeiter2.c unit-info.c update1.c update2.c \ +- update3.c update4.c varlocs.c vdsosyms.c vendorelf.c zstrptr.c ++ update3.c update4.c varlocs.c vdsosyms.c vendorelf.c \ ++ xlate_notes.c zstrptr.c + DIST_SOURCES = addrcfi.c addrscopes.c addsections.c aggregate_size.c \ + all-dwarf-ranges.c alldts.c allfcts.c allregs.c arextract.c \ + arls.c arsymtest.c asm-tst1.c asm-tst2.c asm-tst3.c asm-tst4.c \ +@@ -752,7 +756,8 @@ + showptable.c strptr.c system-elf-libelf-test.c \ + test-elf_cntl_gelf_getshdr.c test-flag-nobits.c test-nlist.c \ + typeiter.c typeiter2.c unit-info.c update1.c update2.c \ +- update3.c update4.c varlocs.c vdsosyms.c vendorelf.c zstrptr.c ++ update3.c update4.c varlocs.c vdsosyms.c vendorelf.c \ ++ xlate_notes.c zstrptr.c + am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ +@@ -1405,7 +1410,8 @@ + testfile-debug-rel-ppc64-g.o.bz2 \ + testfile-debug-rel-ppc64-z.o.bz2 \ + testfile-debug-rel-ppc64.o.bz2 \ +- run-strip-version.sh testfile-version.bz2 ++ run-strip-version.sh testfile-version.bz2 \ ++ run-xlate-note.sh + + @USE_VALGRIND_TRUE@valgrind_cmd = 'valgrind -q --leak-check=full --error-exitcode=1' + installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir); \ +@@ -1559,6 +1565,7 @@ + next_cfi_LDADD = $(libelf) $(libdw) + elfcopy_LDADD = $(libelf) + addsections_LDADD = $(libelf) ++xlate_notes_LDADD = $(libelf) + + # We want to test the libelf header against the system elf.h header. + # Don't include any -I CPPFLAGS. Except when we install our own elf.h. +@@ -2011,6 +2018,10 @@ + @rm -f vendorelf$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(vendorelf_OBJECTS) $(vendorelf_LDADD) $(LIBS) + ++xlate_notes$(EXEEXT): $(xlate_notes_OBJECTS) $(xlate_notes_DEPENDENCIES) $(EXTRA_xlate_notes_DEPENDENCIES) ++ @rm -f xlate_notes$(EXEEXT) ++ $(AM_V_CCLD)$(LINK) $(xlate_notes_OBJECTS) $(xlate_notes_LDADD) $(LIBS) ++ + zstrptr$(EXEEXT): $(zstrptr_OBJECTS) $(zstrptr_DEPENDENCIES) $(EXTRA_zstrptr_DEPENDENCIES) + @rm -f zstrptr$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(zstrptr_OBJECTS) $(zstrptr_LDADD) $(LIBS) +@@ -2124,6 +2135,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varlocs.Po@am__quote@ # am--include-marker + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vdsosyms.Po@am__quote@ # am--include-marker + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vendorelf.Po@am__quote@ # am--include-marker ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlate_notes.Po@am__quote@ # am--include-marker + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zstrptr.Po@am__quote@ # am--include-marker + + $(am__depfiles_remade): +@@ -3732,6 +3744,13 @@ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) ++run-xlate-note.sh.log: run-xlate-note.sh ++ @p='run-xlate-note.sh'; \ ++ b='run-xlate-note.sh'; \ ++ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ ++ --log-file $$b.log --trs-file $$b.trs \ ++ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ ++ "$$tst" $(AM_TESTS_FD_REDIRECT) + msg_tst.log: msg_tst$(EXEEXT) + @p='msg_tst$(EXEEXT)'; \ + b='msg_tst'; \ +@@ -4027,6 +4046,7 @@ + -rm -f ./$(DEPDIR)/varlocs.Po + -rm -f ./$(DEPDIR)/vdsosyms.Po + -rm -f ./$(DEPDIR)/vendorelf.Po ++ -rm -f ./$(DEPDIR)/xlate_notes.Po + -rm -f ./$(DEPDIR)/zstrptr.Po + -rm -f Makefile + distclean-am: clean-am distclean-compile distclean-generic \ +@@ -4176,6 +4196,7 @@ + -rm -f ./$(DEPDIR)/varlocs.Po + -rm -f ./$(DEPDIR)/vdsosyms.Po + -rm -f ./$(DEPDIR)/vendorelf.Po ++ -rm -f ./$(DEPDIR)/xlate_notes.Po + -rm -f ./$(DEPDIR)/zstrptr.Po + -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic diff --git a/elfutils.spec b/elfutils.spec index 0399d48..69035a8 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.176 -%global baserelease 1 +%global baserelease 2 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -21,6 +21,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches Patch1: elfutils-0.176-gcc-pr88835.patch Patch2: elfutils-0.176-pt-gnu-prop.patch +Patch3: elfutils-0.176-xlate-note.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -184,6 +185,7 @@ profiling) of processes. # Apply patches %patch1 -p1 -b .gcc-pr88835 %patch2 -p1 -b .pt-gnu-prop +%patch3 -p1 -b .xlate-note # In case the above patches added any new test scripts, make sure they # are executable. @@ -316,9 +318,10 @@ fi %endif %changelog -* Tue Apr 30 2019 Mark Wielaard +* Tue Apr 30 2019 Mark Wielaard - 0.176-2 - Update elfutils-0.176-gcc-pr88835.patch. - Add elfutils-0.176-pt-gnu-prop.patch +- Add elfutils-0.176-xlate-note.patch * Fri Feb 15 2019 Mark Wielaard - 0.176-1 - New upstream release. From 4fc3adb8b0d11d5025939c4a2e44d861652a501b Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 3 Jun 2019 15:02:04 +0200 Subject: [PATCH 093/216] 0.176-3 - Add elfutils-0.176-elf-update.patch --- elfutils-0.176-elf-update.patch | 652 ++++++++++++++++++++++++++++++++ elfutils.spec | 8 +- 2 files changed, 659 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.176-elf-update.patch diff --git a/elfutils-0.176-elf-update.patch b/elfutils-0.176-elf-update.patch new file mode 100644 index 0000000..f11f13c --- /dev/null +++ b/elfutils-0.176-elf-update.patch @@ -0,0 +1,652 @@ +commit d7193bd7c9dc2a979352eee7fc446dacd3e97779 +Author: Mark Wielaard +Date: Sun May 12 00:37:45 2019 +0200 + + libelf: Mark shdr_flags dirty if offset or size changes during update. + + We forgot to mark the shdr_flags dirty when only the sh_size or + sh_offset changed during elf_update (). This meant that if there were + no other shdr changes we only wrote out the section data, but didn't + write out the shdr table to the file. + + Add a testcase that puts some sections in the reverse order and then + writes out the resulting file again without doing any other + updates. This would show the issue after write out of the + (re-reversed) ELF file (the .shstrtab section offset would be wrong + causing all section names to be garbage). Also run a self test. + + Signed-off-by: Mark Wielaard + +diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c +index 2ce6a59..303055a 100644 +--- a/libelf/elf32_updatenull.c ++++ b/libelf/elf32_updatenull.c +@@ -366,12 +366,15 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum) + } + + /* See whether the section size is correct. */ ++ int size_changed = 0; + update_if_changed (shdr->sh_size, (GElf_Word) offset, +- changed); ++ size_changed); ++ changed |= size_changed; + + if (shdr->sh_type != SHT_NOBITS) + size += offset; + ++ scn->shdr_flags |= (offset_changed | size_changed); + scn->flags |= changed; + } + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 80900e4..87428aa 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -60,7 +60,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \ + fillfile dwarf_default_lower_bound dwarf-die-addr-die \ + get-units-invalid get-units-split attr-integrate-skel \ + all-dwarf-ranges unit-info next_cfi \ +- elfcopy addsections xlate_notes ++ elfcopy addsections xlate_notes elfrdwrnop + + asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ + asm-tst6 asm-tst7 asm-tst8 asm-tst9 +@@ -157,6 +157,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \ + run-all-dwarf-ranges.sh run-unit-info.sh \ + run-reloc-bpf.sh \ + run-next-cfi.sh run-next-cfi-self.sh \ ++ run-reverse-sections.sh run-reverse-sections-self.sh \ + run-copyadd-sections.sh run-copymany-sections.sh \ + run-typeiter-many.sh run-strip-test-many.sh \ + run-strip-version.sh run-xlate-note.sh +@@ -419,6 +420,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ + run-unit-info.sh run-next-cfi.sh run-next-cfi-self.sh \ + testfile-riscv64.bz2 testfile-riscv64-s.bz2 \ + testfile-riscv64-core.bz2 \ ++ run-reverse-sections.sh run-reverse-sections-self.sh \ + run-copyadd-sections.sh run-copymany-sections.sh \ + run-typeiter-many.sh run-strip-test-many.sh \ + testfile-debug-rel-ppc64-g.o.bz2 \ +@@ -598,6 +600,7 @@ next_cfi_LDADD = $(libelf) $(libdw) + elfcopy_LDADD = $(libelf) + addsections_LDADD = $(libelf) + xlate_notes_LDADD = $(libelf) ++elfrdwrnop_LDADD = $(libelf) + + # We want to test the libelf header against the system elf.h header. + # Don't include any -I CPPFLAGS. Except when we install our own elf.h. +diff --git a/tests/elfcopy.c b/tests/elfcopy.c +index 9000cc9..d457bad 100644 +--- a/tests/elfcopy.c ++++ b/tests/elfcopy.c +@@ -69,9 +69,11 @@ setshstrndx (Elf *elf, size_t ndx) + + /* Copies all elements of an ELF file either using mmap or read. */ + static void +-copy_elf (const char *in, const char *out, bool use_mmap) ++copy_elf (const char *in, const char *out, bool use_mmap, bool reverse_offs) + { +- printf ("\ncopy_elf: %s -> %s (%s)\n", in, out, use_mmap ? "mmap" : "read"); ++ printf ("\ncopy_elf: %s -> %s (%s,%s)\n", in, out, ++ use_mmap ? "mmap" : "read", ++ reverse_offs ? "reverse" : "same"); + + /* Existing ELF file. */ + int fda = open (in, O_RDONLY); +@@ -182,8 +184,28 @@ copy_elf (const char *in, const char *out, bool use_mmap) + } + } + ++ GElf_Off *offs = NULL; ++ size_t shnum; ++ if (reverse_offs) ++ { ++ if (elf_getshdrnum (elfa, &shnum) < 0) ++ { ++ printf ("couldn't get shdrnum: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ offs = (GElf_Off *) malloc (shnum * sizeof (GElf_Off)); ++ if (offs == NULL) ++ { ++ printf ("couldn't allocate memory for offs\n"); ++ exit (1); ++ } ++ } ++ + /* Copy all sections, headers and data. */ + Elf_Scn *scn = NULL; ++ size_t last_off = 0; ++ GElf_Shdr last_shdr = { .sh_type = SHT_NULL }; + while ((scn = elf_nextscn (elfa, scn)) != NULL) + { + /* Get the header. */ +@@ -194,6 +216,34 @@ copy_elf (const char *in, const char *out, bool use_mmap) + exit (1); + } + ++ if (reverse_offs) ++ { ++ offs[last_off] = shdr.sh_offset; ++ ++ if (last_shdr.sh_type != SHT_NULL ++ && last_shdr.sh_addralign == shdr.sh_addralign ++ && shdr.sh_addralign == 1 ++ && last_shdr.sh_type != SHT_NOBITS ++ && shdr.sh_type != SHT_NOBITS ++ && (phnum == 0 ++ || ((shdr.sh_flags & SHF_ALLOC) == 0 ++ && (last_shdr.sh_flags & SHF_ALLOC) == 0))) ++ { ++ printf ("Swapping offsets of section %zd and %zd\n", ++ last_off, last_off + 1); ++ GElf_Word off = offs[last_off - 1]; ++ offs[last_off - 1] = off + shdr.sh_size; ++ offs[last_off] = off; ++ last_shdr.sh_type = SHT_NULL; ++ } ++ else ++ { ++ last_shdr = shdr; ++ offs[last_off] = shdr.sh_offset; ++ } ++ last_off++; ++ } ++ + /* Create new section. */ + Elf_Scn *new_scn = elf_newscn (elfb); + if (new_scn == NULL) +@@ -223,9 +273,34 @@ copy_elf (const char *in, const char *out, bool use_mmap) + } + } + +- /* Write everything to disk. If there are any phdrs then we want +- the exact same layout. Do we want ELF_F_PERMISSIVE? */ +- if (phnum > 0) ++ if (reverse_offs) ++ { ++ last_off = 0; ++ scn = NULL; ++ while ((scn = elf_nextscn (elfb, scn)) != NULL) ++ { ++ GElf_Shdr shdr; ++ if (gelf_getshdr (scn, &shdr) == NULL) ++ { ++ printf ("couldn't get shdr for updating: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ shdr.sh_offset = offs[last_off++]; ++ ++ if (gelf_update_shdr (scn, &shdr) == 0) ++ { ++ printf ("couldn't update shdr sh_off: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ } ++ free (offs); ++ } ++ ++ /* Write everything to disk. If there are any phdrs, or we want to ++ update the offsets, then we want the exact same layout. Do we ++ want ELF_F_PERMISSIVE? */ ++ if (phnum > 0 || reverse_offs) + elf_flagelf (elfb, ELF_C_SET, ELF_F_LAYOUT); + if (elf_update (elfb, ELF_C_WRITE) < 0) + { +@@ -264,9 +339,9 @@ main (int argc, const char *argv[]) + elf_version (EV_CURRENT); + + /* Takes the given file, and create a new identical one. */ +- if (argc < 3 || argc > 4) ++ if (argc < 3 || argc > 5) + { +- fprintf (stderr, "elfcopy [--mmap] in.elf out.elf\n"); ++ fprintf (stderr, "elfcopy [--mmap] [--reverse-offs] in.elf out.elf\n"); + exit (1); + } + +@@ -278,9 +353,16 @@ main (int argc, const char *argv[]) + argn++; + } + ++ bool reverse_offs = false; ++ if (strcmp (argv[argn], "--reverse-offs") == 0) ++ { ++ reverse_offs = true; ++ argn++; ++ } ++ + const char *in = argv[argn++]; + const char *out = argv[argn]; +- copy_elf (in, out, use_mmap); ++ copy_elf (in, out, use_mmap, reverse_offs); + + return 0; + } +diff --git a/tests/elfrdwrnop.c b/tests/elfrdwrnop.c +new file mode 100644 +index 0000000..997150b +--- /dev/null ++++ b/tests/elfrdwrnop.c +@@ -0,0 +1,100 @@ ++/* Test program for reading and writing out the same file in-place ++ Copyright (C) 2019 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 . */ ++ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ELFUTILS_HEADER(elf) ++#include ++ ++ ++int ++main (int argc, const char *argv[]) ++{ ++ /* Takes the given file, and create a new identical one. */ ++ if (argc != 2) ++ { ++ fprintf (stderr, "elfrdwrnop elf-file\n"); ++ exit (1); ++ } ++ ++ elf_version (EV_CURRENT); ++ ++ const char *name = argv[1]; ++ printf ("elfrdwrdnop %s\n", name); ++ ++ int fd = open (name, O_RDWR); ++ if (fd < 0) ++ { ++ fprintf (stderr, "Couldn't open file '%s': %s\n", ++ name, strerror (errno)); ++ exit (1); ++ } ++ ++ Elf *elf = elf_begin (fd, ELF_C_RDWR, NULL); ++ if (elf == NULL) ++ { ++ fprintf (stderr, "Couldn't open ELF file '%s': %s\n", ++ name, elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ /* Write everything to disk. If there are any phdrs, then we want ++ the exact same layout. */ ++ size_t phnum; ++ if (elf_getphdrnum (elf, &phnum) != 0) ++ { ++ printf ("cannot get phdrs: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ if (phnum > 0) ++ elf_flagelf (elf, ELF_C_SET, ELF_F_LAYOUT); ++ ++ if (elf_update (elf, ELF_C_WRITE) < 0) ++ { ++ printf ("failure in elf_update: %s\n", elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ if (elf_end (elf) != 0) ++ { ++ printf ("couldn't cleanup elf '%s': %s\n", name, elf_errmsg (-1)); ++ exit (1); ++ } ++ ++ if (close (fd) != 0) ++ { ++ printf ("couldn't close '%s': %s\n", name, strerror (errno)); ++ exit (1); ++ } ++ ++ return 0; ++} +diff --git a/tests/run-reverse-sections-self.sh b/tests/run-reverse-sections-self.sh +new file mode 100755 +index 0000000..71afd6a +--- /dev/null ++++ b/tests/run-reverse-sections-self.sh +@@ -0,0 +1,45 @@ ++#! /bin/sh ++# Copyright (C) 2019 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_reverse_self () ++{ ++ in_file="$1" ++ base_name="$(basename ${in_file})" ++ out_file="${base_name}.rev" ++ out_file_mmap="${out_file}.mmap" ++ ++ tempfiles ${out_file} ${out_file_mmap} ++ ++ # Reverse the offsets (the files should still be the same otherwise) ++ testrun ${abs_builddir}/elfcopy --reverse-offs ${in_file} ${out_file} ++ testrun ${abs_top_builddir}/src/elfcmp ${in_file} ${out_file} ++ testrun ${abs_top_builddir}/src/elflint --gnu ${out_file} ++ # An in-place nop will likely revert them back ++ testrun ${abs_builddir}/elfrdwrnop ${out_file} ++ testrun ${abs_top_builddir}/src/elfcmp ${in_file} ${out_file} ++ testrun ${abs_top_builddir}/src/elflint --gnu ${out_file} ++} ++ ++# Only really makes sense for ET_REL files, but try all, just to check ++# it also works if we keep the order for the allocated sections. ++for file in $self_test_files; do ++ test_reverse_self $file ++done ++ ++exit 0 +diff --git a/tests/run-reverse-sections.sh b/tests/run-reverse-sections.sh +new file mode 100755 +index 0000000..102a126 +--- /dev/null ++++ b/tests/run-reverse-sections.sh +@@ -0,0 +1,69 @@ ++#! /bin/sh ++# Copyright (C) 2019 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_reverse () ++{ ++ in_file="$1" ++ out_file="${in_file}.rev" ++ out_file_mmap="${out_file}.mmap" ++ ++ testfiles ${in_file} ++ tempfiles ${out_file} ${out_file_mmap} ++ ++ # Reverse the offsets (the files should still be the same otherwise) ++ testrun ${abs_builddir}/elfcopy --reverse-offs ${in_file} ${out_file} ++ testrun ${abs_top_builddir}/src/elfcmp ${in_file} ${out_file} ++ testrun ${abs_top_builddir}/src/elflint --gnu ${out_file} ++ # An in-place nop will likely revert them back ++ testrun ${abs_builddir}/elfrdwrnop ${out_file} ++ testrun ${abs_top_builddir}/src/elfcmp ${in_file} ${out_file} ++ testrun ${abs_top_builddir}/src/elflint --gnu ${out_file} ++} ++ ++# A collection of random testfiles to test 32/64bit, little/big endian ++# and non-ET_REL (with phdrs)/ET_REL (without phdrs). ++ ++# 32bit, big endian, rel ++test_reverse testfile29 ++ ++# 64bit, big endian, rel ++test_reverse testfile23 ++ ++# 32bit, little endian, rel ++test_reverse testfile9 ++ ++# 64bit, little endian, rel ++test_reverse testfile38 ++ ++# 32bit, big endian, non-rel ++test_reverse testfile26 ++ ++# 64bit, big endian, non-rel ++test_reverse testfile27 ++ ++# 32bit, little endian, non-rel ++test_reverse testfile ++ ++# 64bit, little endian, non-rel ++# Don't use testfile10. It has section headers in the middle of the file. ++# Same for testfile12. It is legal, but not the point of this testcase. ++# test_reverse testfile10 ++test_reverse testfile13 ++ ++exit 0 +diff -ru elfutils-0.176.orig/tests/Makefile.in elfutils-0.176/tests/Makefile.in +--- elfutils-0.176.orig/tests/Makefile.in 2019-06-03 14:57:17.223607024 +0200 ++++ elfutils-0.176/tests/Makefile.in 2019-06-03 14:58:32.671049626 +0200 +@@ -131,8 +131,8 @@ + get-units-invalid$(EXEEXT) get-units-split$(EXEEXT) \ + attr-integrate-skel$(EXEEXT) all-dwarf-ranges$(EXEEXT) \ + unit-info$(EXEEXT) next_cfi$(EXEEXT) elfcopy$(EXEEXT) \ +- addsections$(EXEEXT) xlate_notes$(EXEEXT) $(am__EXEEXT_1) \ +- $(am__EXEEXT_2) $(am__EXEEXT_4) ++ addsections$(EXEEXT) xlate_notes$(EXEEXT) elfrdwrnop$(EXEEXT) \ ++ $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4) + @BIARCH_TRUE@am__append_5 = backtrace-child-biarch + TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile$(EXEEXT) \ + test-nlist$(EXEEXT) update1$(EXEEXT) update2$(EXEEXT) \ +@@ -209,7 +209,8 @@ + run-get-units-invalid.sh run-get-units-split.sh \ + run-attr-integrate-skel.sh run-all-dwarf-ranges.sh \ + run-unit-info.sh run-reloc-bpf.sh run-next-cfi.sh \ +- run-next-cfi-self.sh run-copyadd-sections.sh \ ++ run-next-cfi-self.sh run-reverse-sections.sh \ ++ run-reverse-sections-self.sh run-copyadd-sections.sh \ + run-copymany-sections.sh run-typeiter-many.sh \ + run-strip-test-many.sh run-strip-version.sh run-xlate-note.sh \ + $(am__EXEEXT_2) $(am__append_8) $(am__EXEEXT_5) +@@ -451,6 +452,9 @@ + elfputzdata_SOURCES = elfputzdata.c + elfputzdata_OBJECTS = elfputzdata.$(OBJEXT) + elfputzdata_DEPENDENCIES = $(am__DEPENDENCIES_2) ++elfrdwrnop_SOURCES = elfrdwrnop.c ++elfrdwrnop_OBJECTS = elfrdwrnop.$(OBJEXT) ++elfrdwrnop_DEPENDENCIES = $(am__DEPENDENCIES_2) + elfshphehdr_SOURCES = elfshphehdr.c + elfshphehdr_OBJECTS = elfshphehdr.$(OBJEXT) + elfshphehdr_DEPENDENCIES = $(am__DEPENDENCIES_2) +@@ -660,13 +664,13 @@ + ./$(DEPDIR)/early-offscn.Po ./$(DEPDIR)/ecp.Po \ + ./$(DEPDIR)/elfcopy.Po ./$(DEPDIR)/elfgetchdr.Po \ + ./$(DEPDIR)/elfgetzdata.Po ./$(DEPDIR)/elfputzdata.Po \ +- ./$(DEPDIR)/elfshphehdr.Po ./$(DEPDIR)/elfstrmerge.Po \ +- ./$(DEPDIR)/elfstrtab.Po ./$(DEPDIR)/emptyfile.Po \ +- ./$(DEPDIR)/fillfile.Po ./$(DEPDIR)/find-prologues.Po \ +- ./$(DEPDIR)/funcretval.Po ./$(DEPDIR)/funcscopes.Po \ +- ./$(DEPDIR)/get-aranges.Po ./$(DEPDIR)/get-files.Po \ +- ./$(DEPDIR)/get-lines.Po ./$(DEPDIR)/get-pubnames.Po \ +- ./$(DEPDIR)/get-units-invalid.Po \ ++ ./$(DEPDIR)/elfrdwrnop.Po ./$(DEPDIR)/elfshphehdr.Po \ ++ ./$(DEPDIR)/elfstrmerge.Po ./$(DEPDIR)/elfstrtab.Po \ ++ ./$(DEPDIR)/emptyfile.Po ./$(DEPDIR)/fillfile.Po \ ++ ./$(DEPDIR)/find-prologues.Po ./$(DEPDIR)/funcretval.Po \ ++ ./$(DEPDIR)/funcscopes.Po ./$(DEPDIR)/get-aranges.Po \ ++ ./$(DEPDIR)/get-files.Po ./$(DEPDIR)/get-lines.Po \ ++ ./$(DEPDIR)/get-pubnames.Po ./$(DEPDIR)/get-units-invalid.Po \ + ./$(DEPDIR)/get-units-split.Po ./$(DEPDIR)/getsrc_die.Po \ + ./$(DEPDIR)/hash.Po ./$(DEPDIR)/line2addr.Po \ + ./$(DEPDIR)/low_high_pc.Po ./$(DEPDIR)/msg_tst.Po \ +@@ -718,19 +722,19 @@ + dwfl-bug-getmodules.c dwfl-bug-report.c dwfl-proc-attach.c \ + dwfl-report-elf-align.c dwfllines.c dwflmodtest.c dwflsyms.c \ + early-offscn.c ecp.c elfcopy.c elfgetchdr.c elfgetzdata.c \ +- elfputzdata.c elfshphehdr.c elfstrmerge.c elfstrtab.c \ +- emptyfile.c fillfile.c find-prologues.c funcretval.c \ +- funcscopes.c get-aranges.c get-files.c get-lines.c \ +- get-pubnames.c get-units-invalid.c get-units-split.c \ +- getsrc_die.c hash.c line2addr.c low_high_pc.c msg_tst.c \ +- newdata.c newfile.c newscn.c next-files.c next-lines.c \ +- next_cfi.c peel_type.c rdwrmmap.c rerequest_tag.c saridx.c \ +- scnnames.c sectiondump.c show-abbrev.c show-die-info.c \ +- showptable.c strptr.c system-elf-libelf-test.c \ +- test-elf_cntl_gelf_getshdr.c test-flag-nobits.c test-nlist.c \ +- typeiter.c typeiter2.c unit-info.c update1.c update2.c \ +- update3.c update4.c varlocs.c vdsosyms.c vendorelf.c \ +- xlate_notes.c zstrptr.c ++ elfputzdata.c elfrdwrnop.c elfshphehdr.c elfstrmerge.c \ ++ elfstrtab.c emptyfile.c fillfile.c find-prologues.c \ ++ funcretval.c funcscopes.c get-aranges.c get-files.c \ ++ get-lines.c get-pubnames.c get-units-invalid.c \ ++ get-units-split.c getsrc_die.c hash.c line2addr.c \ ++ low_high_pc.c msg_tst.c newdata.c newfile.c newscn.c \ ++ next-files.c next-lines.c next_cfi.c peel_type.c rdwrmmap.c \ ++ rerequest_tag.c saridx.c scnnames.c sectiondump.c \ ++ show-abbrev.c show-die-info.c showptable.c strptr.c \ ++ system-elf-libelf-test.c test-elf_cntl_gelf_getshdr.c \ ++ test-flag-nobits.c test-nlist.c typeiter.c typeiter2.c \ ++ unit-info.c update1.c update2.c update3.c update4.c varlocs.c \ ++ vdsosyms.c vendorelf.c xlate_notes.c zstrptr.c + DIST_SOURCES = addrcfi.c addrscopes.c addsections.c aggregate_size.c \ + all-dwarf-ranges.c alldts.c allfcts.c allregs.c arextract.c \ + arls.c arsymtest.c asm-tst1.c asm-tst2.c asm-tst3.c asm-tst4.c \ +@@ -745,19 +749,19 @@ + dwfl-bug-getmodules.c dwfl-bug-report.c dwfl-proc-attach.c \ + dwfl-report-elf-align.c dwfllines.c dwflmodtest.c dwflsyms.c \ + early-offscn.c ecp.c elfcopy.c elfgetchdr.c elfgetzdata.c \ +- elfputzdata.c elfshphehdr.c elfstrmerge.c elfstrtab.c \ +- emptyfile.c fillfile.c find-prologues.c funcretval.c \ +- funcscopes.c get-aranges.c get-files.c get-lines.c \ +- get-pubnames.c get-units-invalid.c get-units-split.c \ +- getsrc_die.c hash.c line2addr.c low_high_pc.c msg_tst.c \ +- newdata.c newfile.c newscn.c next-files.c next-lines.c \ +- next_cfi.c peel_type.c rdwrmmap.c rerequest_tag.c saridx.c \ +- scnnames.c sectiondump.c show-abbrev.c show-die-info.c \ +- showptable.c strptr.c system-elf-libelf-test.c \ +- test-elf_cntl_gelf_getshdr.c test-flag-nobits.c test-nlist.c \ +- typeiter.c typeiter2.c unit-info.c update1.c update2.c \ +- update3.c update4.c varlocs.c vdsosyms.c vendorelf.c \ +- xlate_notes.c zstrptr.c ++ elfputzdata.c elfrdwrnop.c elfshphehdr.c elfstrmerge.c \ ++ elfstrtab.c emptyfile.c fillfile.c find-prologues.c \ ++ funcretval.c funcscopes.c get-aranges.c get-files.c \ ++ get-lines.c get-pubnames.c get-units-invalid.c \ ++ get-units-split.c getsrc_die.c hash.c line2addr.c \ ++ low_high_pc.c msg_tst.c newdata.c newfile.c newscn.c \ ++ next-files.c next-lines.c next_cfi.c peel_type.c rdwrmmap.c \ ++ rerequest_tag.c saridx.c scnnames.c sectiondump.c \ ++ show-abbrev.c show-die-info.c showptable.c strptr.c \ ++ system-elf-libelf-test.c test-elf_cntl_gelf_getshdr.c \ ++ test-flag-nobits.c test-nlist.c typeiter.c typeiter2.c \ ++ unit-info.c update1.c update2.c update3.c update4.c varlocs.c \ ++ vdsosyms.c vendorelf.c xlate_notes.c zstrptr.c + am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ +@@ -1405,6 +1409,7 @@ + run-unit-info.sh run-next-cfi.sh run-next-cfi-self.sh \ + testfile-riscv64.bz2 testfile-riscv64-s.bz2 \ + testfile-riscv64-core.bz2 \ ++ run-reverse-sections.sh run-reverse-sections-self.sh \ + run-copyadd-sections.sh run-copymany-sections.sh \ + run-typeiter-many.sh run-strip-test-many.sh \ + testfile-debug-rel-ppc64-g.o.bz2 \ +@@ -1566,6 +1571,7 @@ + elfcopy_LDADD = $(libelf) + addsections_LDADD = $(libelf) + xlate_notes_LDADD = $(libelf) ++elfrdwrnop_LDADD = $(libelf) + + # We want to test the libelf header against the system elf.h header. + # Don't include any -I CPPFLAGS. Except when we install our own elf.h. +@@ -1822,6 +1828,10 @@ + @rm -f elfputzdata$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elfputzdata_OBJECTS) $(elfputzdata_LDADD) $(LIBS) + ++elfrdwrnop$(EXEEXT): $(elfrdwrnop_OBJECTS) $(elfrdwrnop_DEPENDENCIES) $(EXTRA_elfrdwrnop_DEPENDENCIES) ++ @rm -f elfrdwrnop$(EXEEXT) ++ $(AM_V_CCLD)$(LINK) $(elfrdwrnop_OBJECTS) $(elfrdwrnop_LDADD) $(LIBS) ++ + elfshphehdr$(EXEEXT): $(elfshphehdr_OBJECTS) $(elfshphehdr_DEPENDENCIES) $(EXTRA_elfshphehdr_DEPENDENCIES) + @rm -f elfshphehdr$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elfshphehdr_OBJECTS) $(elfshphehdr_LDADD) $(LIBS) +@@ -2086,6 +2096,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfgetchdr.Po@am__quote@ # am--include-marker + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfgetzdata.Po@am__quote@ # am--include-marker + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfputzdata.Po@am__quote@ # am--include-marker ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfrdwrnop.Po@am__quote@ # am--include-marker + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfshphehdr.Po@am__quote@ # am--include-marker + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfstrmerge.Po@am__quote@ # am--include-marker + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfstrtab.Po@am__quote@ # am--include-marker +@@ -3709,6 +3720,20 @@ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) ++run-reverse-sections.sh.log: run-reverse-sections.sh ++ @p='run-reverse-sections.sh'; \ ++ b='run-reverse-sections.sh'; \ ++ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ ++ --log-file $$b.log --trs-file $$b.trs \ ++ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ ++ "$$tst" $(AM_TESTS_FD_REDIRECT) ++run-reverse-sections-self.sh.log: run-reverse-sections-self.sh ++ @p='run-reverse-sections-self.sh'; \ ++ b='run-reverse-sections-self.sh'; \ ++ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ ++ --log-file $$b.log --trs-file $$b.trs \ ++ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ ++ "$$tst" $(AM_TESTS_FD_REDIRECT) + run-copyadd-sections.sh.log: run-copyadd-sections.sh + @p='run-copyadd-sections.sh'; \ + b='run-copyadd-sections.sh'; \ +@@ -3997,6 +4022,7 @@ + -rm -f ./$(DEPDIR)/elfgetchdr.Po + -rm -f ./$(DEPDIR)/elfgetzdata.Po + -rm -f ./$(DEPDIR)/elfputzdata.Po ++ -rm -f ./$(DEPDIR)/elfrdwrnop.Po + -rm -f ./$(DEPDIR)/elfshphehdr.Po + -rm -f ./$(DEPDIR)/elfstrmerge.Po + -rm -f ./$(DEPDIR)/elfstrtab.Po +@@ -4147,6 +4173,7 @@ + -rm -f ./$(DEPDIR)/elfgetchdr.Po + -rm -f ./$(DEPDIR)/elfgetzdata.Po + -rm -f ./$(DEPDIR)/elfputzdata.Po ++ -rm -f ./$(DEPDIR)/elfrdwrnop.Po + -rm -f ./$(DEPDIR)/elfshphehdr.Po + -rm -f ./$(DEPDIR)/elfstrmerge.Po + -rm -f ./$(DEPDIR)/elfstrtab.Po diff --git a/elfutils.spec b/elfutils.spec index 69035a8..b57d0f0 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.176 -%global baserelease 2 +%global baserelease 3 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -22,6 +22,7 @@ Source: %{?source_url}%{name}-%{version}.tar.bz2 Patch1: elfutils-0.176-gcc-pr88835.patch Patch2: elfutils-0.176-pt-gnu-prop.patch Patch3: elfutils-0.176-xlate-note.patch +Patch4: elfutils-0.176-elf-update.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -186,6 +187,7 @@ profiling) of processes. %patch1 -p1 -b .gcc-pr88835 %patch2 -p1 -b .pt-gnu-prop %patch3 -p1 -b .xlate-note +%patch4 -p1 -b .elf-update # In case the above patches added any new test scripts, make sure they # are executable. @@ -200,6 +202,7 @@ find . -name \*.sh ! -perm -0100 -print | xargs chmod +x RPM_OPT_FLAGS="${RPM_OPT_FLAGS/-Wall/}" RPM_OPT_FLAGS="${RPM_OPT_FLAGS} -Wformat" + trap 'cat config.log' EXIT %configure CFLAGS="$RPM_OPT_FLAGS -fexceptions" trap '' EXIT @@ -318,6 +321,9 @@ fi %endif %changelog +* Mon Jun 3 2019 Mark Wielaard - 0.176-3 +- Add elfutils-0.176-elf-update.patch + * Tue Apr 30 2019 Mark Wielaard - 0.176-2 - Update elfutils-0.176-gcc-pr88835.patch. - Add elfutils-0.176-pt-gnu-prop.patch From c53934057a84e8210d7561970de1a21cfd38dab3 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 3 Jun 2019 19:24:08 +0200 Subject: [PATCH 094/216] 0.176-3 - Update elfutils-0.176-elf-update.patch --- elfutils-0.176-elf-update.patch | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/elfutils-0.176-elf-update.patch b/elfutils-0.176-elf-update.patch index f11f13c..501c103 100644 --- a/elfutils-0.176-elf-update.patch +++ b/elfutils-0.176-elf-update.patch @@ -650,3 +650,15 @@ diff -ru elfutils-0.176.orig/tests/Makefile.in elfutils-0.176/tests/Makefile.in -rm -f ./$(DEPDIR)/elfshphehdr.Po -rm -f ./$(DEPDIR)/elfstrmerge.Po -rm -f ./$(DEPDIR)/elfstrtab.Po +diff --git a/tests/elfcopy.c b/tests/elfcopy.c +index d457bad..4542222 100644 +--- a/tests/elfcopy.c ++++ b/tests/elfcopy.c +@@ -225,6 +225,7 @@ copy_elf (const char *in, const char *out, bool use_mmap, bool reverse_offs) + && shdr.sh_addralign == 1 + && last_shdr.sh_type != SHT_NOBITS + && shdr.sh_type != SHT_NOBITS ++ && last_shdr.sh_offset + last_shdr.sh_size == shdr.sh_offset + && (phnum == 0 + || ((shdr.sh_flags & SHF_ALLOC) == 0 + && (last_shdr.sh_flags & SHF_ALLOC) == 0))) From 6487c2241f75476830c2a0ac9d7043d5c02f083d Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 5 Jul 2019 14:29:50 +0200 Subject: [PATCH 095/216] 0.176-4 - Add elfutils-0.176-strip-symbols-illformed.patch --- elfutils-0.176-strip-symbols-illformed.patch | 26 ++++++++++++++++++++ elfutils.spec | 5 ++++ 2 files changed, 31 insertions(+) create mode 100644 elfutils-0.176-strip-symbols-illformed.patch diff --git a/elfutils-0.176-strip-symbols-illformed.patch b/elfutils-0.176-strip-symbols-illformed.patch new file mode 100644 index 0000000..a0f22c8 --- /dev/null +++ b/elfutils-0.176-strip-symbols-illformed.patch @@ -0,0 +1,26 @@ +commit f03ac75239e0981deaf4aa18f66f423bcc5ce051 +Author: Mark Wielaard +Date: Wed Mar 27 21:54:06 2019 +0100 + + strip: Files with symbols referring to non-existing sections are illformed + + The check added in commit 4540ea98c "strip: Fix check test for SHN_XINDEX + symbol" was not complete. The (extended) section index should also exist. + If it doesn't exist, mark the file as illformed. + + https://sourceware.org/bugzilla/show_bug.cgi?id=24385 + + Signed-off-by: Mark Wielaard + +diff --git a/src/strip.c b/src/strip.c +index a73009d9..4cd87506 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -1975,6 +1975,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, + && shndxdata->d_buf != NULL); + size_t sidx = (sym->st_shndx != SHN_XINDEX + ? sym->st_shndx : xshndx); ++ elf_assert (sidx < shnum); + sec = shdr_info[sidx].idx; + + if (sec != 0) diff --git a/elfutils.spec b/elfutils.spec index b57d0f0..27d050d 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -23,6 +23,7 @@ Patch1: elfutils-0.176-gcc-pr88835.patch Patch2: elfutils-0.176-pt-gnu-prop.patch Patch3: elfutils-0.176-xlate-note.patch Patch4: elfutils-0.176-elf-update.patch +Patch5: elfutils-0.176-strip-symbols-illformed.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -188,6 +189,7 @@ profiling) of processes. %patch2 -p1 -b .pt-gnu-prop %patch3 -p1 -b .xlate-note %patch4 -p1 -b .elf-update +%patch5 -p1 -b .strip-illformed # In case the above patches added any new test scripts, make sure they # are executable. @@ -321,6 +323,9 @@ fi %endif %changelog +* Fri Jul 5 2019 Mark Wielaard - 0.176-4 +- Add elfutils-0.176-strip-symbols-illformed.patch + * Mon Jun 3 2019 Mark Wielaard - 0.176-3 - Add elfutils-0.176-elf-update.patch From fb8727665cbe3c3321f1fc696a97b5ea06163835 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 5 Jul 2019 14:36:12 +0200 Subject: [PATCH 096/216] 0.176-4 --- elfutils.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 27d050d..125b728 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.176 -%global baserelease 3 +%global baserelease 4 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) From 10427fdc8f624dd260c40906c81badc2fd6e8676 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 24 Jul 2019 23:21:13 +0000 Subject: [PATCH 097/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_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 125b728..91f57ad 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.176 -%global baserelease 4 +%global baserelease 5 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -323,6 +323,9 @@ fi %endif %changelog +* Wed Jul 24 2019 Fedora Release Engineering - 0.176-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + * Fri Jul 5 2019 Mark Wielaard - 0.176-4 - Add elfutils-0.176-strip-symbols-illformed.patch From f49aa7b56a1515b48543689333e437fedc970e11 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 14 Aug 2019 20:16:08 +0200 Subject: [PATCH 098/216] 0.177-1 - New upstream release. - elfclassify: New tool to analyze ELF objects. - readelf: Print DW_AT_data_member_location as decimal offset. Decode DW_AT_discr_list block attributes. - libdw: Add DW_AT_GNU_numerator, DW_AT_GNU_denominator and DW_AT_GNU_bias. - libdwelf: Add dwelf_elf_e_machine_string. dwelf_elf_begin now only returns NULL when there is an error reading or decompressing a file. If the file is not an ELF file an ELF handle of type ELF_K_NONE is returned. - backends: Add support for C-SKY. --- .gitignore | 1 + ....patch => elfutils-0.177-pt-gnu-prop.patch | 0 elfutils.spec | 29 +++++++++++-------- sources | 2 +- 4 files changed, 19 insertions(+), 13 deletions(-) rename elfutils-0.176-pt-gnu-prop.patch => elfutils-0.177-pt-gnu-prop.patch (100%) diff --git a/.gitignore b/.gitignore index 8f51d6c..5f0fc9a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ /elfutils-0.174.tar.bz2 /elfutils-0.175.tar.bz2 /elfutils-0.176.tar.bz2 +/elfutils-0.177.tar.bz2 diff --git a/elfutils-0.176-pt-gnu-prop.patch b/elfutils-0.177-pt-gnu-prop.patch similarity index 100% rename from elfutils-0.176-pt-gnu-prop.patch rename to elfutils-0.177-pt-gnu-prop.patch diff --git a/elfutils.spec b/elfutils.spec index 91f57ad..86c5bb3 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.176 -%global baserelease 5 +Version: 0.177 +%global baserelease 1 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) @@ -19,11 +19,7 @@ Release: %{baserelease}%{?dist} Source: %{?source_url}%{name}-%{version}.tar.bz2 # Patches -Patch1: elfutils-0.176-gcc-pr88835.patch -Patch2: elfutils-0.176-pt-gnu-prop.patch -Patch3: elfutils-0.176-xlate-note.patch -Patch4: elfutils-0.176-elf-update.patch -Patch5: elfutils-0.176-strip-symbols-illformed.patch +Patch1: elfutils-0.177-pt-gnu-prop.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} @@ -185,11 +181,7 @@ profiling) of processes. %setup -q # Apply patches -%patch1 -p1 -b .gcc-pr88835 -%patch2 -p1 -b .pt-gnu-prop -%patch3 -p1 -b .xlate-note -%patch4 -p1 -b .elf-update -%patch5 -p1 -b .strip-illformed +%patch1 -p1 -b .pt-gnu-prop # In case the above patches added any new test scripts, make sure they # are executable. @@ -270,6 +262,7 @@ fi %{_bindir}/eu-unstrip %{_bindir}/eu-make-debug-archive %{_bindir}/eu-elfcompress +%{_bindir}/eu-elfclassify %files libs %{!?_licensedir:%global license %%doc} @@ -323,6 +316,18 @@ fi %endif %changelog +* Wed Aug 14 2019 Mark Wielaard - 0.177-1 +- New upstream release. + - elfclassify: New tool to analyze ELF objects. + - readelf: Print DW_AT_data_member_location as decimal offset. + Decode DW_AT_discr_list block attributes. + - libdw: Add DW_AT_GNU_numerator, DW_AT_GNU_denominator and DW_AT_GNU_bias. + - libdwelf: Add dwelf_elf_e_machine_string. + dwelf_elf_begin now only returns NULL when there is an error + reading or decompressing a file. If the file is not an ELF file + an ELF handle of type ELF_K_NONE is returned. + - backends: Add support for C-SKY. + * Wed Jul 24 2019 Fedora Release Engineering - 0.176-5 - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild diff --git a/sources b/sources index 5277574..14fbdc3 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.176.tar.bz2) = 7f032913be363a43229ded85d495dcf7542b3c85974aaaba0d984228dc9ac1721da3dc388d3fa02325a80940161db7e9ad2c9e4521a424ad8a7d050c0902915b +SHA512 (elfutils-0.177.tar.bz2) = 2779987463a22ed220759e25a09c9a1eb84c0f36db37675136e59aa55c7f8f90b7a7d34ffc4e6a4291d7fa73692a1bd1a303a74270b11d1623b4f9868d19498f From 9c6a7b32653e5a3edc11943491f0dd01bac8d257 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 27 Nov 2019 00:58:49 +0100 Subject: [PATCH 099/216] elfutils 0.178 --- .gitignore | 1 + elfutils-0.176-elf-update.patch | 664 ------------------ elfutils-0.176-gcc-pr88835.patch | 29 - elfutils-0.176-strip-symbols-illformed.patch | 26 - elfutils-0.176-xlate-note.patch | 486 ------------- ....patch => elfutils-0.178-pt-gnu-prop.patch | 0 elfutils.spec | 188 ++++- sources | 2 +- 8 files changed, 152 insertions(+), 1244 deletions(-) delete mode 100644 elfutils-0.176-elf-update.patch delete mode 100644 elfutils-0.176-gcc-pr88835.patch delete mode 100644 elfutils-0.176-strip-symbols-illformed.patch delete mode 100644 elfutils-0.176-xlate-note.patch rename elfutils-0.177-pt-gnu-prop.patch => elfutils-0.178-pt-gnu-prop.patch (100%) diff --git a/.gitignore b/.gitignore index 5f0fc9a..c1e968c 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ /elfutils-0.175.tar.bz2 /elfutils-0.176.tar.bz2 /elfutils-0.177.tar.bz2 +/elfutils-0.178.tar.bz2 diff --git a/elfutils-0.176-elf-update.patch b/elfutils-0.176-elf-update.patch deleted file mode 100644 index 501c103..0000000 --- a/elfutils-0.176-elf-update.patch +++ /dev/null @@ -1,664 +0,0 @@ -commit d7193bd7c9dc2a979352eee7fc446dacd3e97779 -Author: Mark Wielaard -Date: Sun May 12 00:37:45 2019 +0200 - - libelf: Mark shdr_flags dirty if offset or size changes during update. - - We forgot to mark the shdr_flags dirty when only the sh_size or - sh_offset changed during elf_update (). This meant that if there were - no other shdr changes we only wrote out the section data, but didn't - write out the shdr table to the file. - - Add a testcase that puts some sections in the reverse order and then - writes out the resulting file again without doing any other - updates. This would show the issue after write out of the - (re-reversed) ELF file (the .shstrtab section offset would be wrong - causing all section names to be garbage). Also run a self test. - - Signed-off-by: Mark Wielaard - -diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c -index 2ce6a59..303055a 100644 ---- a/libelf/elf32_updatenull.c -+++ b/libelf/elf32_updatenull.c -@@ -366,12 +366,15 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum) - } - - /* See whether the section size is correct. */ -+ int size_changed = 0; - update_if_changed (shdr->sh_size, (GElf_Word) offset, -- changed); -+ size_changed); -+ changed |= size_changed; - - if (shdr->sh_type != SHT_NOBITS) - size += offset; - -+ scn->shdr_flags |= (offset_changed | size_changed); - scn->flags |= changed; - } - -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 80900e4..87428aa 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -60,7 +60,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \ - fillfile dwarf_default_lower_bound dwarf-die-addr-die \ - get-units-invalid get-units-split attr-integrate-skel \ - all-dwarf-ranges unit-info next_cfi \ -- elfcopy addsections xlate_notes -+ elfcopy addsections xlate_notes elfrdwrnop - - asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ - asm-tst6 asm-tst7 asm-tst8 asm-tst9 -@@ -157,6 +157,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \ - run-all-dwarf-ranges.sh run-unit-info.sh \ - run-reloc-bpf.sh \ - run-next-cfi.sh run-next-cfi-self.sh \ -+ run-reverse-sections.sh run-reverse-sections-self.sh \ - run-copyadd-sections.sh run-copymany-sections.sh \ - run-typeiter-many.sh run-strip-test-many.sh \ - run-strip-version.sh run-xlate-note.sh -@@ -419,6 +420,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ - run-unit-info.sh run-next-cfi.sh run-next-cfi-self.sh \ - testfile-riscv64.bz2 testfile-riscv64-s.bz2 \ - testfile-riscv64-core.bz2 \ -+ run-reverse-sections.sh run-reverse-sections-self.sh \ - run-copyadd-sections.sh run-copymany-sections.sh \ - run-typeiter-many.sh run-strip-test-many.sh \ - testfile-debug-rel-ppc64-g.o.bz2 \ -@@ -598,6 +600,7 @@ next_cfi_LDADD = $(libelf) $(libdw) - elfcopy_LDADD = $(libelf) - addsections_LDADD = $(libelf) - xlate_notes_LDADD = $(libelf) -+elfrdwrnop_LDADD = $(libelf) - - # We want to test the libelf header against the system elf.h header. - # Don't include any -I CPPFLAGS. Except when we install our own elf.h. -diff --git a/tests/elfcopy.c b/tests/elfcopy.c -index 9000cc9..d457bad 100644 ---- a/tests/elfcopy.c -+++ b/tests/elfcopy.c -@@ -69,9 +69,11 @@ setshstrndx (Elf *elf, size_t ndx) - - /* Copies all elements of an ELF file either using mmap or read. */ - static void --copy_elf (const char *in, const char *out, bool use_mmap) -+copy_elf (const char *in, const char *out, bool use_mmap, bool reverse_offs) - { -- printf ("\ncopy_elf: %s -> %s (%s)\n", in, out, use_mmap ? "mmap" : "read"); -+ printf ("\ncopy_elf: %s -> %s (%s,%s)\n", in, out, -+ use_mmap ? "mmap" : "read", -+ reverse_offs ? "reverse" : "same"); - - /* Existing ELF file. */ - int fda = open (in, O_RDONLY); -@@ -182,8 +184,28 @@ copy_elf (const char *in, const char *out, bool use_mmap) - } - } - -+ GElf_Off *offs = NULL; -+ size_t shnum; -+ if (reverse_offs) -+ { -+ if (elf_getshdrnum (elfa, &shnum) < 0) -+ { -+ printf ("couldn't get shdrnum: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ offs = (GElf_Off *) malloc (shnum * sizeof (GElf_Off)); -+ if (offs == NULL) -+ { -+ printf ("couldn't allocate memory for offs\n"); -+ exit (1); -+ } -+ } -+ - /* Copy all sections, headers and data. */ - Elf_Scn *scn = NULL; -+ size_t last_off = 0; -+ GElf_Shdr last_shdr = { .sh_type = SHT_NULL }; - while ((scn = elf_nextscn (elfa, scn)) != NULL) - { - /* Get the header. */ -@@ -194,6 +216,34 @@ copy_elf (const char *in, const char *out, bool use_mmap) - exit (1); - } - -+ if (reverse_offs) -+ { -+ offs[last_off] = shdr.sh_offset; -+ -+ if (last_shdr.sh_type != SHT_NULL -+ && last_shdr.sh_addralign == shdr.sh_addralign -+ && shdr.sh_addralign == 1 -+ && last_shdr.sh_type != SHT_NOBITS -+ && shdr.sh_type != SHT_NOBITS -+ && (phnum == 0 -+ || ((shdr.sh_flags & SHF_ALLOC) == 0 -+ && (last_shdr.sh_flags & SHF_ALLOC) == 0))) -+ { -+ printf ("Swapping offsets of section %zd and %zd\n", -+ last_off, last_off + 1); -+ GElf_Word off = offs[last_off - 1]; -+ offs[last_off - 1] = off + shdr.sh_size; -+ offs[last_off] = off; -+ last_shdr.sh_type = SHT_NULL; -+ } -+ else -+ { -+ last_shdr = shdr; -+ offs[last_off] = shdr.sh_offset; -+ } -+ last_off++; -+ } -+ - /* Create new section. */ - Elf_Scn *new_scn = elf_newscn (elfb); - if (new_scn == NULL) -@@ -223,9 +273,34 @@ copy_elf (const char *in, const char *out, bool use_mmap) - } - } - -- /* Write everything to disk. If there are any phdrs then we want -- the exact same layout. Do we want ELF_F_PERMISSIVE? */ -- if (phnum > 0) -+ if (reverse_offs) -+ { -+ last_off = 0; -+ scn = NULL; -+ while ((scn = elf_nextscn (elfb, scn)) != NULL) -+ { -+ GElf_Shdr shdr; -+ if (gelf_getshdr (scn, &shdr) == NULL) -+ { -+ printf ("couldn't get shdr for updating: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ shdr.sh_offset = offs[last_off++]; -+ -+ if (gelf_update_shdr (scn, &shdr) == 0) -+ { -+ printf ("couldn't update shdr sh_off: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ } -+ free (offs); -+ } -+ -+ /* Write everything to disk. If there are any phdrs, or we want to -+ update the offsets, then we want the exact same layout. Do we -+ want ELF_F_PERMISSIVE? */ -+ if (phnum > 0 || reverse_offs) - elf_flagelf (elfb, ELF_C_SET, ELF_F_LAYOUT); - if (elf_update (elfb, ELF_C_WRITE) < 0) - { -@@ -264,9 +339,9 @@ main (int argc, const char *argv[]) - elf_version (EV_CURRENT); - - /* Takes the given file, and create a new identical one. */ -- if (argc < 3 || argc > 4) -+ if (argc < 3 || argc > 5) - { -- fprintf (stderr, "elfcopy [--mmap] in.elf out.elf\n"); -+ fprintf (stderr, "elfcopy [--mmap] [--reverse-offs] in.elf out.elf\n"); - exit (1); - } - -@@ -278,9 +353,16 @@ main (int argc, const char *argv[]) - argn++; - } - -+ bool reverse_offs = false; -+ if (strcmp (argv[argn], "--reverse-offs") == 0) -+ { -+ reverse_offs = true; -+ argn++; -+ } -+ - const char *in = argv[argn++]; - const char *out = argv[argn]; -- copy_elf (in, out, use_mmap); -+ copy_elf (in, out, use_mmap, reverse_offs); - - return 0; - } -diff --git a/tests/elfrdwrnop.c b/tests/elfrdwrnop.c -new file mode 100644 -index 0000000..997150b ---- /dev/null -+++ b/tests/elfrdwrnop.c -@@ -0,0 +1,100 @@ -+/* Test program for reading and writing out the same file in-place -+ Copyright (C) 2019 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 . */ -+ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include ELFUTILS_HEADER(elf) -+#include -+ -+ -+int -+main (int argc, const char *argv[]) -+{ -+ /* Takes the given file, and create a new identical one. */ -+ if (argc != 2) -+ { -+ fprintf (stderr, "elfrdwrnop elf-file\n"); -+ exit (1); -+ } -+ -+ elf_version (EV_CURRENT); -+ -+ const char *name = argv[1]; -+ printf ("elfrdwrdnop %s\n", name); -+ -+ int fd = open (name, O_RDWR); -+ if (fd < 0) -+ { -+ fprintf (stderr, "Couldn't open file '%s': %s\n", -+ name, strerror (errno)); -+ exit (1); -+ } -+ -+ Elf *elf = elf_begin (fd, ELF_C_RDWR, NULL); -+ if (elf == NULL) -+ { -+ fprintf (stderr, "Couldn't open ELF file '%s': %s\n", -+ name, elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ /* Write everything to disk. If there are any phdrs, then we want -+ the exact same layout. */ -+ size_t phnum; -+ if (elf_getphdrnum (elf, &phnum) != 0) -+ { -+ printf ("cannot get phdrs: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ if (phnum > 0) -+ elf_flagelf (elf, ELF_C_SET, ELF_F_LAYOUT); -+ -+ if (elf_update (elf, ELF_C_WRITE) < 0) -+ { -+ printf ("failure in elf_update: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ if (elf_end (elf) != 0) -+ { -+ printf ("couldn't cleanup elf '%s': %s\n", name, elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ if (close (fd) != 0) -+ { -+ printf ("couldn't close '%s': %s\n", name, strerror (errno)); -+ exit (1); -+ } -+ -+ return 0; -+} -diff --git a/tests/run-reverse-sections-self.sh b/tests/run-reverse-sections-self.sh -new file mode 100755 -index 0000000..71afd6a ---- /dev/null -+++ b/tests/run-reverse-sections-self.sh -@@ -0,0 +1,45 @@ -+#! /bin/sh -+# Copyright (C) 2019 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_reverse_self () -+{ -+ in_file="$1" -+ base_name="$(basename ${in_file})" -+ out_file="${base_name}.rev" -+ out_file_mmap="${out_file}.mmap" -+ -+ tempfiles ${out_file} ${out_file_mmap} -+ -+ # Reverse the offsets (the files should still be the same otherwise) -+ testrun ${abs_builddir}/elfcopy --reverse-offs ${in_file} ${out_file} -+ testrun ${abs_top_builddir}/src/elfcmp ${in_file} ${out_file} -+ testrun ${abs_top_builddir}/src/elflint --gnu ${out_file} -+ # An in-place nop will likely revert them back -+ testrun ${abs_builddir}/elfrdwrnop ${out_file} -+ testrun ${abs_top_builddir}/src/elfcmp ${in_file} ${out_file} -+ testrun ${abs_top_builddir}/src/elflint --gnu ${out_file} -+} -+ -+# Only really makes sense for ET_REL files, but try all, just to check -+# it also works if we keep the order for the allocated sections. -+for file in $self_test_files; do -+ test_reverse_self $file -+done -+ -+exit 0 -diff --git a/tests/run-reverse-sections.sh b/tests/run-reverse-sections.sh -new file mode 100755 -index 0000000..102a126 ---- /dev/null -+++ b/tests/run-reverse-sections.sh -@@ -0,0 +1,69 @@ -+#! /bin/sh -+# Copyright (C) 2019 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_reverse () -+{ -+ in_file="$1" -+ out_file="${in_file}.rev" -+ out_file_mmap="${out_file}.mmap" -+ -+ testfiles ${in_file} -+ tempfiles ${out_file} ${out_file_mmap} -+ -+ # Reverse the offsets (the files should still be the same otherwise) -+ testrun ${abs_builddir}/elfcopy --reverse-offs ${in_file} ${out_file} -+ testrun ${abs_top_builddir}/src/elfcmp ${in_file} ${out_file} -+ testrun ${abs_top_builddir}/src/elflint --gnu ${out_file} -+ # An in-place nop will likely revert them back -+ testrun ${abs_builddir}/elfrdwrnop ${out_file} -+ testrun ${abs_top_builddir}/src/elfcmp ${in_file} ${out_file} -+ testrun ${abs_top_builddir}/src/elflint --gnu ${out_file} -+} -+ -+# A collection of random testfiles to test 32/64bit, little/big endian -+# and non-ET_REL (with phdrs)/ET_REL (without phdrs). -+ -+# 32bit, big endian, rel -+test_reverse testfile29 -+ -+# 64bit, big endian, rel -+test_reverse testfile23 -+ -+# 32bit, little endian, rel -+test_reverse testfile9 -+ -+# 64bit, little endian, rel -+test_reverse testfile38 -+ -+# 32bit, big endian, non-rel -+test_reverse testfile26 -+ -+# 64bit, big endian, non-rel -+test_reverse testfile27 -+ -+# 32bit, little endian, non-rel -+test_reverse testfile -+ -+# 64bit, little endian, non-rel -+# Don't use testfile10. It has section headers in the middle of the file. -+# Same for testfile12. It is legal, but not the point of this testcase. -+# test_reverse testfile10 -+test_reverse testfile13 -+ -+exit 0 -diff -ru elfutils-0.176.orig/tests/Makefile.in elfutils-0.176/tests/Makefile.in ---- elfutils-0.176.orig/tests/Makefile.in 2019-06-03 14:57:17.223607024 +0200 -+++ elfutils-0.176/tests/Makefile.in 2019-06-03 14:58:32.671049626 +0200 -@@ -131,8 +131,8 @@ - get-units-invalid$(EXEEXT) get-units-split$(EXEEXT) \ - attr-integrate-skel$(EXEEXT) all-dwarf-ranges$(EXEEXT) \ - unit-info$(EXEEXT) next_cfi$(EXEEXT) elfcopy$(EXEEXT) \ -- addsections$(EXEEXT) xlate_notes$(EXEEXT) $(am__EXEEXT_1) \ -- $(am__EXEEXT_2) $(am__EXEEXT_4) -+ addsections$(EXEEXT) xlate_notes$(EXEEXT) elfrdwrnop$(EXEEXT) \ -+ $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4) - @BIARCH_TRUE@am__append_5 = backtrace-child-biarch - TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile$(EXEEXT) \ - test-nlist$(EXEEXT) update1$(EXEEXT) update2$(EXEEXT) \ -@@ -209,7 +209,8 @@ - run-get-units-invalid.sh run-get-units-split.sh \ - run-attr-integrate-skel.sh run-all-dwarf-ranges.sh \ - run-unit-info.sh run-reloc-bpf.sh run-next-cfi.sh \ -- run-next-cfi-self.sh run-copyadd-sections.sh \ -+ run-next-cfi-self.sh run-reverse-sections.sh \ -+ run-reverse-sections-self.sh run-copyadd-sections.sh \ - run-copymany-sections.sh run-typeiter-many.sh \ - run-strip-test-many.sh run-strip-version.sh run-xlate-note.sh \ - $(am__EXEEXT_2) $(am__append_8) $(am__EXEEXT_5) -@@ -451,6 +452,9 @@ - elfputzdata_SOURCES = elfputzdata.c - elfputzdata_OBJECTS = elfputzdata.$(OBJEXT) - elfputzdata_DEPENDENCIES = $(am__DEPENDENCIES_2) -+elfrdwrnop_SOURCES = elfrdwrnop.c -+elfrdwrnop_OBJECTS = elfrdwrnop.$(OBJEXT) -+elfrdwrnop_DEPENDENCIES = $(am__DEPENDENCIES_2) - elfshphehdr_SOURCES = elfshphehdr.c - elfshphehdr_OBJECTS = elfshphehdr.$(OBJEXT) - elfshphehdr_DEPENDENCIES = $(am__DEPENDENCIES_2) -@@ -660,13 +664,13 @@ - ./$(DEPDIR)/early-offscn.Po ./$(DEPDIR)/ecp.Po \ - ./$(DEPDIR)/elfcopy.Po ./$(DEPDIR)/elfgetchdr.Po \ - ./$(DEPDIR)/elfgetzdata.Po ./$(DEPDIR)/elfputzdata.Po \ -- ./$(DEPDIR)/elfshphehdr.Po ./$(DEPDIR)/elfstrmerge.Po \ -- ./$(DEPDIR)/elfstrtab.Po ./$(DEPDIR)/emptyfile.Po \ -- ./$(DEPDIR)/fillfile.Po ./$(DEPDIR)/find-prologues.Po \ -- ./$(DEPDIR)/funcretval.Po ./$(DEPDIR)/funcscopes.Po \ -- ./$(DEPDIR)/get-aranges.Po ./$(DEPDIR)/get-files.Po \ -- ./$(DEPDIR)/get-lines.Po ./$(DEPDIR)/get-pubnames.Po \ -- ./$(DEPDIR)/get-units-invalid.Po \ -+ ./$(DEPDIR)/elfrdwrnop.Po ./$(DEPDIR)/elfshphehdr.Po \ -+ ./$(DEPDIR)/elfstrmerge.Po ./$(DEPDIR)/elfstrtab.Po \ -+ ./$(DEPDIR)/emptyfile.Po ./$(DEPDIR)/fillfile.Po \ -+ ./$(DEPDIR)/find-prologues.Po ./$(DEPDIR)/funcretval.Po \ -+ ./$(DEPDIR)/funcscopes.Po ./$(DEPDIR)/get-aranges.Po \ -+ ./$(DEPDIR)/get-files.Po ./$(DEPDIR)/get-lines.Po \ -+ ./$(DEPDIR)/get-pubnames.Po ./$(DEPDIR)/get-units-invalid.Po \ - ./$(DEPDIR)/get-units-split.Po ./$(DEPDIR)/getsrc_die.Po \ - ./$(DEPDIR)/hash.Po ./$(DEPDIR)/line2addr.Po \ - ./$(DEPDIR)/low_high_pc.Po ./$(DEPDIR)/msg_tst.Po \ -@@ -718,19 +722,19 @@ - dwfl-bug-getmodules.c dwfl-bug-report.c dwfl-proc-attach.c \ - dwfl-report-elf-align.c dwfllines.c dwflmodtest.c dwflsyms.c \ - early-offscn.c ecp.c elfcopy.c elfgetchdr.c elfgetzdata.c \ -- elfputzdata.c elfshphehdr.c elfstrmerge.c elfstrtab.c \ -- emptyfile.c fillfile.c find-prologues.c funcretval.c \ -- funcscopes.c get-aranges.c get-files.c get-lines.c \ -- get-pubnames.c get-units-invalid.c get-units-split.c \ -- getsrc_die.c hash.c line2addr.c low_high_pc.c msg_tst.c \ -- newdata.c newfile.c newscn.c next-files.c next-lines.c \ -- next_cfi.c peel_type.c rdwrmmap.c rerequest_tag.c saridx.c \ -- scnnames.c sectiondump.c show-abbrev.c show-die-info.c \ -- showptable.c strptr.c system-elf-libelf-test.c \ -- test-elf_cntl_gelf_getshdr.c test-flag-nobits.c test-nlist.c \ -- typeiter.c typeiter2.c unit-info.c update1.c update2.c \ -- update3.c update4.c varlocs.c vdsosyms.c vendorelf.c \ -- xlate_notes.c zstrptr.c -+ elfputzdata.c elfrdwrnop.c elfshphehdr.c elfstrmerge.c \ -+ elfstrtab.c emptyfile.c fillfile.c find-prologues.c \ -+ funcretval.c funcscopes.c get-aranges.c get-files.c \ -+ get-lines.c get-pubnames.c get-units-invalid.c \ -+ get-units-split.c getsrc_die.c hash.c line2addr.c \ -+ low_high_pc.c msg_tst.c newdata.c newfile.c newscn.c \ -+ next-files.c next-lines.c next_cfi.c peel_type.c rdwrmmap.c \ -+ rerequest_tag.c saridx.c scnnames.c sectiondump.c \ -+ show-abbrev.c show-die-info.c showptable.c strptr.c \ -+ system-elf-libelf-test.c test-elf_cntl_gelf_getshdr.c \ -+ test-flag-nobits.c test-nlist.c typeiter.c typeiter2.c \ -+ unit-info.c update1.c update2.c update3.c update4.c varlocs.c \ -+ vdsosyms.c vendorelf.c xlate_notes.c zstrptr.c - DIST_SOURCES = addrcfi.c addrscopes.c addsections.c aggregate_size.c \ - all-dwarf-ranges.c alldts.c allfcts.c allregs.c arextract.c \ - arls.c arsymtest.c asm-tst1.c asm-tst2.c asm-tst3.c asm-tst4.c \ -@@ -745,19 +749,19 @@ - dwfl-bug-getmodules.c dwfl-bug-report.c dwfl-proc-attach.c \ - dwfl-report-elf-align.c dwfllines.c dwflmodtest.c dwflsyms.c \ - early-offscn.c ecp.c elfcopy.c elfgetchdr.c elfgetzdata.c \ -- elfputzdata.c elfshphehdr.c elfstrmerge.c elfstrtab.c \ -- emptyfile.c fillfile.c find-prologues.c funcretval.c \ -- funcscopes.c get-aranges.c get-files.c get-lines.c \ -- get-pubnames.c get-units-invalid.c get-units-split.c \ -- getsrc_die.c hash.c line2addr.c low_high_pc.c msg_tst.c \ -- newdata.c newfile.c newscn.c next-files.c next-lines.c \ -- next_cfi.c peel_type.c rdwrmmap.c rerequest_tag.c saridx.c \ -- scnnames.c sectiondump.c show-abbrev.c show-die-info.c \ -- showptable.c strptr.c system-elf-libelf-test.c \ -- test-elf_cntl_gelf_getshdr.c test-flag-nobits.c test-nlist.c \ -- typeiter.c typeiter2.c unit-info.c update1.c update2.c \ -- update3.c update4.c varlocs.c vdsosyms.c vendorelf.c \ -- xlate_notes.c zstrptr.c -+ elfputzdata.c elfrdwrnop.c elfshphehdr.c elfstrmerge.c \ -+ elfstrtab.c emptyfile.c fillfile.c find-prologues.c \ -+ funcretval.c funcscopes.c get-aranges.c get-files.c \ -+ get-lines.c get-pubnames.c get-units-invalid.c \ -+ get-units-split.c getsrc_die.c hash.c line2addr.c \ -+ low_high_pc.c msg_tst.c newdata.c newfile.c newscn.c \ -+ next-files.c next-lines.c next_cfi.c peel_type.c rdwrmmap.c \ -+ rerequest_tag.c saridx.c scnnames.c sectiondump.c \ -+ show-abbrev.c show-die-info.c showptable.c strptr.c \ -+ system-elf-libelf-test.c test-elf_cntl_gelf_getshdr.c \ -+ test-flag-nobits.c test-nlist.c typeiter.c typeiter2.c \ -+ unit-info.c update1.c update2.c update3.c update4.c varlocs.c \ -+ vdsosyms.c vendorelf.c xlate_notes.c zstrptr.c - am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ -@@ -1405,6 +1409,7 @@ - run-unit-info.sh run-next-cfi.sh run-next-cfi-self.sh \ - testfile-riscv64.bz2 testfile-riscv64-s.bz2 \ - testfile-riscv64-core.bz2 \ -+ run-reverse-sections.sh run-reverse-sections-self.sh \ - run-copyadd-sections.sh run-copymany-sections.sh \ - run-typeiter-many.sh run-strip-test-many.sh \ - testfile-debug-rel-ppc64-g.o.bz2 \ -@@ -1566,6 +1571,7 @@ - elfcopy_LDADD = $(libelf) - addsections_LDADD = $(libelf) - xlate_notes_LDADD = $(libelf) -+elfrdwrnop_LDADD = $(libelf) - - # We want to test the libelf header against the system elf.h header. - # Don't include any -I CPPFLAGS. Except when we install our own elf.h. -@@ -1822,6 +1828,10 @@ - @rm -f elfputzdata$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(elfputzdata_OBJECTS) $(elfputzdata_LDADD) $(LIBS) - -+elfrdwrnop$(EXEEXT): $(elfrdwrnop_OBJECTS) $(elfrdwrnop_DEPENDENCIES) $(EXTRA_elfrdwrnop_DEPENDENCIES) -+ @rm -f elfrdwrnop$(EXEEXT) -+ $(AM_V_CCLD)$(LINK) $(elfrdwrnop_OBJECTS) $(elfrdwrnop_LDADD) $(LIBS) -+ - elfshphehdr$(EXEEXT): $(elfshphehdr_OBJECTS) $(elfshphehdr_DEPENDENCIES) $(EXTRA_elfshphehdr_DEPENDENCIES) - @rm -f elfshphehdr$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(elfshphehdr_OBJECTS) $(elfshphehdr_LDADD) $(LIBS) -@@ -2086,6 +2096,7 @@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfgetchdr.Po@am__quote@ # am--include-marker - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfgetzdata.Po@am__quote@ # am--include-marker - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfputzdata.Po@am__quote@ # am--include-marker -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfrdwrnop.Po@am__quote@ # am--include-marker - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfshphehdr.Po@am__quote@ # am--include-marker - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfstrmerge.Po@am__quote@ # am--include-marker - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfstrtab.Po@am__quote@ # am--include-marker -@@ -3709,6 +3720,20 @@ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -+run-reverse-sections.sh.log: run-reverse-sections.sh -+ @p='run-reverse-sections.sh'; \ -+ b='run-reverse-sections.sh'; \ -+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ -+ --log-file $$b.log --trs-file $$b.trs \ -+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ -+ "$$tst" $(AM_TESTS_FD_REDIRECT) -+run-reverse-sections-self.sh.log: run-reverse-sections-self.sh -+ @p='run-reverse-sections-self.sh'; \ -+ b='run-reverse-sections-self.sh'; \ -+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ -+ --log-file $$b.log --trs-file $$b.trs \ -+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ -+ "$$tst" $(AM_TESTS_FD_REDIRECT) - run-copyadd-sections.sh.log: run-copyadd-sections.sh - @p='run-copyadd-sections.sh'; \ - b='run-copyadd-sections.sh'; \ -@@ -3997,6 +4022,7 @@ - -rm -f ./$(DEPDIR)/elfgetchdr.Po - -rm -f ./$(DEPDIR)/elfgetzdata.Po - -rm -f ./$(DEPDIR)/elfputzdata.Po -+ -rm -f ./$(DEPDIR)/elfrdwrnop.Po - -rm -f ./$(DEPDIR)/elfshphehdr.Po - -rm -f ./$(DEPDIR)/elfstrmerge.Po - -rm -f ./$(DEPDIR)/elfstrtab.Po -@@ -4147,6 +4173,7 @@ - -rm -f ./$(DEPDIR)/elfgetchdr.Po - -rm -f ./$(DEPDIR)/elfgetzdata.Po - -rm -f ./$(DEPDIR)/elfputzdata.Po -+ -rm -f ./$(DEPDIR)/elfrdwrnop.Po - -rm -f ./$(DEPDIR)/elfshphehdr.Po - -rm -f ./$(DEPDIR)/elfstrmerge.Po - -rm -f ./$(DEPDIR)/elfstrtab.Po -diff --git a/tests/elfcopy.c b/tests/elfcopy.c -index d457bad..4542222 100644 ---- a/tests/elfcopy.c -+++ b/tests/elfcopy.c -@@ -225,6 +225,7 @@ copy_elf (const char *in, const char *out, bool use_mmap, bool reverse_offs) - && shdr.sh_addralign == 1 - && last_shdr.sh_type != SHT_NOBITS - && shdr.sh_type != SHT_NOBITS -+ && last_shdr.sh_offset + last_shdr.sh_size == shdr.sh_offset - && (phnum == 0 - || ((shdr.sh_flags & SHF_ALLOC) == 0 - && (last_shdr.sh_flags & SHF_ALLOC) == 0))) diff --git a/elfutils-0.176-gcc-pr88835.patch b/elfutils-0.176-gcc-pr88835.patch deleted file mode 100644 index 455ef26..0000000 --- a/elfutils-0.176-gcc-pr88835.patch +++ /dev/null @@ -1,29 +0,0 @@ -Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88835 - -diff --git a/tests/backtrace.c b/tests/backtrace.c -index 05e8ef8..d621fbf 100644 ---- a/tests/backtrace.c -+++ b/tests/backtrace.c -@@ -185,7 +185,7 @@ frame_callback (Dwfl_Frame *state, void *frame_arg) - symname = dwfl_module_addrname (mod, pc_adjusted); - - printf ("#%2d %#" PRIx64 "%4s\t%s\n", *framenop, (uint64_t) pc, -- ! isactivation ? "- 1" : "", symname); -+ ! isactivation ? "- 1" : "", symname ?: ""); - pid_t tid = dwfl_thread_tid (thread); - callback_verify (tid, *framenop, pc, symname, dwfl); - (*framenop)++; - -diff --git a/tests/backtrace-dwarf.c b/tests/backtrace-dwarf.c -index dfbf185..f446bc3 100644 ---- a/tests/backtrace-dwarf.c -+++ b/tests/backtrace-dwarf.c -@@ -101,7 +101,7 @@ frame_callback (Dwfl_Frame *state, void *frame_arg) - if (mod) - symname = dwfl_module_addrname (mod, pc_adjusted); - -- printf ("%#" PRIx64 "\t%s\n", (uint64_t) pc, symname); -+ printf ("%#" PRIx64 "\t%s\n", (uint64_t) pc, symname ?: ""); - - if (symname && (strcmp (symname, "main") == 0 - || strcmp (symname, ".main") == 0)) diff --git a/elfutils-0.176-strip-symbols-illformed.patch b/elfutils-0.176-strip-symbols-illformed.patch deleted file mode 100644 index a0f22c8..0000000 --- a/elfutils-0.176-strip-symbols-illformed.patch +++ /dev/null @@ -1,26 +0,0 @@ -commit f03ac75239e0981deaf4aa18f66f423bcc5ce051 -Author: Mark Wielaard -Date: Wed Mar 27 21:54:06 2019 +0100 - - strip: Files with symbols referring to non-existing sections are illformed - - The check added in commit 4540ea98c "strip: Fix check test for SHN_XINDEX - symbol" was not complete. The (extended) section index should also exist. - If it doesn't exist, mark the file as illformed. - - https://sourceware.org/bugzilla/show_bug.cgi?id=24385 - - Signed-off-by: Mark Wielaard - -diff --git a/src/strip.c b/src/strip.c -index a73009d9..4cd87506 100644 ---- a/src/strip.c -+++ b/src/strip.c -@@ -1975,6 +1975,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, - && shndxdata->d_buf != NULL); - size_t sidx = (sym->st_shndx != SHN_XINDEX - ? sym->st_shndx : xshndx); -+ elf_assert (sidx < shnum); - sec = shdr_info[sidx].idx; - - if (sec != 0) diff --git a/elfutils-0.176-xlate-note.patch b/elfutils-0.176-xlate-note.patch deleted file mode 100644 index e3bbf48..0000000 --- a/elfutils-0.176-xlate-note.patch +++ /dev/null @@ -1,486 +0,0 @@ -commit 28b5f578ae772bb2404c3847e4e22ad1c407af54 -Author: Mark Wielaard -Date: Tue Apr 30 13:00:17 2019 +0200 - - libelf: If xlate can only convert the ELF note header, just do that. - - When we started parsing new style ELF_T_NHDR8 notes we added extra - checks on alignment and padding. When those failed we would stop - converting and just return the rest of the ELF Note unconverted. - In the case were we just had enough data for just the ELF Note header - and the destionation and source weren't the same we would then - accidentially throw away the Note header conversion we just did. - - Fix that by indicating we did correctly convert just the header. - - Adds testcase that compares parsing ELF notes with gelf_getnote - and parsing the raw data by hand using elf32_xlatetom using just - the Note header and ignoring the (raw) note data. - - Signed-off-by: Mark Wielaard - -diff --git a/libelf/note_xlate.h b/libelf/note_xlate.h -index bc9950f..7e2784b 100644 ---- a/libelf/note_xlate.h -+++ b/libelf/note_xlate.h -@@ -47,13 +47,25 @@ elf_cvt_note (void *dest, const void *src, size_t len, int encode, - note_len += n->n_namesz; - note_len = nhdr8 ? NOTE_ALIGN8 (note_len) : NOTE_ALIGN4 (note_len); - if (note_len > len || note_len < sizeof *n) -- break; -+ { -+ /* Header was translated, nothing else. */ -+ len -= sizeof *n; -+ src += sizeof *n; -+ dest += sizeof *n; -+ break; -+ } - - /* data as a whole needs to be aligned. */ - note_len += n->n_descsz; - note_len = nhdr8 ? NOTE_ALIGN8 (note_len) : NOTE_ALIGN4 (note_len); - if (note_len > len || note_len < sizeof *n) -- break; -+ { -+ /* Header was translated, nothing else. */ -+ len -= sizeof *n; -+ src += sizeof *n; -+ dest += sizeof *n; -+ break; -+ } - - /* Copy or skip the note data. */ - size_t note_data_len = note_len - sizeof *n; -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 1b0c7d3..498c1db 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -60,7 +60,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \ - fillfile dwarf_default_lower_bound dwarf-die-addr-die \ - get-units-invalid get-units-split attr-integrate-skel \ - all-dwarf-ranges unit-info next_cfi \ -- elfcopy addsections -+ elfcopy addsections xlate_notes - - asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ - asm-tst6 asm-tst7 asm-tst8 asm-tst9 -@@ -159,7 +159,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \ - run-next-cfi.sh run-next-cfi-self.sh \ - run-copyadd-sections.sh run-copymany-sections.sh \ - run-typeiter-many.sh run-strip-test-many.sh \ -- run-strip-version.sh -+ run-strip-version.sh run-xlate-note.sh - - if !BIARCH - export ELFUTILS_DISABLE_BIARCH = 1 -@@ -423,7 +423,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ - testfile-debug-rel-ppc64-g.o.bz2 \ - testfile-debug-rel-ppc64-z.o.bz2 \ - testfile-debug-rel-ppc64.o.bz2 \ -- run-strip-version.sh testfile-version.bz2 -+ run-strip-version.sh testfile-version.bz2 \ -+ run-xlate-note.sh - - if USE_VALGRIND - valgrind_cmd='valgrind -q --leak-check=full --error-exitcode=1' -@@ -593,6 +594,7 @@ unit_info_LDADD = $(libdw) - next_cfi_LDADD = $(libelf) $(libdw) - elfcopy_LDADD = $(libelf) - addsections_LDADD = $(libelf) -+xlate_notes_LDADD = $(libelf) - - # We want to test the libelf header against the system elf.h header. - # Don't include any -I CPPFLAGS. Except when we install our own elf.h. -diff --git a/tests/run-xlate-note.sh b/tests/run-xlate-note.sh -new file mode 100755 -index 0000000..a907418 ---- /dev/null -+++ b/tests/run-xlate-note.sh -@@ -0,0 +1,93 @@ -+# Copyright (C) 2019 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 -+ -+testfiles testfileppc32 -+testrun_compare ${abs_top_builddir}/tests/xlate_notes testfileppc32 << EOF -+Notes in section 2: -+type: 1,1, namesz: 4,4, descsz: 16,16 -+Notes in section 3: -+type: 3,3, namesz: 4,4, descsz: 20,20 -+EOF -+ -+testfiles testfileppc64 -+testrun_compare ${abs_top_builddir}/tests/xlate_notes testfileppc64 << EOF -+Notes in section 2: -+type: 1,1, namesz: 4,4, descsz: 16,16 -+Notes in section 3: -+type: 3,3, namesz: 4,4, descsz: 20,20 -+EOF -+ -+testfiles testfiles390 -+testrun_compare ${abs_top_builddir}/tests/xlate_notes testfiles390 << EOF -+Notes in section 2: -+type: 1,1, namesz: 4,4, descsz: 16,16 -+Notes in section 3: -+type: 3,3, namesz: 4,4, descsz: 20,20 -+EOF -+ -+testfiles testfiles390x -+testrun_compare ${abs_top_builddir}/tests/xlate_notes testfiles390x << EOF -+Notes in section 2: -+type: 1,1, namesz: 4,4, descsz: 16,16 -+Notes in section 3: -+type: 3,3, namesz: 4,4, descsz: 20,20 -+EOF -+ -+testfiles testfileaarch64 -+testrun_compare ${abs_top_builddir}/tests/xlate_notes testfileaarch64 << EOF -+Notes in section 2: -+type: 1,1, namesz: 4,4, descsz: 16,16 -+Notes in section 3: -+type: 3,3, namesz: 4,4, descsz: 20,20 -+EOF -+ -+testfiles testfilearm -+testrun_compare ${abs_top_builddir}/tests/xlate_notes testfilearm << EOF -+Notes in section 2: -+type: 1,1, namesz: 4,4, descsz: 16,16 -+Notes in section 3: -+type: 3,3, namesz: 4,4, descsz: 20,20 -+EOF -+ -+testfiles testfile_gnu_props.32be.o -+testrun_compare ${abs_top_builddir}/tests/xlate_notes testfile_gnu_props.32be.o << EOF -+Notes in section 4: -+type: 5,5, namesz: 4,4, descsz: 12,12 -+type: 5,5, namesz: 4,4, descsz: 8,8 -+EOF -+ -+testfiles testfile_gnu_props.32le.o -+testrun_compare ${abs_top_builddir}/tests/xlate_notes testfile_gnu_props.32le.o << EOF -+Notes in section 4: -+type: 5,5, namesz: 4,4, descsz: 12,12 -+type: 5,5, namesz: 4,4, descsz: 8,8 -+EOF -+ -+testfiles testfile_gnu_props.64be.o -+testrun_compare ${abs_top_builddir}/tests/xlate_notes testfile_gnu_props.64be.o << EOF -+Notes in section 4: -+type: 5,5, namesz: 4,4, descsz: 16,16 -+type: 5,5, namesz: 4,4, descsz: 8,8 -+EOF -+ -+testfiles testfile_gnu_props.64le.o -+testrun_compare ${abs_top_builddir}/tests/xlate_notes testfile_gnu_props.64le.o << EOF -+Notes in section 4: -+type: 5,5, namesz: 4,4, descsz: 16,16 -+type: 5,5, namesz: 4,4, descsz: 8,8 -+EOF -diff --git a/tests/xlate_notes.c b/tests/xlate_notes.c -new file mode 100644 -index 0000000..90a4ae2 ---- /dev/null -+++ b/tests/xlate_notes.c -@@ -0,0 +1,157 @@ -+/* Test program for extracting ELF Note headers and getting whole notes. -+ Copyright (C) 2019 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 . */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include ELFUTILS_HEADER(elf) -+#include -+ -+int -+main (int argc, char *argv[]) -+{ -+ if (argc != 2) -+ { -+ printf ("No ELF file given as argument\n"); -+ exit (1); -+ } -+ -+ const char *fname = argv[1]; -+ -+ // Initialize libelf. -+ elf_version (EV_CURRENT); -+ -+ /* Read the ELF from disk now. */ -+ int fd = open (fname, O_RDONLY); -+ if (fd == -1) -+ { -+ printf ("cannot open '%s': %s\n", fname, strerror (errno)); -+ exit (1); -+ } -+ -+ Elf *elf = elf_begin (fd, ELF_C_READ, NULL); -+ if (elf == NULL) -+ { -+ printf ("cannot create ELF descriptor: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ GElf_Ehdr ehdr; -+ if (gelf_getehdr (elf, &ehdr) == NULL) -+ { -+ printf ("cannot get Ehdr: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ /* Search for all SHT_NOTE sections. */ -+ Elf_Scn *scn = NULL; -+ while ((scn = elf_nextscn (elf, scn)) != NULL) -+ { -+ /* Get the header. */ -+ GElf_Shdr shdr; -+ if (gelf_getshdr (scn, &shdr) == NULL) -+ { -+ printf ("couldn't get shdr: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ if (shdr.sh_type == SHT_NOTE) -+ { -+ printf ("Notes in section %zd:\n", elf_ndxscn (scn)); -+ -+ Elf_Data *raw = elf_rawdata (scn, NULL); -+ if (raw == NULL) -+ { -+ printf ("couldn't get raw data: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ Elf_Data *data = elf_getdata (scn, NULL); -+ if (data == NULL) -+ { -+ printf ("couldn't get data: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ size_t off = 0; -+ size_t next; -+ GElf_Nhdr nhdr; -+ size_t n_off; -+ size_t d_off; -+ while ((next = gelf_getnote (data, off, &nhdr, &n_off, &d_off)) > 0) -+ { -+ /* Now just get the note header "raw" (don't -+ copy/translate the note data). This only handles -+ traditional GNU ELF Notes, so we still use the next -+ from gelf_getnote (padding is different for new style -+ ELF_T_NHDR8 notes). */ -+ Elf32_Nhdr nh; -+ Elf_Data src = -+ { -+ .d_version = EV_CURRENT, .d_type = ELF_T_NHDR, -+ .d_size = sizeof nh -+ }; -+ Elf_Data dst = src; -+ src.d_buf = raw->d_buf + off; -+ dst.d_buf = &nh; -+ -+ if (elf32_xlatetom (&dst, &src, ehdr.e_ident[EI_DATA]) == NULL) -+ { -+ printf ("couldn't xlate note: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ printf ("type: %" PRId32 ",%" PRId32 -+ ", namesz: %" PRId32 ",%" PRId32 -+ ", descsz: %" PRId32 ",%" PRId32 "\n", -+ nhdr.n_type, nh.n_type, -+ nhdr.n_namesz, nh.n_namesz, -+ nhdr.n_descsz, nh.n_descsz); -+ -+ if (nhdr.n_type != nh.n_type -+ || nhdr.n_namesz != nh.n_namesz -+ || nhdr.n_descsz != nh.n_descsz) -+ { -+ printf ("Nhdrs not equal!\n"); -+ exit (1); -+ } -+ -+ off = next; -+ } -+ } -+ -+ } -+ -+ if (elf_end (elf) != 0) -+ { -+ printf ("failure in elf_end: %s\n", elf_errmsg (-1)); -+ exit (1); -+ } -+ -+ close (fd); -+ -+ return 0; -+} -diff -ur elfutils-0.176.orig/tests/Makefile.in elfutils-0.176/tests/Makefile.in ---- elfutils-0.176.orig/tests/Makefile.in 2019-04-30 22:42:49.534655124 +0200 -+++ elfutils-0.176/tests/Makefile.in 2019-04-30 22:46:30.046656790 +0200 -@@ -131,8 +131,8 @@ - get-units-invalid$(EXEEXT) get-units-split$(EXEEXT) \ - attr-integrate-skel$(EXEEXT) all-dwarf-ranges$(EXEEXT) \ - unit-info$(EXEEXT) next_cfi$(EXEEXT) elfcopy$(EXEEXT) \ -- addsections$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \ -- $(am__EXEEXT_4) -+ addsections$(EXEEXT) xlate_notes$(EXEEXT) $(am__EXEEXT_1) \ -+ $(am__EXEEXT_2) $(am__EXEEXT_4) - @BIARCH_TRUE@am__append_5 = backtrace-child-biarch - TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile$(EXEEXT) \ - test-nlist$(EXEEXT) update1$(EXEEXT) update2$(EXEEXT) \ -@@ -211,8 +211,8 @@ - run-unit-info.sh run-reloc-bpf.sh run-next-cfi.sh \ - run-next-cfi-self.sh run-copyadd-sections.sh \ - run-copymany-sections.sh run-typeiter-many.sh \ -- run-strip-test-many.sh run-strip-version.sh $(am__EXEEXT_2) \ -- $(am__append_8) $(am__EXEEXT_5) -+ run-strip-test-many.sh run-strip-version.sh run-xlate-note.sh \ -+ $(am__EXEEXT_2) $(am__append_8) $(am__EXEEXT_5) - @STANDALONE_FALSE@am__append_6 = msg_tst system-elf-libelf-test - @STANDALONE_FALSE@am__append_7 = msg_tst system-elf-libelf-test - @LZMA_TRUE@am__append_8 = run-readelf-s.sh run-dwflsyms.sh -@@ -606,6 +606,9 @@ - vendorelf_SOURCES = vendorelf.c - vendorelf_OBJECTS = vendorelf.$(OBJEXT) - vendorelf_DEPENDENCIES = $(am__DEPENDENCIES_2) -+xlate_notes_SOURCES = xlate_notes.c -+xlate_notes_OBJECTS = xlate_notes.$(OBJEXT) -+xlate_notes_DEPENDENCIES = $(am__DEPENDENCIES_2) - zstrptr_SOURCES = zstrptr.c - zstrptr_OBJECTS = zstrptr.$(OBJEXT) - zstrptr_DEPENDENCIES = $(am__DEPENDENCIES_2) -@@ -683,7 +686,7 @@ - ./$(DEPDIR)/update2.Po ./$(DEPDIR)/update3.Po \ - ./$(DEPDIR)/update4.Po ./$(DEPDIR)/varlocs.Po \ - ./$(DEPDIR)/vdsosyms.Po ./$(DEPDIR)/vendorelf.Po \ -- ./$(DEPDIR)/zstrptr.Po -+ ./$(DEPDIR)/xlate_notes.Po ./$(DEPDIR)/zstrptr.Po - am__mv = mv -f - AM_V_lt = $(am__v_lt_@AM_V@) - am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -@@ -726,7 +729,8 @@ - showptable.c strptr.c system-elf-libelf-test.c \ - test-elf_cntl_gelf_getshdr.c test-flag-nobits.c test-nlist.c \ - typeiter.c typeiter2.c unit-info.c update1.c update2.c \ -- update3.c update4.c varlocs.c vdsosyms.c vendorelf.c zstrptr.c -+ update3.c update4.c varlocs.c vdsosyms.c vendorelf.c \ -+ xlate_notes.c zstrptr.c - DIST_SOURCES = addrcfi.c addrscopes.c addsections.c aggregate_size.c \ - all-dwarf-ranges.c alldts.c allfcts.c allregs.c arextract.c \ - arls.c arsymtest.c asm-tst1.c asm-tst2.c asm-tst3.c asm-tst4.c \ -@@ -752,7 +756,8 @@ - showptable.c strptr.c system-elf-libelf-test.c \ - test-elf_cntl_gelf_getshdr.c test-flag-nobits.c test-nlist.c \ - typeiter.c typeiter2.c unit-info.c update1.c update2.c \ -- update3.c update4.c varlocs.c vdsosyms.c vendorelf.c zstrptr.c -+ update3.c update4.c varlocs.c vdsosyms.c vendorelf.c \ -+ xlate_notes.c zstrptr.c - am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ -@@ -1405,7 +1410,8 @@ - testfile-debug-rel-ppc64-g.o.bz2 \ - testfile-debug-rel-ppc64-z.o.bz2 \ - testfile-debug-rel-ppc64.o.bz2 \ -- run-strip-version.sh testfile-version.bz2 -+ run-strip-version.sh testfile-version.bz2 \ -+ run-xlate-note.sh - - @USE_VALGRIND_TRUE@valgrind_cmd = 'valgrind -q --leak-check=full --error-exitcode=1' - installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir); \ -@@ -1559,6 +1565,7 @@ - next_cfi_LDADD = $(libelf) $(libdw) - elfcopy_LDADD = $(libelf) - addsections_LDADD = $(libelf) -+xlate_notes_LDADD = $(libelf) - - # We want to test the libelf header against the system elf.h header. - # Don't include any -I CPPFLAGS. Except when we install our own elf.h. -@@ -2011,6 +2018,10 @@ - @rm -f vendorelf$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(vendorelf_OBJECTS) $(vendorelf_LDADD) $(LIBS) - -+xlate_notes$(EXEEXT): $(xlate_notes_OBJECTS) $(xlate_notes_DEPENDENCIES) $(EXTRA_xlate_notes_DEPENDENCIES) -+ @rm -f xlate_notes$(EXEEXT) -+ $(AM_V_CCLD)$(LINK) $(xlate_notes_OBJECTS) $(xlate_notes_LDADD) $(LIBS) -+ - zstrptr$(EXEEXT): $(zstrptr_OBJECTS) $(zstrptr_DEPENDENCIES) $(EXTRA_zstrptr_DEPENDENCIES) - @rm -f zstrptr$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(zstrptr_OBJECTS) $(zstrptr_LDADD) $(LIBS) -@@ -2124,6 +2135,7 @@ - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varlocs.Po@am__quote@ # am--include-marker - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vdsosyms.Po@am__quote@ # am--include-marker - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vendorelf.Po@am__quote@ # am--include-marker -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlate_notes.Po@am__quote@ # am--include-marker - @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zstrptr.Po@am__quote@ # am--include-marker - - $(am__depfiles_remade): -@@ -3732,6 +3744,13 @@ - --log-file $$b.log --trs-file $$b.trs \ - $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ - "$$tst" $(AM_TESTS_FD_REDIRECT) -+run-xlate-note.sh.log: run-xlate-note.sh -+ @p='run-xlate-note.sh'; \ -+ b='run-xlate-note.sh'; \ -+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ -+ --log-file $$b.log --trs-file $$b.trs \ -+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ -+ "$$tst" $(AM_TESTS_FD_REDIRECT) - msg_tst.log: msg_tst$(EXEEXT) - @p='msg_tst$(EXEEXT)'; \ - b='msg_tst'; \ -@@ -4027,6 +4046,7 @@ - -rm -f ./$(DEPDIR)/varlocs.Po - -rm -f ./$(DEPDIR)/vdsosyms.Po - -rm -f ./$(DEPDIR)/vendorelf.Po -+ -rm -f ./$(DEPDIR)/xlate_notes.Po - -rm -f ./$(DEPDIR)/zstrptr.Po - -rm -f Makefile - distclean-am: clean-am distclean-compile distclean-generic \ -@@ -4176,6 +4196,7 @@ - -rm -f ./$(DEPDIR)/varlocs.Po - -rm -f ./$(DEPDIR)/vdsosyms.Po - -rm -f ./$(DEPDIR)/vendorelf.Po -+ -rm -f ./$(DEPDIR)/xlate_notes.Po - -rm -f ./$(DEPDIR)/zstrptr.Po - -rm -f Makefile - maintainer-clean-am: distclean-am maintainer-clean-generic diff --git a/elfutils-0.177-pt-gnu-prop.patch b/elfutils-0.178-pt-gnu-prop.patch similarity index 100% rename from elfutils-0.177-pt-gnu-prop.patch rename to elfutils-0.178-pt-gnu-prop.patch diff --git a/elfutils.spec b/elfutils.spec index 86c5bb3..d06e0af 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,11 +1,11 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data -Version: 0.177 +Version: 0.178 %global baserelease 1 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ -License: GPLv3+ and (GPLv2+ or LGPLv3+) - +License: GPLv3+ and (GPLv2+ or LGPLv3+) and GFDL +Source: %{?source_url}%{name}-%{version}.tar.bz2 Release: %{baserelease}%{?dist} %global provide_yama_scope 0 @@ -16,36 +16,45 @@ Release: %{baserelease}%{?dist} %global depsuffix %{?_isa}%{!?_isa:-%{_arch}} -Source: %{?source_url}%{name}-%{version}.tar.bz2 - # Patches -Patch1: elfutils-0.177-pt-gnu-prop.patch +Patch1: elfutils-0.178-pt-gnu-prop.patch Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} +%if 0%{?rhel} >= 8 || 0%{?fedora} >= 20 +Recommends: elfutils-debuginfod-client +%else +Requires: elfutils-debuginfod-client +%endif -BuildRequires: gettext -BuildRequires: bison >= 1.875 -BuildRequires: flex >= 2.5.4a -BuildRequires: bzip2 -BuildRequires: gcc >= 4.4 +BuildRequires: gcc # For libstdc++ demangle support BuildRequires: gcc-c++ -BuildRequires: zlib-devel >= 1.2.2.3 +BuildRequires: gettext +BuildRequires: bison +BuildRequires: flex + +# Compression support +BuildRequires: zlib-devel BuildRequires: bzip2-devel BuildRequires: xz-devel +# For debuginfod +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 tests need to bunzip2 test files. +BuildRequires: bzip2 +# For the run-debuginfod-find.sh test case in %check for /usr/sbin/ss +BuildRequires: iproute +BuildRequires: curl + %global _gnu %{nil} %global _program_prefix eu- -# The lib[64]/elfutils directory contains the private ebl backend -# libraries. They must not be exposed as global provides. We don't -# need to filter the requires since they are only loaded with dlopen. -%if 0%{?fedora} >= 15 || 0%{?rhel} >= 7 -%global __provides_exclude ^libebl_.*\\.so.*$ -%endif - %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -54,7 +63,6 @@ strip (for discarding symbols), readelf (to see the raw ELF file structures), elflint (to check for well-formed ELF files) and elfcompress (to compress or decompress ELF sections). - %package libs Summary: Libraries to handle compiled objects License: GPLv2+ or LGPLv3+ @@ -65,12 +73,18 @@ Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} %if %{provide_yama_scope} Requires: default-yama-scope %endif +%if 0%{?rhel} >= 8 || 0%{?fedora} >= 20 +Recommends: elfutils-debuginfod-client +%else +Requires: elfutils-debuginfod-client +%endif %description libs The elfutils-libs package contains libraries which implement DWARF, ELF, -and machine-specific ELF handling. These libraries are used by the programs -in the elfutils package. The elfutils-devel package enables building -other programs using these libraries. +and machine-specific ELF handling and process introspection. These +libraries are used by the programs in the elfutils package. The +elfutils-devel package enables building other programs using these +libraries. %package devel Summary: Development libraries to handle compiled objects @@ -80,12 +94,16 @@ Provides: elfutils-devel%{depsuffix} = %{version}-%{release} %endif Requires: elfutils-libs%{depsuffix} = %{version}-%{release} Requires: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} +%if 0%{?rhel} >= 8 || 0%{?fedora} >= 20 +Recommends: elfutils-debuginfod-client-devel +%else +Requires: elfutils-debuginfod-client-devel +%endif %description devel The elfutils-devel package contains the libraries to create -applications for handling compiled objects. libebl provides some -higher-level ELF access functionality. libdw provides access to -the DWARF debugging information. libasm provides a programmable +applications for handling compiled objects. libdw provides access +to the DWARF debugging information. libasm provides a programmable assembler interface. %package devel-static @@ -177,6 +195,42 @@ interprocess services, communication and introspection profiling) of processes. %endif +%package debuginfod-client +Summary: Library and command line client for build-id HTTP ELF/DWARF server +License: GPLv3+ and (GPLv2+ or LGPLv3+) + +%package debuginfod-client-devel +Summary: Libraries and headers to build debuginfod client applications +License: GPLv2+ or LGPLv3+ + +%package debuginfod +Summary: HTTP ELF/DWARF file server addressed by build-id +License: GPLv3+ +BuildRequires: systemd +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd +Requires(pre): shadow-utils +# For /usr/bin/cpio2rpm +Requires: rpm + +%description debuginfod-client +The elfutils-debuginfod-client package contains shared libraries +dynamically loaded from -ldw, which use a debuginfod service +to look up debuginfo and associated data. Also includes a +command-line frontend. + +%description debuginfod-client-devel +The elfutils-debuginfod-client-devel package contains the libraries +to create applications to use the debuginfod service. + +%description debuginfod +The elfutils-debuginfod package contains the debuginfod binary +and control files for a service that can provide ELF/DWARF +files to remote clients, based on build-id identification. +The ELF/DWARF file searching functions in libdwfl can query +such servers to download those files on demand. + %prep %setup -q @@ -207,7 +261,6 @@ rm -rf ${RPM_BUILD_ROOT} make -s install DESTDIR=${RPM_BUILD_ROOT} chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib*.so* -chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/elfutils/lib*.so* %find_lang %{name} @@ -215,9 +268,14 @@ chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/elfutils/lib*.so* install -Dm0644 config/10-default-yama-scope.conf ${RPM_BUILD_ROOT}%{_sysctldir}/10-default-yama-scope.conf %endif +install -Dm0644 config/debuginfod.service ${RPM_BUILD_ROOT}%{_unitdir}/debuginfod.service +install -Dm0644 config/debuginfod.sysconfig ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/debuginfod +mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/cache/debuginfod +touch ${RPM_BUILD_ROOT}%{_localstatedir}/cache/debuginfod/debuginfod.sqlite + %check # Record some build root versions in build.log -uname -r; rpm -q glibc +uname -r; rpm -q binutils gcc glibc make -s %{?_smp_mflags} check || (cat tests/test-suite.log; false) @@ -226,11 +284,14 @@ make -s %{?_smp_mflags} check || (cat tests/test-suite.log; false) %if 0%{?ldconfig_scriptlets:1} %ldconfig_scriptlets libs %ldconfig_scriptlets libelf +%ldconfig_scriptlets debuginfod-client %else %post libs -p /sbin/ldconfig %postun libs -p /sbin/ldconfig %post libelf -p /sbin/ldconfig %postun libelf -p /sbin/ldconfig +%post debuginfod-client -p /sbin/ldconfig +%postun debuginfod-client -p /sbin/ldconfig %endif %if %{provide_yama_scope} @@ -244,13 +305,16 @@ fi %files %{!?_licensedir:%global license %%doc} -%license COPYING COPYING-GPLV2 COPYING-LGPLV3 +%license COPYING COPYING-GPLV2 COPYING-LGPLV3 doc/COPYING-GFDL %doc README TODO CONTRIBUTING %{_bindir}/eu-addr2line %{_bindir}/eu-ar +%{_bindir}/eu-elfclassify %{_bindir}/eu-elfcmp +%{_bindir}/eu-elfcompress %{_bindir}/eu-elflint %{_bindir}/eu-findtextrel +%{_bindir}/eu-make-debug-archive %{_bindir}/eu-nm %{_bindir}/eu-objdump %{_bindir}/eu-ranlib @@ -260,19 +324,15 @@ fi %{_bindir}/eu-strings %{_bindir}/eu-strip %{_bindir}/eu-unstrip -%{_bindir}/eu-make-debug-archive -%{_bindir}/eu-elfcompress -%{_bindir}/eu-elfclassify +%{_mandir}/man1/eu-*.1* %files libs %{!?_licensedir:%global license %%doc} %license COPYING-GPLV2 COPYING-LGPLV3 %{_libdir}/libasm-%{version}.so -%{_libdir}/libasm.so.* %{_libdir}/libdw-%{version}.so +%{_libdir}/libasm.so.* %{_libdir}/libdw.so.* -%dir %{_libdir}/elfutils -%{_libdir}/elfutils/lib*.so %files devel %{_includedir}/dwarf.h @@ -280,19 +340,17 @@ fi %{_includedir}/elfutils/elf-knowledge.h %{_includedir}/elfutils/known-dwarf.h %{_includedir}/elfutils/libasm.h -%{_includedir}/elfutils/libebl.h %{_includedir}/elfutils/libdw.h %{_includedir}/elfutils/libdwfl.h %{_includedir}/elfutils/libdwelf.h %{_includedir}/elfutils/version.h -%{_libdir}/libebl.a %{_libdir}/libasm.so %{_libdir}/libdw.so %{_libdir}/pkgconfig/libdw.pc %files devel-static -%{_libdir}/libasm.a %{_libdir}/libdw.a +%{_libdir}/libasm.a %files -f %{name}.lang libelf %{!?_licensedir:%global license %%doc} @@ -306,6 +364,7 @@ fi %{_includedir}/nlist.h %{_libdir}/libelf.so %{_libdir}/pkgconfig/libelf.pc +%{_mandir}/man3/elf_*.3* %files libelf-devel-static %{_libdir}/libelf.a @@ -315,7 +374,60 @@ fi %{_sysctldir}/10-default-yama-scope.conf %endif +%files debuginfod-client +%defattr(-,root,root) +%{_libdir}/libdebuginfod-%{version}.so +%{_bindir}/debuginfod-find +%{_mandir}/man1/debuginfod-find.1* + +%files debuginfod-client-devel +%defattr(-,root,root) +%{_libdir}/pkgconfig/libdebuginfod.pc +%{_mandir}/man3/debuginfod_*.3* +%{_includedir}/elfutils/debuginfod.h +%{_libdir}/libdebuginfod.so* + +%files debuginfod +%defattr(-,root,root) +%{_bindir}/debuginfod +%config(noreplace) %verify(not md5 size mtime) %{_sysconfdir}/sysconfig/debuginfod +%{_unitdir}/debuginfod.service +%{_sysconfdir}/sysconfig/debuginfod +%{_mandir}/man8/debuginfod.8* + +%dir %attr(0700,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod +%verify(not md5 size mtime) %attr(0600,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod/debuginfod.sqlite + +%pre debuginfod +getent group debuginfod >/dev/null || groupadd -r debuginfod +getent passwd debuginfod >/dev/null || \ + useradd -r -g debuginfod -d /var/cache/debuginfod -s /sbin/nologin \ + -c "elfutils debuginfo server" debuginfod +exit 0 + +%post debuginfod +%systemd_post debuginfod.service + +%postun debuginfod +%systemd_postun_with_restart debuginfod.service + %changelog +* Tue Nov 26 2019 Mark Wielaard - 0.178-1 +- New upstream release. + - debuginfod: New server, client tool and library to index and fetch + ELF/DWARF files addressed by build-id through HTTP. + - doc: There are now some manual pages for functions and tools. + - backends: The libebl libraries are no longer dynamically loaded + through dlopen, but are now compiled into libdw.so directly. + - readelf: -n, --notes now takes an optional "SECTION" argument. + -p and -x now also handle section numbers. + New option --dyn-sym to show just the dynamic symbol table. + - libcpu: Add RISC-V disassembler. + - libdw: Abbrevs and DIEs can now be read concurrently by multiple + threads through the same Dwarf handle. + - libdwfl: Will try to use debuginfod when installed as fallback to + retrieve ELF and DWARF debug data files by build-id. + * Wed Aug 14 2019 Mark Wielaard - 0.177-1 - New upstream release. - elfclassify: New tool to analyze ELF objects. diff --git a/sources b/sources index 14fbdc3..08769be 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.177.tar.bz2) = 2779987463a22ed220759e25a09c9a1eb84c0f36db37675136e59aa55c7f8f90b7a7d34ffc4e6a4291d7fa73692a1bd1a303a74270b11d1623b4f9868d19498f +SHA512 (elfutils-0.178.tar.bz2) = 356656ad0db8f6877b461de1a11280de16a9cc5d8dde4381a938a212e828e32755135e5e3171d311c4c9297b728fbd98123048e2e8fbf7fe7de68976a2daabe5 From 3a9892dcc704077765fc3a0d4bbeaa82c878855c Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 27 Nov 2019 03:32:29 +0100 Subject: [PATCH 100/216] 0.178-2 Fix libdebuginfod file list for debuginfo-client[-devel]. --- elfutils.spec | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index d06e0af..7e88f82 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,7 +1,7 @@ Name: elfutils Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.178 -%global baserelease 1 +%global baserelease 2 URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) and GFDL @@ -377,6 +377,7 @@ fi %files debuginfod-client %defattr(-,root,root) %{_libdir}/libdebuginfod-%{version}.so +%{_libdir}/libdebuginfod.so.* %{_bindir}/debuginfod-find %{_mandir}/man1/debuginfod-find.1* @@ -385,7 +386,7 @@ fi %{_libdir}/pkgconfig/libdebuginfod.pc %{_mandir}/man3/debuginfod_*.3* %{_includedir}/elfutils/debuginfod.h -%{_libdir}/libdebuginfod.so* +%{_libdir}/libdebuginfod.so %files debuginfod %defattr(-,root,root) @@ -412,6 +413,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Nov 26 2019 Mark Wielaard - 0.178-2 +- Fix libdebuginfod file list for debuginfo-client[-devel]. + * Tue Nov 26 2019 Mark Wielaard - 0.178-1 - New upstream release. - debuginfod: New server, client tool and library to index and fetch From 163985d2b41587143a4f6299ae5e639f017f0601 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 27 Nov 2019 03:47:17 +0100 Subject: [PATCH 101/216] Fix changelog date. --- elfutils.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 7e88f82..0d95964 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -413,7 +413,7 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog -* Wed Nov 26 2019 Mark Wielaard - 0.178-2 +* Wed Nov 27 2019 Mark Wielaard - 0.178-2 - Fix libdebuginfod file list for debuginfo-client[-devel]. * Tue Nov 26 2019 Mark Wielaard - 0.178-1 From a83eb07452e4d44ed13899c5fcace5190774e651 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 28 Nov 2019 19:30:42 +0100 Subject: [PATCH 102/216] 0.178-3 Add elfutils-debuginfod-client Provides and Requires with depsuffix to get multilib dependencies correct. Add %{version}-%{release} to keep subpackages in sync. --- elfutils.spec | 55 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 0d95964..f9d3913 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,30 +1,19 @@ Name: elfutils -Summary: A collection of utilities and DSOs to handle ELF files and DWARF data Version: 0.178 -%global baserelease 2 +%global baserelease 3 +Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ License: GPLv3+ and (GPLv2+ or LGPLv3+) and GFDL Source: %{?source_url}%{name}-%{version}.tar.bz2 -Release: %{baserelease}%{?dist} - -%global provide_yama_scope 0 - -%if 0%{?fedora} >= 22 || 0%{?rhel} >= 7 -%global provide_yama_scope 1 -%endif - -%global depsuffix %{?_isa}%{!?_isa:-%{_arch}} - -# Patches -Patch1: elfutils-0.178-pt-gnu-prop.patch +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 +Recommends: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} %else -Requires: elfutils-debuginfod-client +Requires: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} %endif BuildRequires: gcc @@ -55,6 +44,17 @@ BuildRequires: curl %global _gnu %{nil} %global _program_prefix eu- +%global provide_yama_scope 0 + +%if 0%{?fedora} >= 22 || 0%{?rhel} >= 7 +%global provide_yama_scope 1 +%endif + +%global depsuffix %{?_isa}%{!?_isa:-%{_arch}} + +# Patches +Patch1: elfutils-0.178-pt-gnu-prop.patch + %description Elfutils is a collection of utilities, including stack (to show backtraces), nm (for listing symbols from object files), size @@ -74,9 +74,9 @@ Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: default-yama-scope %endif %if 0%{?rhel} >= 8 || 0%{?fedora} >= 20 -Recommends: elfutils-debuginfod-client +Recommends: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} %else -Requires: elfutils-debuginfod-client +Requires: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} %endif %description libs @@ -95,9 +95,9 @@ Provides: elfutils-devel%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} Requires: elfutils-libelf-devel%{depsuffix} = %{version}-%{release} %if 0%{?rhel} >= 8 || 0%{?fedora} >= 20 -Recommends: elfutils-debuginfod-client-devel +Recommends: elfutils-debuginfod-client-devel%{depsuffix} = %{version}-%{release} %else -Requires: elfutils-debuginfod-client-devel +Requires: elfutils-debuginfod-client-devel%{depsuffix} = %{version}-%{release} %endif %description devel @@ -198,14 +198,24 @@ 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+) +%if 0%{!?_isa:1} +Provides: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} +%endif %package debuginfod-client-devel Summary: Libraries and headers to build debuginfod client applications License: GPLv2+ or LGPLv3+ +%if 0%{!?_isa:1} +Provides: elfutils-debuginfod-client-devel%{depsuffix} = %{version}-%{release} +%endif +Requires: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} %package debuginfod Summary: HTTP ELF/DWARF file server addressed by build-id License: GPLv3+ +Requires: elfutils-libs%{depsuffix} = %{version}-%{release} +Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} +Requires: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} BuildRequires: systemd Requires(post): systemd Requires(preun): systemd @@ -413,6 +423,11 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Thu Nov 28 2019 Mark Wielaard - 0.178-3 +- Add elfutils-debuginfod-client Provides and Requires with depsuffix + to get multilib dependencies correct. Add %{version}-%{release} to + keep subpackages in sync. + * Wed Nov 27 2019 Mark Wielaard - 0.178-2 - Fix libdebuginfod file list for debuginfo-client[-devel]. From 3eb62aff83e364093b56c2fd943077ca0b060891 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 28 Nov 2019 20:55:26 +0100 Subject: [PATCH 103/216] 0.178-4 - Define %%{depsuffix} before use. --- elfutils.spec | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index f9d3913..5ef8b60 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.178 -%global baserelease 3 +%global baserelease 4 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -8,6 +8,9 @@ License: GPLv3+ and (GPLv2+ or LGPLv3+) and GFDL Source: %{?source_url}%{name}-%{version}.tar.bz2 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}} + Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-libs%{depsuffix} = %{version}-%{release} %if 0%{?rhel} >= 8 || 0%{?fedora} >= 20 @@ -50,8 +53,6 @@ BuildRequires: curl %global provide_yama_scope 1 %endif -%global depsuffix %{?_isa}%{!?_isa:-%{_arch}} - # Patches Patch1: elfutils-0.178-pt-gnu-prop.patch @@ -423,9 +424,12 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Thu Nov 28 2019 Mark Wielaard - 0.178-4 +- Define %%{depsuffix} before use. + * Thu Nov 28 2019 Mark Wielaard - 0.178-3 - Add elfutils-debuginfod-client Provides and Requires with depsuffix - to get multilib dependencies correct. Add %{version}-%{release} to + to get multilib dependencies correct. Add %%{version}-%%{release} to keep subpackages in sync. * Wed Nov 27 2019 Mark Wielaard - 0.178-2 From 9558bcc5bfe6c0bf5f62bf96b313ff81a1201e40 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 9 Dec 2019 20:07:02 +0100 Subject: [PATCH 104/216] 0.178-5 - Add elfutils-0.178-debuginfod-no-cache.patch. --- elfutils-0.178-debuginfod-no-cache.patch | 67 ++++++++++++++++++++++++ elfutils.spec | 7 ++- 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.178-debuginfod-no-cache.patch diff --git a/elfutils-0.178-debuginfod-no-cache.patch b/elfutils-0.178-debuginfod-no-cache.patch new file mode 100644 index 0000000..a05336b --- /dev/null +++ b/elfutils-0.178-debuginfod-no-cache.patch @@ -0,0 +1,67 @@ +commit d8bad02afc7b7f30402b4e0e458df874a6d600da +Author: Mark Wielaard +Date: Mon Dec 9 19:38:19 2019 +0100 + + debuginfod: Check the DEBUGINFOD_URLS environment variable early in client. + + If the debuginfod-client isn't configured we should do as little + as possible. Simply return early with ENOSYS if no servers are + configured. This means we won't check + + This does change the behavior of the debuginfod_find calls slightly. + Previously we would setup and check the cache if the given build-id + was valid. Which might have provided a result if an earlier client + had run with the same cache and valid server URLs which knew about + that particular build-id. Now we don't return any cached results + unless at least one server is configured. + + This prevents selinux errors when the library is used in a confined + setup. + + Signed-off-by: Mark Wielaard + +diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c +index 302ea2dc..ab7b4e13 100644 +--- a/debuginfod/debuginfod-client.c ++++ b/debuginfod/debuginfod-client.c +@@ -301,6 +301,16 @@ debuginfod_query_server (debuginfod_client *c, + char target_cache_tmppath[PATH_MAX*5]; + char suffix[PATH_MAX*2]; + char build_id_bytes[MAX_BUILD_ID_BYTES * 2 + 1]; ++ int rc; ++ ++ /* Is there any server we can query? If not, don't do any work, ++ just return with ENOSYS. Don't even access the cache. */ ++ urls_envvar = getenv(server_urls_envvar); ++ if (urls_envvar == NULL || urls_envvar[0] == '\0') ++ { ++ rc = -ENOSYS; ++ goto out; ++ } + + /* Copy lowercase hex representation of build_id into buf. */ + if ((build_id_len >= MAX_BUILD_ID_BYTES) || +@@ -373,7 +383,7 @@ debuginfod_query_server (debuginfod_client *c, + /* XXX combine these */ + snprintf(interval_path, sizeof(interval_path), "%s/%s", cache_path, cache_clean_interval_filename); + snprintf(maxage_path, sizeof(maxage_path), "%s/%s", cache_path, cache_max_unused_age_filename); +- int rc = debuginfod_init_cache(cache_path, interval_path, maxage_path); ++ rc = debuginfod_init_cache(cache_path, interval_path, maxage_path); + if (rc != 0) + goto out; + rc = debuginfod_clean_cache(c, cache_path, interval_path, maxage_path); +@@ -390,14 +400,6 @@ debuginfod_query_server (debuginfod_client *c, + return fd; + } + +- +- urls_envvar = getenv(server_urls_envvar); +- if (urls_envvar == NULL || urls_envvar[0] == '\0') +- { +- rc = -ENOSYS; +- goto out; +- } +- + if (getenv(server_timeout_envvar)) + server_timeout = atoi (getenv(server_timeout_envvar)); + diff --git a/elfutils.spec b/elfutils.spec index 5ef8b60..68f35f0 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.178 -%global baserelease 4 +%global baserelease 5 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -55,6 +55,7 @@ BuildRequires: curl # Patches Patch1: elfutils-0.178-pt-gnu-prop.patch +Patch2: elfutils-0.178-debuginfod-no-cache.patch %description Elfutils is a collection of utilities, including stack (to show @@ -247,6 +248,7 @@ such servers to download those files on demand. # Apply patches %patch1 -p1 -b .pt-gnu-prop +%patch2 -p1 -b .debuginfod-client-cache # In case the above patches added any new test scripts, make sure they # are executable. @@ -424,6 +426,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Dec 9 2019 Mark Wielaard - 0.178-5 +- Add elfutils-0.178-debuginfod-no-cache.patch. + * Thu Nov 28 2019 Mark Wielaard - 0.178-4 - Define %%{depsuffix} before use. From 21627039974b111e423dba6b52701f59ff78dccc Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 11 Dec 2019 15:58:57 +0100 Subject: [PATCH 105/216] Add elfutils-0.178-curl-code-gcc-10.patch --- elfutils-0.178-curl-code-gcc-10.patch | 53 +++++++++++++++++++++++++++ elfutils.spec | 5 +++ 2 files changed, 58 insertions(+) create mode 100644 elfutils-0.178-curl-code-gcc-10.patch diff --git a/elfutils-0.178-curl-code-gcc-10.patch b/elfutils-0.178-curl-code-gcc-10.patch new file mode 100644 index 0000000..a1e2741 --- /dev/null +++ b/elfutils-0.178-curl-code-gcc-10.patch @@ -0,0 +1,53 @@ +commit 374fbed3da0197f794a904e78e75e961c7e2e92c +Author: Mark Wielaard +Date: Wed Dec 4 00:39:26 2019 +0100 + + debuginfod: Fix implicit conversion from 'CURLcode' to 'CURLMcode' + + GCC10 warns when converting the value of one enum type into another: + + debuginfod-client.c:530:24: error: implicit conversion from ‘CURLcode’ + to ‘CURLMcode’ [-Werror=enum-conversion] + 530 | curl_res = curl_easy_getinfo(target_handle, + | ^ + + libcurl has different error code enums. The "easy" interfaces return + a CURLcode error. The "multi" interface functions return a CURLMcode. + + Signed-off-by: Mark Wielaard + +diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c +index 6e62b86c..302ea2dc 100644 +--- a/debuginfod/debuginfod-client.c ++++ b/debuginfod/debuginfod-client.c +@@ -509,8 +509,6 @@ debuginfod_query_server (debuginfod_client *c, + long loops = 0; + do + { +- CURLMcode curl_res; +- + if (c->progressfn) /* inform/check progress callback */ + { + loops ++; +@@ -518,6 +516,7 @@ debuginfod_query_server (debuginfod_client *c, + long pb = 0; + if (target_handle) /* we've committed to a server; report its download progress */ + { ++ CURLcode curl_res; + #ifdef CURLINFO_SIZE_DOWNLOAD_T + curl_off_t dl; + curl_res = curl_easy_getinfo(target_handle, +@@ -564,10 +563,10 @@ debuginfod_query_server (debuginfod_client *c, + if (data[i].handle != target_handle) + curl_multi_remove_handle(curlm, data[i].handle); + +- curl_res = curl_multi_perform(curlm, &still_running); +- if (curl_res != CURLM_OK) ++ CURLMcode curlm_res = curl_multi_perform(curlm, &still_running); ++ if (curlm_res != CURLM_OK) + { +- switch (curl_res) ++ switch (curlm_res) + { + case CURLM_CALL_MULTI_PERFORM: continue; + case CURLM_OUT_OF_MEMORY: rc = -ENOMEM; break; diff --git a/elfutils.spec b/elfutils.spec index 68f35f0..dcb8bf9 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -56,6 +56,7 @@ BuildRequires: curl # Patches Patch1: elfutils-0.178-pt-gnu-prop.patch Patch2: elfutils-0.178-debuginfod-no-cache.patch +Patch3: elfutils-0.178-curl-code-gcc-10.patch %description Elfutils is a collection of utilities, including stack (to show @@ -249,6 +250,7 @@ such servers to download those files on demand. # Apply patches %patch1 -p1 -b .pt-gnu-prop %patch2 -p1 -b .debuginfod-client-cache +%patch3 -p1 -b .curl-gcc-10 # In case the above patches added any new test scripts, make sure they # are executable. @@ -426,6 +428,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Dec 11 2019 Mark Wielaard +- Add elfutils-0.178-curl-code-gcc-10.patch + * Mon Dec 9 2019 Mark Wielaard - 0.178-5 - Add elfutils-0.178-debuginfod-no-cache.patch. From 83259ef8d8c95420eced29e45e27b9ceb5689fd6 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 11 Dec 2019 16:08:01 +0100 Subject: [PATCH 106/216] 0.178-6 - Add elfutils-0.178-compressed-vmlinuz.patch --- elfutils-0.178-compressed-vmlinuz.patch | 62 +++++++++++++++++++++++++ elfutils.spec | 7 ++- 2 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.178-compressed-vmlinuz.patch diff --git a/elfutils-0.178-compressed-vmlinuz.patch b/elfutils-0.178-compressed-vmlinuz.patch new file mode 100644 index 0000000..1df54a1 --- /dev/null +++ b/elfutils-0.178-compressed-vmlinuz.patch @@ -0,0 +1,62 @@ +commit 4a90cb11140a6bb3712228861a32e4035013ad85 +Author: Mark Wielaard +Date: Thu Dec 5 15:03:54 2019 +0100 + + libdwfl: Find and handle compressed vmlinuz image. + + Both the dwfl_linux_kernel_find_elf callback and the + dwfl_linux_kernel_report_offline reporting function only handled + vmlinix images possibly compressed with .gz, .bz2 or .xz extension. + They did not find or handle the much more common vmlinuz compressed + images. + + It is not completely clear why we didn't up to now. Support for + compressed ELF files was added in 2009 and the code was updated to + to try to find the .gz, .bz2 or .xz extension variants in 2011. + But not the vmlinuz named variant. + + Reported-by: Aaron Merey + Tested-by: Frank Ch. Eigler + Signed-off-by: Mark Wielaard + +diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c +index d46ab5aa..48fb1ff0 100644 +--- a/libdwfl/linux-kernel-modules.c ++++ b/libdwfl/linux-kernel-modules.c +@@ -174,6 +174,8 @@ kernel_release (void) + static int + find_kernel_elf (Dwfl *dwfl, const char *release, char **fname) + { ++ /* First try to find an uncompressed vmlinux image. Possibly ++ including debuginfo. */ + if ((release[0] == '/' + ? asprintf (fname, "%s/vmlinux", release) + : asprintf (fname, "/boot/vmlinux-%s", release)) < 0) +@@ -188,6 +190,27 @@ find_kernel_elf (Dwfl *dwfl, const char *release, char **fname) + fd = try_kernel_name (dwfl, fname, true); + } + ++ /* There might be a compressed vmlinuz image. Probably without ++ debuginfo, but try to find it under the debug path also, just in ++ case. */ ++ if (fd < 0) ++ { ++ free (*fname); ++ if ((release[0] == '/' ++ ? asprintf (fname, "%s/vmlinuz", release) ++ : asprintf (fname, "/boot/vmlinuz-%s", release)) < 0) ++ return -1; ++ ++ fd = try_kernel_name (dwfl, fname, true); ++ if (fd < 0 && release[0] != '/') ++ { ++ free (*fname); ++ if (asprintf (fname, MODULEDIRFMT "/vmlinuz", release) < 0) ++ return -1; ++ fd = try_kernel_name (dwfl, fname, true); ++ } ++ } ++ + return fd; + } + diff --git a/elfutils.spec b/elfutils.spec index dcb8bf9..a2e31e1 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.178 -%global baserelease 5 +%global baserelease 6 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -57,6 +57,7 @@ BuildRequires: curl Patch1: elfutils-0.178-pt-gnu-prop.patch Patch2: elfutils-0.178-debuginfod-no-cache.patch Patch3: elfutils-0.178-curl-code-gcc-10.patch +Patch4: elfutils-0.178-compressed-vmlinuz.patch %description Elfutils is a collection of utilities, including stack (to show @@ -251,6 +252,7 @@ such servers to download those files on demand. %patch1 -p1 -b .pt-gnu-prop %patch2 -p1 -b .debuginfod-client-cache %patch3 -p1 -b .curl-gcc-10 +%patch4 -p1 -b .vmlinuz # In case the above patches added any new test scripts, make sure they # are executable. @@ -428,8 +430,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog -* Wed Dec 11 2019 Mark Wielaard +* Wed Dec 11 2019 Mark Wielaard - 0.178-6 - Add elfutils-0.178-curl-code-gcc-10.patch +- Add elfutils-0.178-compressed-vmlinuz.patch * Mon Dec 9 2019 Mark Wielaard - 0.178-5 - Add elfutils-0.178-debuginfod-no-cache.patch. From d00bb7c8e6ee720a3388efcd671d7e206abad911 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 10 Jan 2020 16:56:07 +0100 Subject: [PATCH 107/216] Add elfutils-0.178-debuginfod-timeoutprogress.patch --- ...ils-0.178-debuginfod-timeoutprogress.patch | 593 ++++++++++++++++++ elfutils.spec | 5 + 2 files changed, 598 insertions(+) create mode 100644 elfutils-0.178-debuginfod-timeoutprogress.patch diff --git a/elfutils-0.178-debuginfod-timeoutprogress.patch b/elfutils-0.178-debuginfod-timeoutprogress.patch new file mode 100644 index 0000000..9e81e9e --- /dev/null +++ b/elfutils-0.178-debuginfod-timeoutprogress.patch @@ -0,0 +1,593 @@ +commit 76ad56c430f0b85c47115688c511d9bd4fa671d4 +Author: Frank Ch. Eigler +Date: Wed Dec 4 15:51:12 2019 -0500 + + debuginfod: usability tweaks, incl. $DEBUGINFOD_PROGRESS client support + + This facility allows a default progress-printing function to be + installed if the given environment variable is set. Some larger usage + experience (systemtap fetching kernels) indicates the default timeout + is too short, so forked it into a connection timeout (default short) + and a transfer timeout (default unlimited). + + Signed-off-by: Frank Ch. Eigler + +diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c +index ab7b4e1..9a4a0e0 100644 +--- a/debuginfod/debuginfod-client.c ++++ b/debuginfod/debuginfod-client.c +@@ -40,6 +40,7 @@ + + #include "config.h" + #include "debuginfod.h" ++#include "system.h" + #include + #include + #include +@@ -98,16 +99,16 @@ static const time_t cache_default_max_unused_age_s = 604800; /* 1 week */ + static const char *cache_default_name = ".debuginfod_client_cache"; + static const char *cache_path_envvar = DEBUGINFOD_CACHE_PATH_ENV_VAR; + +-/* URLs of debuginfods, separated by url_delim. +- This env var must be set for debuginfod-client to run. */ ++/* URLs of debuginfods, separated by url_delim. */ + static const char *server_urls_envvar = DEBUGINFOD_URLS_ENV_VAR; + static const char *url_delim = " "; + static const char url_delim_char = ' '; + +-/* Timeout for debuginfods, in seconds. +- This env var must be set for debuginfod-client to run. */ ++/* Timeout for debuginfods, in seconds. */ + static const char *server_timeout_envvar = DEBUGINFOD_TIMEOUT_ENV_VAR; +-static int server_timeout = 5; ++static const long default_connect_timeout = 5; ++static const long default_transfer_timeout = -1; /* unlimited */ ++ + + /* Data associated with a particular CURL easy handle. Passed to + the write callback. */ +@@ -400,8 +401,18 @@ debuginfod_query_server (debuginfod_client *c, + return fd; + } + +- if (getenv(server_timeout_envvar)) +- server_timeout = atoi (getenv(server_timeout_envvar)); ++ long connect_timeout = default_connect_timeout; ++ long transfer_timeout = default_transfer_timeout; ++ const char* timeout_envvar = getenv(server_timeout_envvar); ++ if (timeout_envvar != NULL) ++ { ++ long ct, tt; ++ rc = sscanf(timeout_envvar, "%ld,%ld", &ct, &tt); ++ if (rc >= 1) ++ connect_timeout = ct; ++ if (rc >= 2) ++ transfer_timeout = tt; ++ } + + /* make a copy of the envvar so it can be safely modified. */ + server_urls = strdup(urls_envvar); +@@ -493,7 +504,10 @@ debuginfod_query_server (debuginfod_client *c, + CURLOPT_WRITEFUNCTION, + debuginfod_write_callback); + curl_easy_setopt(data[i].handle, CURLOPT_WRITEDATA, (void*)&data[i]); +- curl_easy_setopt(data[i].handle, CURLOPT_TIMEOUT, (long) server_timeout); ++ if (connect_timeout >= 0) ++ curl_easy_setopt(data[i].handle, CURLOPT_CONNECTTIMEOUT, connect_timeout); ++ if (transfer_timeout >= 0) ++ curl_easy_setopt(data[i].handle, CURLOPT_TIMEOUT, transfer_timeout); + curl_easy_setopt(data[i].handle, CURLOPT_FILETIME, (long) 1); + curl_easy_setopt(data[i].handle, CURLOPT_FOLLOWLOCATION, (long) 1); + curl_easy_setopt(data[i].handle, CURLOPT_FAILONERROR, (long) 1); +@@ -511,11 +525,32 @@ debuginfod_query_server (debuginfod_client *c, + long loops = 0; + do + { ++ /* Wait 1 second, the minimum DEBUGINFOD_TIMEOUT. */ ++ curl_multi_wait(curlm, NULL, 0, 1000, NULL); ++ ++ /* If the target file has been found, abort the other queries. */ ++ if (target_handle != NULL) ++ for (int i = 0; i < num_urls; i++) ++ if (data[i].handle != target_handle) ++ curl_multi_remove_handle(curlm, data[i].handle); ++ ++ CURLMcode curlm_res = curl_multi_perform(curlm, &still_running); ++ if (curlm_res != CURLM_OK) ++ { ++ switch (curlm_res) ++ { ++ case CURLM_CALL_MULTI_PERFORM: continue; ++ case CURLM_OUT_OF_MEMORY: rc = -ENOMEM; break; ++ default: rc = -ENETUNREACH; break; ++ } ++ goto out1; ++ } ++ + if (c->progressfn) /* inform/check progress callback */ + { + loops ++; + long pa = loops; /* default params for progress callback */ +- long pb = 0; ++ long pb = 0; /* transfer_timeout tempting, but loops != elapsed-time */ + if (target_handle) /* we've committed to a server; report its download progress */ + { + CURLcode curl_res; +@@ -535,6 +570,8 @@ debuginfod_query_server (debuginfod_client *c, + pa = (dl > LONG_MAX ? LONG_MAX : (long)dl); + #endif + ++ /* NB: If going through deflate-compressing proxies, this ++ number is likely to be unavailable, so -1 may show. */ + #ifdef CURLINFO_CURLINFO_CONTENT_LENGTH_DOWNLOAD_T + curl_off_t cl; + curl_res = curl_easy_getinfo(target_handle, +@@ -555,27 +592,6 @@ debuginfod_query_server (debuginfod_client *c, + if ((*c->progressfn) (c, pa, pb)) + break; + } +- +- /* Wait 1 second, the minimum DEBUGINFOD_TIMEOUT. */ +- curl_multi_wait(curlm, NULL, 0, 1000, NULL); +- +- /* If the target file has been found, abort the other queries. */ +- if (target_handle != NULL) +- for (int i = 0; i < num_urls; i++) +- if (data[i].handle != target_handle) +- curl_multi_remove_handle(curlm, data[i].handle); +- +- CURLMcode curlm_res = curl_multi_perform(curlm, &still_running); +- if (curlm_res != CURLM_OK) +- { +- switch (curlm_res) +- { +- case CURLM_CALL_MULTI_PERFORM: continue; +- case CURLM_OUT_OF_MEMORY: rc = -ENOMEM; break; +- default: rc = -ENETUNREACH; break; +- } +- goto out1; +- } + } while (still_running); + + /* Check whether a query was successful. If so, assign its handle +@@ -674,9 +690,9 @@ debuginfod_query_server (debuginfod_client *c, + + curl_multi_cleanup(curlm); + unlink (target_cache_tmppath); ++ close (fd); /* before the rmdir, otherwise it'll fail */ + (void) rmdir (target_cache_dir); /* nop if not empty */ + free(data); +- close (fd); + + out0: + free (server_urls); +@@ -685,6 +701,22 @@ debuginfod_query_server (debuginfod_client *c, + return rc; + } + ++ ++/* Activate a basic form of progress tracing */ ++static int ++default_progressfn (debuginfod_client *c, long a, long b) ++{ ++ (void) c; ++ ++ dprintf(STDERR_FILENO, ++ "Downloading from debuginfod %ld/%ld%s", a, b, ++ ((a == b) ? "\n" : "\r")); ++ /* XXX: include URL - stateful */ ++ ++ return 0; ++} ++ ++ + /* See debuginfod.h */ + debuginfod_client * + debuginfod_begin (void) +@@ -693,7 +725,12 @@ debuginfod_begin (void) + size_t size = sizeof (struct debuginfod_client); + client = (debuginfod_client *) malloc (size); + if (client != NULL) +- client->progressfn = NULL; ++ { ++ if (getenv(DEBUGINFOD_PROGRESS_ENV_VAR)) ++ client->progressfn = default_progressfn; ++ else ++ client->progressfn = NULL; ++ } + return client; + } + +diff --git a/debuginfod/debuginfod.h b/debuginfod/debuginfod.h +index 6b1b1cc..33fae86 100644 +--- a/debuginfod/debuginfod.h ++++ b/debuginfod/debuginfod.h +@@ -33,6 +33,7 @@ + #define DEBUGINFOD_URLS_ENV_VAR "DEBUGINFOD_URLS" + #define DEBUGINFOD_CACHE_PATH_ENV_VAR "DEBUGINFOD_CACHE_PATH" + #define DEBUGINFOD_TIMEOUT_ENV_VAR "DEBUGINFOD_TIMEOUT" ++#define DEBUGINFOD_PROGRESS_ENV_VAR "DEBUGINFOD_PROGRESS" + + /* Handle for debuginfod-client connection. */ + typedef struct debuginfod_client debuginfod_client; +diff --git a/doc/debuginfod-find.1 b/doc/debuginfod-find.1 +index a759ecb..023acbb 100644 +--- a/doc/debuginfod-find.1 ++++ b/doc/debuginfod-find.1 +@@ -119,9 +119,13 @@ debuginfod instances. Alternate URL prefixes are separated by space. + + .TP 21 + .B DEBUGINFOD_TIMEOUT +-This environment variable governs the timeout for each debuginfod HTTP +-connection. A server that fails to respond within this many seconds +-is skipped. The default is 5. ++This environment variable governs the timeouts for each debuginfod ++HTTP connection. One or two comma-separated numbers may be given. ++The first is the number of seconds for the connection establishment ++(CURLOPT_CONNECTTIMEOUT), and the default is 5. The second is the ++number of seconds for the transfer completion (CURLOPT_TIMEOUT), and ++the default is no timeout. (Zero or negative also means "no ++timeout".) + + .TP 21 + .B DEBUGINFOD_CACHE_PATH +diff --git a/doc/debuginfod_find_debuginfo.3 b/doc/debuginfod_find_debuginfo.3 +index be8eed0..ea8c616 100644 +--- a/doc/debuginfod_find_debuginfo.3 ++++ b/doc/debuginfod_find_debuginfo.3 +@@ -163,9 +163,21 @@ debuginfod instances. Alternate URL prefixes are separated by space. + + .TP 21 + .B DEBUGINFOD_TIMEOUT +-This environment variable governs the timeout for each debuginfod HTTP +-connection. A server that fails to respond within this many seconds +-is skipped. The default is 5. ++This environment variable governs the timeouts for each debuginfod ++HTTP connection. One or two comma-separated numbers may be given. ++The first is the number of seconds for the connection establishment ++(CURLOPT_CONNECTTIMEOUT), and the default is 5. The second is the ++number of seconds for the transfer completion (CURLOPT_TIMEOUT), and ++the default is no timeout. (Zero or negative also means "no ++timeout".) ++ ++.TP 21 ++.B DEBUGINFOD_PROGRESS ++This environment variable governs the default progress function. If ++set, and if a progressfn is not explicitly set, then the library will ++configure a default progressfn. This function will append a simple ++progress message periodically to the given file. Consider using ++"/dev/stderr" on platforms that support it. The default is nothing. + + .TP 21 + .B DEBUGINFOD_CACHE_PATH +diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh +index 6533996..4cf6138 100755 +--- a/tests/run-debuginfod-find.sh ++++ b/tests/run-debuginfod-find.sh +@@ -89,7 +89,7 @@ wait_ready $PORT1 'ready' 1 + export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/ # or without trailing / + + # Be patient when run on a busy machine things might take a bit. +-export DEBUGINFOD_TIMEOUT=10 ++export DEBUGINFOD_TIMEOUT=1,10 + + # We use -t0 and -g0 here to turn off time-based scanning & grooming. + # For testing purposes, we just sic SIGUSR1 / SIGUSR2 at the process. +@@ -153,8 +153,11 @@ cmp $filename F/prog2 + cat vlog + grep -q Progress vlog + tempfiles vlog +-filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2` ++filename=`testrun env DEBUGINFOD_PROGRESS=1 ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2 2>vlog2` + cmp $filename F/prog2 ++cat vlog2 ++grep -q Downloading vlog2 ++tempfiles vlog2 + filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID2 ${PWD}/prog2.c` + cmp $filename ${PWD}/prog2.c + + +commit 288c76775f2d27976eb269e568b53c742d973dbc +Author: Frank Ch. Eigler +Date: Mon Jan 6 04:29:21 2020 -0500 + + debuginfod: pass a distro-summary User-Agent request header + + It may be useful for a debuginfod server operator to know what kinds + of clients make webapi requests. This is mainly as a + telemetry/diagnostic (though the data cannot be really trusted). It + may also be useful to automate downloading of distro packages to a + debuginfod server in the case of an unknown hex buildid. doc/testing + not affected as these are diagnostics. + + Signed-off-by: Frank Ch. Eigler + Signed-off-by: Mark Wielaard + +diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c +index 9a4a0e0..66ccb21 100644 +--- a/debuginfod/debuginfod-client.c ++++ b/debuginfod/debuginfod-client.c +@@ -1,5 +1,5 @@ + /* Retrieve ELF / DWARF / source files from the debuginfod. +- Copyright (C) 2019 Red Hat, Inc. ++ Copyright (C) 2019-2020 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify +@@ -58,6 +58,7 @@ + #include + #include + #include ++#include + #include + + /* If fts.h is included before config.h, its indirect inclusions may not +@@ -279,6 +280,87 @@ debuginfod_clean_cache(debuginfod_client *c, + #define MAX_BUILD_ID_BYTES 64 + + ++static void ++add_extra_headers(CURL *handle) ++{ ++ /* Compute a User-Agent: string to send. The more accurately this ++ describes this host, the likelier that the debuginfod servers ++ might be able to locate debuginfo for us. */ ++ ++ char* utspart = NULL; ++ struct utsname uts; ++ int rc = 0; ++ rc = uname (&uts); ++ if (rc == 0) ++ rc = asprintf(& utspart, "%s/%s", uts.sysname, uts.machine); ++ if (rc < 0) ++ utspart = NULL; ++ ++ FILE *f = fopen ("/etc/os-release", "r"); ++ if (f == NULL) ++ f = fopen ("/usr/lib/os-release", "r"); ++ char *id = NULL; ++ char *version = NULL; ++ if (f != NULL) ++ { ++ while (id == NULL || version == NULL) ++ { ++ char buf[128]; ++ char *s = &buf[0]; ++ if (fgets (s, sizeof(buf), f) == NULL) ++ break; ++ ++ int len = strlen (s); ++ if (len < 3) ++ continue; ++ if (s[len - 1] == '\n') ++ { ++ s[len - 1] = '\0'; ++ len--; ++ } ++ ++ char *v = strchr (s, '='); ++ if (v == NULL || strlen (v) < 2) ++ continue; ++ ++ /* Split var and value. */ ++ *v = '\0'; ++ v++; ++ ++ /* Remove optional quotes around value string. */ ++ if (*v == '"' || *v == '\'') ++ { ++ v++; ++ s[len - 1] = '\0'; ++ } ++ if (strcmp (s, "ID") == 0) ++ id = strdup (v); ++ if (strcmp (s, "VERSION_ID") == 0) ++ version = strdup (v); ++ } ++ fclose (f); ++ } ++ ++ char *ua = NULL; ++ rc = asprintf(& ua, "%s/%s,%s,%s/%s", ++ PACKAGE_NAME, PACKAGE_VERSION, ++ utspart ?: "", ++ id ?: "", ++ version ?: ""); ++ if (rc < 0) ++ ua = NULL; ++ ++ if (ua) ++ curl_easy_setopt(handle, CURLOPT_USERAGENT, (void*) ua); /* implicit strdup */ ++ ++ free (ua); ++ free (id); ++ free (version); ++ free (utspart); ++} ++ ++ ++ + /* Query each of the server URLs found in $DEBUGINFOD_URLS for the file + with the specified build-id, type (debuginfo, executable or source) + and filename. filename may be NULL. If found, return a file +@@ -514,7 +596,7 @@ debuginfod_query_server (debuginfod_client *c, + curl_easy_setopt(data[i].handle, CURLOPT_NOSIGNAL, (long) 1); + curl_easy_setopt(data[i].handle, CURLOPT_AUTOREFERER, (long) 1); + curl_easy_setopt(data[i].handle, CURLOPT_ACCEPT_ENCODING, ""); +- curl_easy_setopt(data[i].handle, CURLOPT_USERAGENT, (void*) PACKAGE_STRING); ++ add_extra_headers(data[i].handle); + + curl_multi_add_handle(curlm, data[i].handle); + server_url = strtok_r(NULL, url_delim, &strtok_saveptr); + +commit b8d85ed024a745cff05e56c6337d95d654d5294a +Author: Mark Wielaard +Date: Thu Jan 2 17:02:42 2020 +0100 + + debuginfod: Use DEBUGINFOD_TIMEOUT as seconds to get at least 100K. + + Use just one timeout using CURLOPT_LOW_SPEED_TIME (default 90 seconds) + and CURLOPT_LOW_SPEED_LIMIT (100K). + + Signed-off-by: Mark Wielaard + +diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c +index 66ccb21..e5a2e82 100644 +--- a/debuginfod/debuginfod-client.c ++++ b/debuginfod/debuginfod-client.c +@@ -105,10 +105,9 @@ static const char *server_urls_envvar = DEBUGINFOD_URLS_ENV_VAR; + static const char *url_delim = " "; + static const char url_delim_char = ' '; + +-/* Timeout for debuginfods, in seconds. */ ++/* Timeout for debuginfods, in seconds (to get at least 100K). */ + static const char *server_timeout_envvar = DEBUGINFOD_TIMEOUT_ENV_VAR; +-static const long default_connect_timeout = 5; +-static const long default_transfer_timeout = -1; /* unlimited */ ++static const long default_timeout = 90; + + + /* Data associated with a particular CURL easy handle. Passed to +@@ -483,18 +482,10 @@ debuginfod_query_server (debuginfod_client *c, + return fd; + } + +- long connect_timeout = default_connect_timeout; +- long transfer_timeout = default_transfer_timeout; ++ long timeout = default_timeout; + const char* timeout_envvar = getenv(server_timeout_envvar); + if (timeout_envvar != NULL) +- { +- long ct, tt; +- rc = sscanf(timeout_envvar, "%ld,%ld", &ct, &tt); +- if (rc >= 1) +- connect_timeout = ct; +- if (rc >= 2) +- transfer_timeout = tt; +- } ++ timeout = atoi (timeout_envvar); + + /* make a copy of the envvar so it can be safely modified. */ + server_urls = strdup(urls_envvar); +@@ -586,10 +577,15 @@ debuginfod_query_server (debuginfod_client *c, + CURLOPT_WRITEFUNCTION, + debuginfod_write_callback); + curl_easy_setopt(data[i].handle, CURLOPT_WRITEDATA, (void*)&data[i]); +- if (connect_timeout >= 0) +- curl_easy_setopt(data[i].handle, CURLOPT_CONNECTTIMEOUT, connect_timeout); +- if (transfer_timeout >= 0) +- curl_easy_setopt(data[i].handle, CURLOPT_TIMEOUT, transfer_timeout); ++ if (timeout > 0) ++ { ++ /* Make sure there is at least some progress, ++ try to get at least 100K per timeout seconds. */ ++ curl_easy_setopt (data[i].handle, CURLOPT_LOW_SPEED_TIME, ++ timeout); ++ curl_easy_setopt (data[i].handle, CURLOPT_LOW_SPEED_LIMIT, ++ 100 * 1024L); ++ } + curl_easy_setopt(data[i].handle, CURLOPT_FILETIME, (long) 1); + curl_easy_setopt(data[i].handle, CURLOPT_FOLLOWLOCATION, (long) 1); + curl_easy_setopt(data[i].handle, CURLOPT_FAILONERROR, (long) 1); +diff --git a/doc/debuginfod-find.1 b/doc/debuginfod-find.1 +index 023acbb..e71ca29 100644 +--- a/doc/debuginfod-find.1 ++++ b/doc/debuginfod-find.1 +@@ -119,13 +119,10 @@ debuginfod instances. Alternate URL prefixes are separated by space. + + .TP 21 + .B DEBUGINFOD_TIMEOUT +-This environment variable governs the timeouts for each debuginfod +-HTTP connection. One or two comma-separated numbers may be given. +-The first is the number of seconds for the connection establishment +-(CURLOPT_CONNECTTIMEOUT), and the default is 5. The second is the +-number of seconds for the transfer completion (CURLOPT_TIMEOUT), and +-the default is no timeout. (Zero or negative also means "no +-timeout".) ++This environment variable governs the timeout for each debuginfod HTTP ++connection. A server that fails to provide at least 100K of data ++within this many seconds is skipped. The default is 90 seconds. (Zero ++or negative means "no timeout".) + + .TP 21 + .B DEBUGINFOD_CACHE_PATH +diff --git a/doc/debuginfod.8 b/doc/debuginfod.8 +index 342f524..6184bcc 100644 +--- a/doc/debuginfod.8 ++++ b/doc/debuginfod.8 +@@ -366,8 +366,10 @@ or indirectly - the results would be hilarious. + .TP 21 + .B DEBUGINFOD_TIMEOUT + This environment variable governs the timeout for each debuginfod HTTP +-connection. A server that fails to respond within this many seconds +-is skipped. The default is 5. ++connection. A server that fails to provide at least 100K of data ++within this many seconds is skipped. The default is 90 seconds. (Zero ++or negative means "no timeout".) ++ + + .TP 21 + .B DEBUGINFOD_CACHE_PATH +diff --git a/doc/debuginfod_find_debuginfo.3 b/doc/debuginfod_find_debuginfo.3 +index ea8c616..f6ea7a4 100644 +--- a/doc/debuginfod_find_debuginfo.3 ++++ b/doc/debuginfod_find_debuginfo.3 +@@ -163,13 +163,10 @@ debuginfod instances. Alternate URL prefixes are separated by space. + + .TP 21 + .B DEBUGINFOD_TIMEOUT +-This environment variable governs the timeouts for each debuginfod +-HTTP connection. One or two comma-separated numbers may be given. +-The first is the number of seconds for the connection establishment +-(CURLOPT_CONNECTTIMEOUT), and the default is 5. The second is the +-number of seconds for the transfer completion (CURLOPT_TIMEOUT), and +-the default is no timeout. (Zero or negative also means "no +-timeout".) ++This environment variable governs the timeout for each debuginfod HTTP ++connection. A server that fails to provide at least 100K of data ++within this many seconds is skipped. The default is 90 seconds. (Zero ++or negative means "no timeout".) + + .TP 21 + .B DEBUGINFOD_PROGRESS +diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh +index 90dafe0..4ab47a3 100755 +--- a/tests/run-debuginfod-find.sh ++++ b/tests/run-debuginfod-find.sh +@@ -94,7 +94,7 @@ wait_ready $PORT1 'ready' 1 + export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/ # or without trailing / + + # Be patient when run on a busy machine things might take a bit. +-export DEBUGINFOD_TIMEOUT=1,10 ++export DEBUGINFOD_TIMEOUT=10 + + # We use -t0 and -g0 here to turn off time-based scanning & grooming. + # For testing purposes, we just sic SIGUSR1 / SIGUSR2 at the process. + +commit 6f2098114a1acbd5e320a1c5fabfa07df02b14fd +Author: Mark Wielaard +Date: Fri Jan 10 15:46:29 2020 +0100 + + doc: Fix DEBUGINFOD_PROGRESS description to just mention output on stderr. + + An earlier variant of the default progress function could write to any + file. Which is still in the documentation. But the actual implementation + just uses stderr. Fix the documentation to match. + + Signed-off-by: Mark Wielaard + +diff --git a/doc/debuginfod_find_debuginfo.3 b/doc/debuginfod_find_debuginfo.3 +index f6ea7a4..7e5060f 100644 +--- a/doc/debuginfod_find_debuginfo.3 ++++ b/doc/debuginfod_find_debuginfo.3 +@@ -173,8 +173,8 @@ or negative means "no timeout".) + This environment variable governs the default progress function. If + set, and if a progressfn is not explicitly set, then the library will + configure a default progressfn. This function will append a simple +-progress message periodically to the given file. Consider using +-"/dev/stderr" on platforms that support it. The default is nothing. ++progress message periodically to stderr. The default is no progress ++function output. + + .TP 21 + .B DEBUGINFOD_CACHE_PATH diff --git a/elfutils.spec b/elfutils.spec index a2e31e1..1063735 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -58,6 +58,7 @@ Patch1: elfutils-0.178-pt-gnu-prop.patch Patch2: elfutils-0.178-debuginfod-no-cache.patch Patch3: elfutils-0.178-curl-code-gcc-10.patch Patch4: elfutils-0.178-compressed-vmlinuz.patch +Patch5: elfutils-0.178-debuginfod-timeoutprogress.patch %description Elfutils is a collection of utilities, including stack (to show @@ -253,6 +254,7 @@ such servers to download those files on demand. %patch2 -p1 -b .debuginfod-client-cache %patch3 -p1 -b .curl-gcc-10 %patch4 -p1 -b .vmlinuz +%patch5 -p1 -b .debuginfod-timeout-progress # In case the above patches added any new test scripts, make sure they # are executable. @@ -430,6 +432,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Fri Jan 10 2019 Mark Wielaard +- Add elfutils-0.178-debuginfod-timeoutprogress.patch + * Wed Dec 11 2019 Mark Wielaard - 0.178-6 - Add elfutils-0.178-curl-code-gcc-10.patch - Add elfutils-0.178-compressed-vmlinuz.patch From 336454e1d33c3538f1ac374ee078815d485ec626 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 10 Jan 2020 17:00:06 +0100 Subject: [PATCH 108/216] 0.178-7 - Add elfutils-0.178-libasm-ebl.patch --- elfutils-0.178-libasm-ebl.patch | 146 ++++++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 elfutils-0.178-libasm-ebl.patch diff --git a/elfutils-0.178-libasm-ebl.patch b/elfutils-0.178-libasm-ebl.patch new file mode 100644 index 0000000..784c62b --- /dev/null +++ b/elfutils-0.178-libasm-ebl.patch @@ -0,0 +1,146 @@ +commit 985550a5b24009e9cb9e511f6d320f3ac1b6bf99 +Author: Mark Wielaard +Date: Wed Jan 8 15:04:50 2020 +0100 + + libasm.h: Don't include libebl.h. Define an opaque Ebl handle. + + Using libasm isn't really usable without a way to create an Ebl handle. + But we don't support libebl.h (and libebl itself). Just define the + Ebl handle as an opaque struct. Code that uses it needs to figure out + how to instantiate one itself (they cannot in any supportable way...) + + Signed-off-by: Mark Wielaard + +diff --git a/libasm/libasm.h b/libasm/libasm.h +index 5c61224..a45c9fa 100644 +--- a/libasm/libasm.h ++++ b/libasm/libasm.h +@@ -32,7 +32,7 @@ + #include + #include + +-#include ++typedef struct ebl Ebl; + + + /* Opaque type for the assembler context descriptor. */ +diff --git a/libasm/libasmP.h b/libasm/libasmP.h +index 54460cf..a4703fc 100644 +--- a/libasm/libasmP.h ++++ b/libasm/libasmP.h +@@ -31,6 +31,7 @@ + + #include + ++#include "libebl.h" + #include + + #include "libdwelf.h" +diff --git a/tests/asm-tst1.c b/tests/asm-tst1.c +index 9afc676..cdf2a92 100644 +--- a/tests/asm-tst1.c ++++ b/tests/asm-tst1.c +@@ -20,6 +20,7 @@ + #endif + + #include ++#include ELFUTILS_HEADER(ebl) + #include ELFUTILS_HEADER(asm) + #include + #include +diff --git a/tests/asm-tst2.c b/tests/asm-tst2.c +index 2556d0c..9e88b70 100644 +--- a/tests/asm-tst2.c ++++ b/tests/asm-tst2.c +@@ -20,6 +20,7 @@ + #endif + + #include ++#include ELFUTILS_HEADER(ebl) + #include ELFUTILS_HEADER(asm) + #include + #include +diff --git a/tests/asm-tst3.c b/tests/asm-tst3.c +index e52cfbe..39c1d90 100644 +--- a/tests/asm-tst3.c ++++ b/tests/asm-tst3.c +@@ -20,6 +20,7 @@ + #endif + + #include ++#include ELFUTILS_HEADER(ebl) + #include ELFUTILS_HEADER(asm) + #include + #include +diff --git a/tests/asm-tst4.c b/tests/asm-tst4.c +index 52e9e20..5114938 100644 +--- a/tests/asm-tst4.c ++++ b/tests/asm-tst4.c +@@ -20,6 +20,7 @@ + #endif + + #include ++#include ELFUTILS_HEADER(ebl) + #include ELFUTILS_HEADER(asm) + #include + #include +diff --git a/tests/asm-tst5.c b/tests/asm-tst5.c +index 5a29b01..dcb852f 100644 +--- a/tests/asm-tst5.c ++++ b/tests/asm-tst5.c +@@ -20,6 +20,7 @@ + #endif + + #include ++#include ELFUTILS_HEADER(ebl) + #include ELFUTILS_HEADER(asm) + #include + #include +diff --git a/tests/asm-tst6.c b/tests/asm-tst6.c +index bd9b362..829cd90 100644 +--- a/tests/asm-tst6.c ++++ b/tests/asm-tst6.c +@@ -19,6 +19,7 @@ + # include + #endif + ++#include ELFUTILS_HEADER(ebl) + #include ELFUTILS_HEADER(asm) + #include + #include +diff --git a/tests/asm-tst7.c b/tests/asm-tst7.c +index 00cb2bf..9017976 100644 +--- a/tests/asm-tst7.c ++++ b/tests/asm-tst7.c +@@ -21,6 +21,7 @@ + + #include + #include ++#include ELFUTILS_HEADER(ebl) + #include ELFUTILS_HEADER(asm) + #include + #include +diff --git a/tests/asm-tst8.c b/tests/asm-tst8.c +index 4fb0d99..a65509f 100644 +--- a/tests/asm-tst8.c ++++ b/tests/asm-tst8.c +@@ -21,6 +21,7 @@ + + #include + #include ++#include ELFUTILS_HEADER(ebl) + #include ELFUTILS_HEADER(asm) + #include + #include +diff --git a/tests/asm-tst9.c b/tests/asm-tst9.c +index b6d0e43..681e872 100644 +--- a/tests/asm-tst9.c ++++ b/tests/asm-tst9.c +@@ -21,6 +21,7 @@ + + #include + #include ++#include ELFUTILS_HEADER(ebl) + #include ELFUTILS_HEADER(asm) + #include + #include diff --git a/elfutils.spec b/elfutils.spec index 1063735..659c997 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.178 -%global baserelease 6 +%global baserelease 7 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -59,6 +59,7 @@ Patch2: elfutils-0.178-debuginfod-no-cache.patch Patch3: elfutils-0.178-curl-code-gcc-10.patch Patch4: elfutils-0.178-compressed-vmlinuz.patch Patch5: elfutils-0.178-debuginfod-timeoutprogress.patch +Patch6: elfutils-0.178-libasm-ebl.patch %description Elfutils is a collection of utilities, including stack (to show @@ -255,6 +256,7 @@ such servers to download those files on demand. %patch3 -p1 -b .curl-gcc-10 %patch4 -p1 -b .vmlinuz %patch5 -p1 -b .debuginfod-timeout-progress +%patch6 -p1 -b .libasm-ebl # In case the above patches added any new test scripts, make sure they # are executable. @@ -432,8 +434,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog -* Fri Jan 10 2019 Mark Wielaard +* Fri Jan 10 2020 Mark Wielaard - 0.178-7 - Add elfutils-0.178-debuginfod-timeoutprogress.patch +- Add elfutils-0.178-libasm-ebl.patch * Wed Dec 11 2019 Mark Wielaard - 0.178-6 - Add elfutils-0.178-curl-code-gcc-10.patch From b001d1d27472b24a1a65ae20b78791116b2309a8 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 24 Jan 2020 22:50:04 +0100 Subject: [PATCH 109/216] 0.178-8 - Add elfutils-0.178-gcc10-null-dereference.patch --- elfutils-0.178-gcc10-null-dereference.patch | 38 +++++++++++++++++++++ elfutils.spec | 8 ++++- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.178-gcc10-null-dereference.patch diff --git a/elfutils-0.178-gcc10-null-dereference.patch b/elfutils-0.178-gcc10-null-dereference.patch new file mode 100644 index 0000000..b33c13d --- /dev/null +++ b/elfutils-0.178-gcc10-null-dereference.patch @@ -0,0 +1,38 @@ +diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c +index 48fb1ff0..0434f1e5 100644 +--- a/libdwfl/linux-kernel-modules.c ++++ b/libdwfl/linux-kernel-modules.c +@@ -176,9 +176,10 @@ find_kernel_elf (Dwfl *dwfl, const char *release, char **fname) + { + /* First try to find an uncompressed vmlinux image. Possibly + including debuginfo. */ +- if ((release[0] == '/' +- ? asprintf (fname, "%s/vmlinux", release) +- : asprintf (fname, "/boot/vmlinux-%s", release)) < 0) ++ if (release == NULL ++ || ((release[0] == '/' ++ ? asprintf (fname, "%s/vmlinux", release) ++ : asprintf (fname, "/boot/vmlinux-%s", release)) < 0)) + return -1; + + int fd = try_kernel_name (dwfl, fname, true); +@@ -241,6 +242,9 @@ report_kernel (Dwfl *dwfl, const char **release, + if (unlikely (result != 0)) + return result; + ++ if (release == NULL || *release == NULL) ++ return EINVAL; ++ + char *fname; + int fd = find_kernel_elf (dwfl, *release, &fname); + +@@ -296,6 +300,9 @@ report_kernel_archive (Dwfl *dwfl, const char **release, + if (unlikely (result != 0)) + return result; + ++ if (release == NULL || *release == NULL) ++ return EINVAL; ++ + char *archive; + int res = (((*release)[0] == '/') + ? asprintf (&archive, "%s/debug.a", *release) diff --git a/elfutils.spec b/elfutils.spec index 659c997..313742e 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.178 -%global baserelease 7 +%global baserelease 8 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -60,6 +60,7 @@ Patch3: elfutils-0.178-curl-code-gcc-10.patch Patch4: elfutils-0.178-compressed-vmlinuz.patch Patch5: elfutils-0.178-debuginfod-timeoutprogress.patch Patch6: elfutils-0.178-libasm-ebl.patch +Patch7: elfutils-0.178-gcc10-null-dereference.patch %description Elfutils is a collection of utilities, including stack (to show @@ -257,6 +258,7 @@ such servers to download those files on demand. %patch4 -p1 -b .vmlinuz %patch5 -p1 -b .debuginfod-timeout-progress %patch6 -p1 -b .libasm-ebl +%patch7 -p1 -b .null-deref-10 # In case the above patches added any new test scripts, make sure they # are executable. @@ -434,6 +436,10 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog + +* Fri Jan 24 2020 Mark Wielaard - 0.178-8 +- Add elfutils-0.178-gcc10-null-dereference.patch + * Fri Jan 10 2020 Mark Wielaard - 0.178-7 - Add elfutils-0.178-debuginfod-timeoutprogress.patch - Add elfutils-0.178-libasm-ebl.patch From 886f5d451cd622214cd2b41dc51ba983f7c352f4 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Tue, 28 Jan 2020 17:10:09 +0000 Subject: [PATCH 110/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_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 313742e..4e23b66 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.178 -%global baserelease 8 +%global baserelease 9 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -436,6 +436,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Tue Jan 28 2020 Fedora Release Engineering - 0.178-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + * Fri Jan 24 2020 Mark Wielaard - 0.178-8 - Add elfutils-0.178-gcc10-null-dereference.patch From 21eb5dd8d191c047e31270561483a8009d068394 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 30 Mar 2020 15:36:52 +0200 Subject: [PATCH 111/216] 0.179-1 - New upstream release. --- .gitignore | 1 + elfutils-0.178-compressed-vmlinuz.patch | 62 -- elfutils-0.178-curl-code-gcc-10.patch | 53 -- elfutils-0.178-debuginfod-no-cache.patch | 67 -- ...ils-0.178-debuginfod-timeoutprogress.patch | 593 ------------------ elfutils-0.178-gcc10-null-dereference.patch | 38 -- elfutils-0.178-libasm-ebl.patch | 146 ----- elfutils-0.178-pt-gnu-prop.patch | 18 - elfutils.spec | 68 +- sources | 2 +- 10 files changed, 51 insertions(+), 997 deletions(-) delete mode 100644 elfutils-0.178-compressed-vmlinuz.patch delete mode 100644 elfutils-0.178-curl-code-gcc-10.patch delete mode 100644 elfutils-0.178-debuginfod-no-cache.patch delete mode 100644 elfutils-0.178-debuginfod-timeoutprogress.patch delete mode 100644 elfutils-0.178-gcc10-null-dereference.patch delete mode 100644 elfutils-0.178-libasm-ebl.patch delete mode 100644 elfutils-0.178-pt-gnu-prop.patch diff --git a/.gitignore b/.gitignore index c1e968c..9f77f37 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ /elfutils-0.176.tar.bz2 /elfutils-0.177.tar.bz2 /elfutils-0.178.tar.bz2 +/elfutils-0.179.tar.bz2 diff --git a/elfutils-0.178-compressed-vmlinuz.patch b/elfutils-0.178-compressed-vmlinuz.patch deleted file mode 100644 index 1df54a1..0000000 --- a/elfutils-0.178-compressed-vmlinuz.patch +++ /dev/null @@ -1,62 +0,0 @@ -commit 4a90cb11140a6bb3712228861a32e4035013ad85 -Author: Mark Wielaard -Date: Thu Dec 5 15:03:54 2019 +0100 - - libdwfl: Find and handle compressed vmlinuz image. - - Both the dwfl_linux_kernel_find_elf callback and the - dwfl_linux_kernel_report_offline reporting function only handled - vmlinix images possibly compressed with .gz, .bz2 or .xz extension. - They did not find or handle the much more common vmlinuz compressed - images. - - It is not completely clear why we didn't up to now. Support for - compressed ELF files was added in 2009 and the code was updated to - to try to find the .gz, .bz2 or .xz extension variants in 2011. - But not the vmlinuz named variant. - - Reported-by: Aaron Merey - Tested-by: Frank Ch. Eigler - Signed-off-by: Mark Wielaard - -diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c -index d46ab5aa..48fb1ff0 100644 ---- a/libdwfl/linux-kernel-modules.c -+++ b/libdwfl/linux-kernel-modules.c -@@ -174,6 +174,8 @@ kernel_release (void) - static int - find_kernel_elf (Dwfl *dwfl, const char *release, char **fname) - { -+ /* First try to find an uncompressed vmlinux image. Possibly -+ including debuginfo. */ - if ((release[0] == '/' - ? asprintf (fname, "%s/vmlinux", release) - : asprintf (fname, "/boot/vmlinux-%s", release)) < 0) -@@ -188,6 +190,27 @@ find_kernel_elf (Dwfl *dwfl, const char *release, char **fname) - fd = try_kernel_name (dwfl, fname, true); - } - -+ /* There might be a compressed vmlinuz image. Probably without -+ debuginfo, but try to find it under the debug path also, just in -+ case. */ -+ if (fd < 0) -+ { -+ free (*fname); -+ if ((release[0] == '/' -+ ? asprintf (fname, "%s/vmlinuz", release) -+ : asprintf (fname, "/boot/vmlinuz-%s", release)) < 0) -+ return -1; -+ -+ fd = try_kernel_name (dwfl, fname, true); -+ if (fd < 0 && release[0] != '/') -+ { -+ free (*fname); -+ if (asprintf (fname, MODULEDIRFMT "/vmlinuz", release) < 0) -+ return -1; -+ fd = try_kernel_name (dwfl, fname, true); -+ } -+ } -+ - return fd; - } - diff --git a/elfutils-0.178-curl-code-gcc-10.patch b/elfutils-0.178-curl-code-gcc-10.patch deleted file mode 100644 index a1e2741..0000000 --- a/elfutils-0.178-curl-code-gcc-10.patch +++ /dev/null @@ -1,53 +0,0 @@ -commit 374fbed3da0197f794a904e78e75e961c7e2e92c -Author: Mark Wielaard -Date: Wed Dec 4 00:39:26 2019 +0100 - - debuginfod: Fix implicit conversion from 'CURLcode' to 'CURLMcode' - - GCC10 warns when converting the value of one enum type into another: - - debuginfod-client.c:530:24: error: implicit conversion from ‘CURLcode’ - to ‘CURLMcode’ [-Werror=enum-conversion] - 530 | curl_res = curl_easy_getinfo(target_handle, - | ^ - - libcurl has different error code enums. The "easy" interfaces return - a CURLcode error. The "multi" interface functions return a CURLMcode. - - Signed-off-by: Mark Wielaard - -diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c -index 6e62b86c..302ea2dc 100644 ---- a/debuginfod/debuginfod-client.c -+++ b/debuginfod/debuginfod-client.c -@@ -509,8 +509,6 @@ debuginfod_query_server (debuginfod_client *c, - long loops = 0; - do - { -- CURLMcode curl_res; -- - if (c->progressfn) /* inform/check progress callback */ - { - loops ++; -@@ -518,6 +516,7 @@ debuginfod_query_server (debuginfod_client *c, - long pb = 0; - if (target_handle) /* we've committed to a server; report its download progress */ - { -+ CURLcode curl_res; - #ifdef CURLINFO_SIZE_DOWNLOAD_T - curl_off_t dl; - curl_res = curl_easy_getinfo(target_handle, -@@ -564,10 +563,10 @@ debuginfod_query_server (debuginfod_client *c, - if (data[i].handle != target_handle) - curl_multi_remove_handle(curlm, data[i].handle); - -- curl_res = curl_multi_perform(curlm, &still_running); -- if (curl_res != CURLM_OK) -+ CURLMcode curlm_res = curl_multi_perform(curlm, &still_running); -+ if (curlm_res != CURLM_OK) - { -- switch (curl_res) -+ switch (curlm_res) - { - case CURLM_CALL_MULTI_PERFORM: continue; - case CURLM_OUT_OF_MEMORY: rc = -ENOMEM; break; diff --git a/elfutils-0.178-debuginfod-no-cache.patch b/elfutils-0.178-debuginfod-no-cache.patch deleted file mode 100644 index a05336b..0000000 --- a/elfutils-0.178-debuginfod-no-cache.patch +++ /dev/null @@ -1,67 +0,0 @@ -commit d8bad02afc7b7f30402b4e0e458df874a6d600da -Author: Mark Wielaard -Date: Mon Dec 9 19:38:19 2019 +0100 - - debuginfod: Check the DEBUGINFOD_URLS environment variable early in client. - - If the debuginfod-client isn't configured we should do as little - as possible. Simply return early with ENOSYS if no servers are - configured. This means we won't check - - This does change the behavior of the debuginfod_find calls slightly. - Previously we would setup and check the cache if the given build-id - was valid. Which might have provided a result if an earlier client - had run with the same cache and valid server URLs which knew about - that particular build-id. Now we don't return any cached results - unless at least one server is configured. - - This prevents selinux errors when the library is used in a confined - setup. - - Signed-off-by: Mark Wielaard - -diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c -index 302ea2dc..ab7b4e13 100644 ---- a/debuginfod/debuginfod-client.c -+++ b/debuginfod/debuginfod-client.c -@@ -301,6 +301,16 @@ debuginfod_query_server (debuginfod_client *c, - char target_cache_tmppath[PATH_MAX*5]; - char suffix[PATH_MAX*2]; - char build_id_bytes[MAX_BUILD_ID_BYTES * 2 + 1]; -+ int rc; -+ -+ /* Is there any server we can query? If not, don't do any work, -+ just return with ENOSYS. Don't even access the cache. */ -+ urls_envvar = getenv(server_urls_envvar); -+ if (urls_envvar == NULL || urls_envvar[0] == '\0') -+ { -+ rc = -ENOSYS; -+ goto out; -+ } - - /* Copy lowercase hex representation of build_id into buf. */ - if ((build_id_len >= MAX_BUILD_ID_BYTES) || -@@ -373,7 +383,7 @@ debuginfod_query_server (debuginfod_client *c, - /* XXX combine these */ - snprintf(interval_path, sizeof(interval_path), "%s/%s", cache_path, cache_clean_interval_filename); - snprintf(maxage_path, sizeof(maxage_path), "%s/%s", cache_path, cache_max_unused_age_filename); -- int rc = debuginfod_init_cache(cache_path, interval_path, maxage_path); -+ rc = debuginfod_init_cache(cache_path, interval_path, maxage_path); - if (rc != 0) - goto out; - rc = debuginfod_clean_cache(c, cache_path, interval_path, maxage_path); -@@ -390,14 +400,6 @@ debuginfod_query_server (debuginfod_client *c, - return fd; - } - -- -- urls_envvar = getenv(server_urls_envvar); -- if (urls_envvar == NULL || urls_envvar[0] == '\0') -- { -- rc = -ENOSYS; -- goto out; -- } -- - if (getenv(server_timeout_envvar)) - server_timeout = atoi (getenv(server_timeout_envvar)); - diff --git a/elfutils-0.178-debuginfod-timeoutprogress.patch b/elfutils-0.178-debuginfod-timeoutprogress.patch deleted file mode 100644 index 9e81e9e..0000000 --- a/elfutils-0.178-debuginfod-timeoutprogress.patch +++ /dev/null @@ -1,593 +0,0 @@ -commit 76ad56c430f0b85c47115688c511d9bd4fa671d4 -Author: Frank Ch. Eigler -Date: Wed Dec 4 15:51:12 2019 -0500 - - debuginfod: usability tweaks, incl. $DEBUGINFOD_PROGRESS client support - - This facility allows a default progress-printing function to be - installed if the given environment variable is set. Some larger usage - experience (systemtap fetching kernels) indicates the default timeout - is too short, so forked it into a connection timeout (default short) - and a transfer timeout (default unlimited). - - Signed-off-by: Frank Ch. Eigler - -diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c -index ab7b4e1..9a4a0e0 100644 ---- a/debuginfod/debuginfod-client.c -+++ b/debuginfod/debuginfod-client.c -@@ -40,6 +40,7 @@ - - #include "config.h" - #include "debuginfod.h" -+#include "system.h" - #include - #include - #include -@@ -98,16 +99,16 @@ static const time_t cache_default_max_unused_age_s = 604800; /* 1 week */ - static const char *cache_default_name = ".debuginfod_client_cache"; - static const char *cache_path_envvar = DEBUGINFOD_CACHE_PATH_ENV_VAR; - --/* URLs of debuginfods, separated by url_delim. -- This env var must be set for debuginfod-client to run. */ -+/* URLs of debuginfods, separated by url_delim. */ - static const char *server_urls_envvar = DEBUGINFOD_URLS_ENV_VAR; - static const char *url_delim = " "; - static const char url_delim_char = ' '; - --/* Timeout for debuginfods, in seconds. -- This env var must be set for debuginfod-client to run. */ -+/* Timeout for debuginfods, in seconds. */ - static const char *server_timeout_envvar = DEBUGINFOD_TIMEOUT_ENV_VAR; --static int server_timeout = 5; -+static const long default_connect_timeout = 5; -+static const long default_transfer_timeout = -1; /* unlimited */ -+ - - /* Data associated with a particular CURL easy handle. Passed to - the write callback. */ -@@ -400,8 +401,18 @@ debuginfod_query_server (debuginfod_client *c, - return fd; - } - -- if (getenv(server_timeout_envvar)) -- server_timeout = atoi (getenv(server_timeout_envvar)); -+ long connect_timeout = default_connect_timeout; -+ long transfer_timeout = default_transfer_timeout; -+ const char* timeout_envvar = getenv(server_timeout_envvar); -+ if (timeout_envvar != NULL) -+ { -+ long ct, tt; -+ rc = sscanf(timeout_envvar, "%ld,%ld", &ct, &tt); -+ if (rc >= 1) -+ connect_timeout = ct; -+ if (rc >= 2) -+ transfer_timeout = tt; -+ } - - /* make a copy of the envvar so it can be safely modified. */ - server_urls = strdup(urls_envvar); -@@ -493,7 +504,10 @@ debuginfod_query_server (debuginfod_client *c, - CURLOPT_WRITEFUNCTION, - debuginfod_write_callback); - curl_easy_setopt(data[i].handle, CURLOPT_WRITEDATA, (void*)&data[i]); -- curl_easy_setopt(data[i].handle, CURLOPT_TIMEOUT, (long) server_timeout); -+ if (connect_timeout >= 0) -+ curl_easy_setopt(data[i].handle, CURLOPT_CONNECTTIMEOUT, connect_timeout); -+ if (transfer_timeout >= 0) -+ curl_easy_setopt(data[i].handle, CURLOPT_TIMEOUT, transfer_timeout); - curl_easy_setopt(data[i].handle, CURLOPT_FILETIME, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_FOLLOWLOCATION, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_FAILONERROR, (long) 1); -@@ -511,11 +525,32 @@ debuginfod_query_server (debuginfod_client *c, - long loops = 0; - do - { -+ /* Wait 1 second, the minimum DEBUGINFOD_TIMEOUT. */ -+ curl_multi_wait(curlm, NULL, 0, 1000, NULL); -+ -+ /* If the target file has been found, abort the other queries. */ -+ if (target_handle != NULL) -+ for (int i = 0; i < num_urls; i++) -+ if (data[i].handle != target_handle) -+ curl_multi_remove_handle(curlm, data[i].handle); -+ -+ CURLMcode curlm_res = curl_multi_perform(curlm, &still_running); -+ if (curlm_res != CURLM_OK) -+ { -+ switch (curlm_res) -+ { -+ case CURLM_CALL_MULTI_PERFORM: continue; -+ case CURLM_OUT_OF_MEMORY: rc = -ENOMEM; break; -+ default: rc = -ENETUNREACH; break; -+ } -+ goto out1; -+ } -+ - if (c->progressfn) /* inform/check progress callback */ - { - loops ++; - long pa = loops; /* default params for progress callback */ -- long pb = 0; -+ long pb = 0; /* transfer_timeout tempting, but loops != elapsed-time */ - if (target_handle) /* we've committed to a server; report its download progress */ - { - CURLcode curl_res; -@@ -535,6 +570,8 @@ debuginfod_query_server (debuginfod_client *c, - pa = (dl > LONG_MAX ? LONG_MAX : (long)dl); - #endif - -+ /* NB: If going through deflate-compressing proxies, this -+ number is likely to be unavailable, so -1 may show. */ - #ifdef CURLINFO_CURLINFO_CONTENT_LENGTH_DOWNLOAD_T - curl_off_t cl; - curl_res = curl_easy_getinfo(target_handle, -@@ -555,27 +592,6 @@ debuginfod_query_server (debuginfod_client *c, - if ((*c->progressfn) (c, pa, pb)) - break; - } -- -- /* Wait 1 second, the minimum DEBUGINFOD_TIMEOUT. */ -- curl_multi_wait(curlm, NULL, 0, 1000, NULL); -- -- /* If the target file has been found, abort the other queries. */ -- if (target_handle != NULL) -- for (int i = 0; i < num_urls; i++) -- if (data[i].handle != target_handle) -- curl_multi_remove_handle(curlm, data[i].handle); -- -- CURLMcode curlm_res = curl_multi_perform(curlm, &still_running); -- if (curlm_res != CURLM_OK) -- { -- switch (curlm_res) -- { -- case CURLM_CALL_MULTI_PERFORM: continue; -- case CURLM_OUT_OF_MEMORY: rc = -ENOMEM; break; -- default: rc = -ENETUNREACH; break; -- } -- goto out1; -- } - } while (still_running); - - /* Check whether a query was successful. If so, assign its handle -@@ -674,9 +690,9 @@ debuginfod_query_server (debuginfod_client *c, - - curl_multi_cleanup(curlm); - unlink (target_cache_tmppath); -+ close (fd); /* before the rmdir, otherwise it'll fail */ - (void) rmdir (target_cache_dir); /* nop if not empty */ - free(data); -- close (fd); - - out0: - free (server_urls); -@@ -685,6 +701,22 @@ debuginfod_query_server (debuginfod_client *c, - return rc; - } - -+ -+/* Activate a basic form of progress tracing */ -+static int -+default_progressfn (debuginfod_client *c, long a, long b) -+{ -+ (void) c; -+ -+ dprintf(STDERR_FILENO, -+ "Downloading from debuginfod %ld/%ld%s", a, b, -+ ((a == b) ? "\n" : "\r")); -+ /* XXX: include URL - stateful */ -+ -+ return 0; -+} -+ -+ - /* See debuginfod.h */ - debuginfod_client * - debuginfod_begin (void) -@@ -693,7 +725,12 @@ debuginfod_begin (void) - size_t size = sizeof (struct debuginfod_client); - client = (debuginfod_client *) malloc (size); - if (client != NULL) -- client->progressfn = NULL; -+ { -+ if (getenv(DEBUGINFOD_PROGRESS_ENV_VAR)) -+ client->progressfn = default_progressfn; -+ else -+ client->progressfn = NULL; -+ } - return client; - } - -diff --git a/debuginfod/debuginfod.h b/debuginfod/debuginfod.h -index 6b1b1cc..33fae86 100644 ---- a/debuginfod/debuginfod.h -+++ b/debuginfod/debuginfod.h -@@ -33,6 +33,7 @@ - #define DEBUGINFOD_URLS_ENV_VAR "DEBUGINFOD_URLS" - #define DEBUGINFOD_CACHE_PATH_ENV_VAR "DEBUGINFOD_CACHE_PATH" - #define DEBUGINFOD_TIMEOUT_ENV_VAR "DEBUGINFOD_TIMEOUT" -+#define DEBUGINFOD_PROGRESS_ENV_VAR "DEBUGINFOD_PROGRESS" - - /* Handle for debuginfod-client connection. */ - typedef struct debuginfod_client debuginfod_client; -diff --git a/doc/debuginfod-find.1 b/doc/debuginfod-find.1 -index a759ecb..023acbb 100644 ---- a/doc/debuginfod-find.1 -+++ b/doc/debuginfod-find.1 -@@ -119,9 +119,13 @@ debuginfod instances. Alternate URL prefixes are separated by space. - - .TP 21 - .B DEBUGINFOD_TIMEOUT --This environment variable governs the timeout for each debuginfod HTTP --connection. A server that fails to respond within this many seconds --is skipped. The default is 5. -+This environment variable governs the timeouts for each debuginfod -+HTTP connection. One or two comma-separated numbers may be given. -+The first is the number of seconds for the connection establishment -+(CURLOPT_CONNECTTIMEOUT), and the default is 5. The second is the -+number of seconds for the transfer completion (CURLOPT_TIMEOUT), and -+the default is no timeout. (Zero or negative also means "no -+timeout".) - - .TP 21 - .B DEBUGINFOD_CACHE_PATH -diff --git a/doc/debuginfod_find_debuginfo.3 b/doc/debuginfod_find_debuginfo.3 -index be8eed0..ea8c616 100644 ---- a/doc/debuginfod_find_debuginfo.3 -+++ b/doc/debuginfod_find_debuginfo.3 -@@ -163,9 +163,21 @@ debuginfod instances. Alternate URL prefixes are separated by space. - - .TP 21 - .B DEBUGINFOD_TIMEOUT --This environment variable governs the timeout for each debuginfod HTTP --connection. A server that fails to respond within this many seconds --is skipped. The default is 5. -+This environment variable governs the timeouts for each debuginfod -+HTTP connection. One or two comma-separated numbers may be given. -+The first is the number of seconds for the connection establishment -+(CURLOPT_CONNECTTIMEOUT), and the default is 5. The second is the -+number of seconds for the transfer completion (CURLOPT_TIMEOUT), and -+the default is no timeout. (Zero or negative also means "no -+timeout".) -+ -+.TP 21 -+.B DEBUGINFOD_PROGRESS -+This environment variable governs the default progress function. If -+set, and if a progressfn is not explicitly set, then the library will -+configure a default progressfn. This function will append a simple -+progress message periodically to the given file. Consider using -+"/dev/stderr" on platforms that support it. The default is nothing. - - .TP 21 - .B DEBUGINFOD_CACHE_PATH -diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh -index 6533996..4cf6138 100755 ---- a/tests/run-debuginfod-find.sh -+++ b/tests/run-debuginfod-find.sh -@@ -89,7 +89,7 @@ wait_ready $PORT1 'ready' 1 - export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/ # or without trailing / - - # Be patient when run on a busy machine things might take a bit. --export DEBUGINFOD_TIMEOUT=10 -+export DEBUGINFOD_TIMEOUT=1,10 - - # We use -t0 and -g0 here to turn off time-based scanning & grooming. - # For testing purposes, we just sic SIGUSR1 / SIGUSR2 at the process. -@@ -153,8 +153,11 @@ cmp $filename F/prog2 - cat vlog - grep -q Progress vlog - tempfiles vlog --filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2` -+filename=`testrun env DEBUGINFOD_PROGRESS=1 ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2 2>vlog2` - cmp $filename F/prog2 -+cat vlog2 -+grep -q Downloading vlog2 -+tempfiles vlog2 - filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID2 ${PWD}/prog2.c` - cmp $filename ${PWD}/prog2.c - - -commit 288c76775f2d27976eb269e568b53c742d973dbc -Author: Frank Ch. Eigler -Date: Mon Jan 6 04:29:21 2020 -0500 - - debuginfod: pass a distro-summary User-Agent request header - - It may be useful for a debuginfod server operator to know what kinds - of clients make webapi requests. This is mainly as a - telemetry/diagnostic (though the data cannot be really trusted). It - may also be useful to automate downloading of distro packages to a - debuginfod server in the case of an unknown hex buildid. doc/testing - not affected as these are diagnostics. - - Signed-off-by: Frank Ch. Eigler - Signed-off-by: Mark Wielaard - -diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c -index 9a4a0e0..66ccb21 100644 ---- a/debuginfod/debuginfod-client.c -+++ b/debuginfod/debuginfod-client.c -@@ -1,5 +1,5 @@ - /* Retrieve ELF / DWARF / source files from the debuginfod. -- Copyright (C) 2019 Red Hat, Inc. -+ Copyright (C) 2019-2020 Red Hat, Inc. - This file is part of elfutils. - - This file is free software; you can redistribute it and/or modify -@@ -58,6 +58,7 @@ - #include - #include - #include -+#include - #include - - /* If fts.h is included before config.h, its indirect inclusions may not -@@ -279,6 +280,87 @@ debuginfod_clean_cache(debuginfod_client *c, - #define MAX_BUILD_ID_BYTES 64 - - -+static void -+add_extra_headers(CURL *handle) -+{ -+ /* Compute a User-Agent: string to send. The more accurately this -+ describes this host, the likelier that the debuginfod servers -+ might be able to locate debuginfo for us. */ -+ -+ char* utspart = NULL; -+ struct utsname uts; -+ int rc = 0; -+ rc = uname (&uts); -+ if (rc == 0) -+ rc = asprintf(& utspart, "%s/%s", uts.sysname, uts.machine); -+ if (rc < 0) -+ utspart = NULL; -+ -+ FILE *f = fopen ("/etc/os-release", "r"); -+ if (f == NULL) -+ f = fopen ("/usr/lib/os-release", "r"); -+ char *id = NULL; -+ char *version = NULL; -+ if (f != NULL) -+ { -+ while (id == NULL || version == NULL) -+ { -+ char buf[128]; -+ char *s = &buf[0]; -+ if (fgets (s, sizeof(buf), f) == NULL) -+ break; -+ -+ int len = strlen (s); -+ if (len < 3) -+ continue; -+ if (s[len - 1] == '\n') -+ { -+ s[len - 1] = '\0'; -+ len--; -+ } -+ -+ char *v = strchr (s, '='); -+ if (v == NULL || strlen (v) < 2) -+ continue; -+ -+ /* Split var and value. */ -+ *v = '\0'; -+ v++; -+ -+ /* Remove optional quotes around value string. */ -+ if (*v == '"' || *v == '\'') -+ { -+ v++; -+ s[len - 1] = '\0'; -+ } -+ if (strcmp (s, "ID") == 0) -+ id = strdup (v); -+ if (strcmp (s, "VERSION_ID") == 0) -+ version = strdup (v); -+ } -+ fclose (f); -+ } -+ -+ char *ua = NULL; -+ rc = asprintf(& ua, "%s/%s,%s,%s/%s", -+ PACKAGE_NAME, PACKAGE_VERSION, -+ utspart ?: "", -+ id ?: "", -+ version ?: ""); -+ if (rc < 0) -+ ua = NULL; -+ -+ if (ua) -+ curl_easy_setopt(handle, CURLOPT_USERAGENT, (void*) ua); /* implicit strdup */ -+ -+ free (ua); -+ free (id); -+ free (version); -+ free (utspart); -+} -+ -+ -+ - /* Query each of the server URLs found in $DEBUGINFOD_URLS for the file - with the specified build-id, type (debuginfo, executable or source) - and filename. filename may be NULL. If found, return a file -@@ -514,7 +596,7 @@ debuginfod_query_server (debuginfod_client *c, - curl_easy_setopt(data[i].handle, CURLOPT_NOSIGNAL, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_AUTOREFERER, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_ACCEPT_ENCODING, ""); -- curl_easy_setopt(data[i].handle, CURLOPT_USERAGENT, (void*) PACKAGE_STRING); -+ add_extra_headers(data[i].handle); - - curl_multi_add_handle(curlm, data[i].handle); - server_url = strtok_r(NULL, url_delim, &strtok_saveptr); - -commit b8d85ed024a745cff05e56c6337d95d654d5294a -Author: Mark Wielaard -Date: Thu Jan 2 17:02:42 2020 +0100 - - debuginfod: Use DEBUGINFOD_TIMEOUT as seconds to get at least 100K. - - Use just one timeout using CURLOPT_LOW_SPEED_TIME (default 90 seconds) - and CURLOPT_LOW_SPEED_LIMIT (100K). - - Signed-off-by: Mark Wielaard - -diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c -index 66ccb21..e5a2e82 100644 ---- a/debuginfod/debuginfod-client.c -+++ b/debuginfod/debuginfod-client.c -@@ -105,10 +105,9 @@ static const char *server_urls_envvar = DEBUGINFOD_URLS_ENV_VAR; - static const char *url_delim = " "; - static const char url_delim_char = ' '; - --/* Timeout for debuginfods, in seconds. */ -+/* Timeout for debuginfods, in seconds (to get at least 100K). */ - static const char *server_timeout_envvar = DEBUGINFOD_TIMEOUT_ENV_VAR; --static const long default_connect_timeout = 5; --static const long default_transfer_timeout = -1; /* unlimited */ -+static const long default_timeout = 90; - - - /* Data associated with a particular CURL easy handle. Passed to -@@ -483,18 +482,10 @@ debuginfod_query_server (debuginfod_client *c, - return fd; - } - -- long connect_timeout = default_connect_timeout; -- long transfer_timeout = default_transfer_timeout; -+ long timeout = default_timeout; - const char* timeout_envvar = getenv(server_timeout_envvar); - if (timeout_envvar != NULL) -- { -- long ct, tt; -- rc = sscanf(timeout_envvar, "%ld,%ld", &ct, &tt); -- if (rc >= 1) -- connect_timeout = ct; -- if (rc >= 2) -- transfer_timeout = tt; -- } -+ timeout = atoi (timeout_envvar); - - /* make a copy of the envvar so it can be safely modified. */ - server_urls = strdup(urls_envvar); -@@ -586,10 +577,15 @@ debuginfod_query_server (debuginfod_client *c, - CURLOPT_WRITEFUNCTION, - debuginfod_write_callback); - curl_easy_setopt(data[i].handle, CURLOPT_WRITEDATA, (void*)&data[i]); -- if (connect_timeout >= 0) -- curl_easy_setopt(data[i].handle, CURLOPT_CONNECTTIMEOUT, connect_timeout); -- if (transfer_timeout >= 0) -- curl_easy_setopt(data[i].handle, CURLOPT_TIMEOUT, transfer_timeout); -+ if (timeout > 0) -+ { -+ /* Make sure there is at least some progress, -+ try to get at least 100K per timeout seconds. */ -+ curl_easy_setopt (data[i].handle, CURLOPT_LOW_SPEED_TIME, -+ timeout); -+ curl_easy_setopt (data[i].handle, CURLOPT_LOW_SPEED_LIMIT, -+ 100 * 1024L); -+ } - curl_easy_setopt(data[i].handle, CURLOPT_FILETIME, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_FOLLOWLOCATION, (long) 1); - curl_easy_setopt(data[i].handle, CURLOPT_FAILONERROR, (long) 1); -diff --git a/doc/debuginfod-find.1 b/doc/debuginfod-find.1 -index 023acbb..e71ca29 100644 ---- a/doc/debuginfod-find.1 -+++ b/doc/debuginfod-find.1 -@@ -119,13 +119,10 @@ debuginfod instances. Alternate URL prefixes are separated by space. - - .TP 21 - .B DEBUGINFOD_TIMEOUT --This environment variable governs the timeouts for each debuginfod --HTTP connection. One or two comma-separated numbers may be given. --The first is the number of seconds for the connection establishment --(CURLOPT_CONNECTTIMEOUT), and the default is 5. The second is the --number of seconds for the transfer completion (CURLOPT_TIMEOUT), and --the default is no timeout. (Zero or negative also means "no --timeout".) -+This environment variable governs the timeout for each debuginfod HTTP -+connection. A server that fails to provide at least 100K of data -+within this many seconds is skipped. The default is 90 seconds. (Zero -+or negative means "no timeout".) - - .TP 21 - .B DEBUGINFOD_CACHE_PATH -diff --git a/doc/debuginfod.8 b/doc/debuginfod.8 -index 342f524..6184bcc 100644 ---- a/doc/debuginfod.8 -+++ b/doc/debuginfod.8 -@@ -366,8 +366,10 @@ or indirectly - the results would be hilarious. - .TP 21 - .B DEBUGINFOD_TIMEOUT - This environment variable governs the timeout for each debuginfod HTTP --connection. A server that fails to respond within this many seconds --is skipped. The default is 5. -+connection. A server that fails to provide at least 100K of data -+within this many seconds is skipped. The default is 90 seconds. (Zero -+or negative means "no timeout".) -+ - - .TP 21 - .B DEBUGINFOD_CACHE_PATH -diff --git a/doc/debuginfod_find_debuginfo.3 b/doc/debuginfod_find_debuginfo.3 -index ea8c616..f6ea7a4 100644 ---- a/doc/debuginfod_find_debuginfo.3 -+++ b/doc/debuginfod_find_debuginfo.3 -@@ -163,13 +163,10 @@ debuginfod instances. Alternate URL prefixes are separated by space. - - .TP 21 - .B DEBUGINFOD_TIMEOUT --This environment variable governs the timeouts for each debuginfod --HTTP connection. One or two comma-separated numbers may be given. --The first is the number of seconds for the connection establishment --(CURLOPT_CONNECTTIMEOUT), and the default is 5. The second is the --number of seconds for the transfer completion (CURLOPT_TIMEOUT), and --the default is no timeout. (Zero or negative also means "no --timeout".) -+This environment variable governs the timeout for each debuginfod HTTP -+connection. A server that fails to provide at least 100K of data -+within this many seconds is skipped. The default is 90 seconds. (Zero -+or negative means "no timeout".) - - .TP 21 - .B DEBUGINFOD_PROGRESS -diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh -index 90dafe0..4ab47a3 100755 ---- a/tests/run-debuginfod-find.sh -+++ b/tests/run-debuginfod-find.sh -@@ -94,7 +94,7 @@ wait_ready $PORT1 'ready' 1 - export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/ # or without trailing / - - # Be patient when run on a busy machine things might take a bit. --export DEBUGINFOD_TIMEOUT=1,10 -+export DEBUGINFOD_TIMEOUT=10 - - # We use -t0 and -g0 here to turn off time-based scanning & grooming. - # For testing purposes, we just sic SIGUSR1 / SIGUSR2 at the process. - -commit 6f2098114a1acbd5e320a1c5fabfa07df02b14fd -Author: Mark Wielaard -Date: Fri Jan 10 15:46:29 2020 +0100 - - doc: Fix DEBUGINFOD_PROGRESS description to just mention output on stderr. - - An earlier variant of the default progress function could write to any - file. Which is still in the documentation. But the actual implementation - just uses stderr. Fix the documentation to match. - - Signed-off-by: Mark Wielaard - -diff --git a/doc/debuginfod_find_debuginfo.3 b/doc/debuginfod_find_debuginfo.3 -index f6ea7a4..7e5060f 100644 ---- a/doc/debuginfod_find_debuginfo.3 -+++ b/doc/debuginfod_find_debuginfo.3 -@@ -173,8 +173,8 @@ or negative means "no timeout".) - This environment variable governs the default progress function. If - set, and if a progressfn is not explicitly set, then the library will - configure a default progressfn. This function will append a simple --progress message periodically to the given file. Consider using --"/dev/stderr" on platforms that support it. The default is nothing. -+progress message periodically to stderr. The default is no progress -+function output. - - .TP 21 - .B DEBUGINFOD_CACHE_PATH diff --git a/elfutils-0.178-gcc10-null-dereference.patch b/elfutils-0.178-gcc10-null-dereference.patch deleted file mode 100644 index b33c13d..0000000 --- a/elfutils-0.178-gcc10-null-dereference.patch +++ /dev/null @@ -1,38 +0,0 @@ -diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c -index 48fb1ff0..0434f1e5 100644 ---- a/libdwfl/linux-kernel-modules.c -+++ b/libdwfl/linux-kernel-modules.c -@@ -176,9 +176,10 @@ find_kernel_elf (Dwfl *dwfl, const char *release, char **fname) - { - /* First try to find an uncompressed vmlinux image. Possibly - including debuginfo. */ -- if ((release[0] == '/' -- ? asprintf (fname, "%s/vmlinux", release) -- : asprintf (fname, "/boot/vmlinux-%s", release)) < 0) -+ if (release == NULL -+ || ((release[0] == '/' -+ ? asprintf (fname, "%s/vmlinux", release) -+ : asprintf (fname, "/boot/vmlinux-%s", release)) < 0)) - return -1; - - int fd = try_kernel_name (dwfl, fname, true); -@@ -241,6 +242,9 @@ report_kernel (Dwfl *dwfl, const char **release, - if (unlikely (result != 0)) - return result; - -+ if (release == NULL || *release == NULL) -+ return EINVAL; -+ - char *fname; - int fd = find_kernel_elf (dwfl, *release, &fname); - -@@ -296,6 +300,9 @@ report_kernel_archive (Dwfl *dwfl, const char **release, - if (unlikely (result != 0)) - return result; - -+ if (release == NULL || *release == NULL) -+ return EINVAL; -+ - char *archive; - int res = (((*release)[0] == '/') - ? asprintf (&archive, "%s/debug.a", *release) diff --git a/elfutils-0.178-libasm-ebl.patch b/elfutils-0.178-libasm-ebl.patch deleted file mode 100644 index 784c62b..0000000 --- a/elfutils-0.178-libasm-ebl.patch +++ /dev/null @@ -1,146 +0,0 @@ -commit 985550a5b24009e9cb9e511f6d320f3ac1b6bf99 -Author: Mark Wielaard -Date: Wed Jan 8 15:04:50 2020 +0100 - - libasm.h: Don't include libebl.h. Define an opaque Ebl handle. - - Using libasm isn't really usable without a way to create an Ebl handle. - But we don't support libebl.h (and libebl itself). Just define the - Ebl handle as an opaque struct. Code that uses it needs to figure out - how to instantiate one itself (they cannot in any supportable way...) - - Signed-off-by: Mark Wielaard - -diff --git a/libasm/libasm.h b/libasm/libasm.h -index 5c61224..a45c9fa 100644 ---- a/libasm/libasm.h -+++ b/libasm/libasm.h -@@ -32,7 +32,7 @@ - #include - #include - --#include -+typedef struct ebl Ebl; - - - /* Opaque type for the assembler context descriptor. */ -diff --git a/libasm/libasmP.h b/libasm/libasmP.h -index 54460cf..a4703fc 100644 ---- a/libasm/libasmP.h -+++ b/libasm/libasmP.h -@@ -31,6 +31,7 @@ - - #include - -+#include "libebl.h" - #include - - #include "libdwelf.h" -diff --git a/tests/asm-tst1.c b/tests/asm-tst1.c -index 9afc676..cdf2a92 100644 ---- a/tests/asm-tst1.c -+++ b/tests/asm-tst1.c -@@ -20,6 +20,7 @@ - #endif - - #include -+#include ELFUTILS_HEADER(ebl) - #include ELFUTILS_HEADER(asm) - #include - #include -diff --git a/tests/asm-tst2.c b/tests/asm-tst2.c -index 2556d0c..9e88b70 100644 ---- a/tests/asm-tst2.c -+++ b/tests/asm-tst2.c -@@ -20,6 +20,7 @@ - #endif - - #include -+#include ELFUTILS_HEADER(ebl) - #include ELFUTILS_HEADER(asm) - #include - #include -diff --git a/tests/asm-tst3.c b/tests/asm-tst3.c -index e52cfbe..39c1d90 100644 ---- a/tests/asm-tst3.c -+++ b/tests/asm-tst3.c -@@ -20,6 +20,7 @@ - #endif - - #include -+#include ELFUTILS_HEADER(ebl) - #include ELFUTILS_HEADER(asm) - #include - #include -diff --git a/tests/asm-tst4.c b/tests/asm-tst4.c -index 52e9e20..5114938 100644 ---- a/tests/asm-tst4.c -+++ b/tests/asm-tst4.c -@@ -20,6 +20,7 @@ - #endif - - #include -+#include ELFUTILS_HEADER(ebl) - #include ELFUTILS_HEADER(asm) - #include - #include -diff --git a/tests/asm-tst5.c b/tests/asm-tst5.c -index 5a29b01..dcb852f 100644 ---- a/tests/asm-tst5.c -+++ b/tests/asm-tst5.c -@@ -20,6 +20,7 @@ - #endif - - #include -+#include ELFUTILS_HEADER(ebl) - #include ELFUTILS_HEADER(asm) - #include - #include -diff --git a/tests/asm-tst6.c b/tests/asm-tst6.c -index bd9b362..829cd90 100644 ---- a/tests/asm-tst6.c -+++ b/tests/asm-tst6.c -@@ -19,6 +19,7 @@ - # include - #endif - -+#include ELFUTILS_HEADER(ebl) - #include ELFUTILS_HEADER(asm) - #include - #include -diff --git a/tests/asm-tst7.c b/tests/asm-tst7.c -index 00cb2bf..9017976 100644 ---- a/tests/asm-tst7.c -+++ b/tests/asm-tst7.c -@@ -21,6 +21,7 @@ - - #include - #include -+#include ELFUTILS_HEADER(ebl) - #include ELFUTILS_HEADER(asm) - #include - #include -diff --git a/tests/asm-tst8.c b/tests/asm-tst8.c -index 4fb0d99..a65509f 100644 ---- a/tests/asm-tst8.c -+++ b/tests/asm-tst8.c -@@ -21,6 +21,7 @@ - - #include - #include -+#include ELFUTILS_HEADER(ebl) - #include ELFUTILS_HEADER(asm) - #include - #include -diff --git a/tests/asm-tst9.c b/tests/asm-tst9.c -index b6d0e43..681e872 100644 ---- a/tests/asm-tst9.c -+++ b/tests/asm-tst9.c -@@ -21,6 +21,7 @@ - - #include - #include -+#include ELFUTILS_HEADER(ebl) - #include ELFUTILS_HEADER(asm) - #include - #include diff --git a/elfutils-0.178-pt-gnu-prop.patch b/elfutils-0.178-pt-gnu-prop.patch deleted file mode 100644 index 917765b..0000000 --- a/elfutils-0.178-pt-gnu-prop.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff --git a/src/elflint.c b/src/elflint.c -index 810c8bd..1acf1bc 100644 ---- a/src/elflint.c -+++ b/src/elflint.c -@@ -4483,8 +4483,13 @@ only executables, shared objects, and core files can have program headers\n")); - continue; - } - -+#ifndef PT_GNU_PROPERTY -+#define PT_GNU_PROPERTY (PT_LOOS + 0x474e553) -+#endif -+ - if (phdr->p_type >= PT_NUM && phdr->p_type != PT_GNU_EH_FRAME - && phdr->p_type != PT_GNU_STACK && phdr->p_type != PT_GNU_RELRO -+ && phdr->p_type != PT_GNU_PROPERTY - /* Check for a known machine-specific type. */ - && ebl_segment_type_name (ebl, phdr->p_type, NULL, 0) == NULL) - ERROR (gettext ("\ diff --git a/elfutils.spec b/elfutils.spec index 4e23b66..7e59ae4 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils -Version: 0.178 -%global baserelease 9 +Version: 0.179 +%global baserelease 1 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -42,6 +42,7 @@ BuildRequires: pkgconfig(libarchive) >= 3.1.2 BuildRequires: bzip2 # For the run-debuginfod-find.sh test case in %check for /usr/sbin/ss BuildRequires: iproute +BuildRequires: bsdtar BuildRequires: curl %global _gnu %{nil} @@ -54,13 +55,6 @@ BuildRequires: curl %endif # Patches -Patch1: elfutils-0.178-pt-gnu-prop.patch -Patch2: elfutils-0.178-debuginfod-no-cache.patch -Patch3: elfutils-0.178-curl-code-gcc-10.patch -Patch4: elfutils-0.178-compressed-vmlinuz.patch -Patch5: elfutils-0.178-debuginfod-timeoutprogress.patch -Patch6: elfutils-0.178-libasm-ebl.patch -Patch7: elfutils-0.178-gcc10-null-dereference.patch %description Elfutils is a collection of utilities, including stack (to show @@ -228,8 +222,8 @@ Requires(post): systemd Requires(preun): systemd Requires(postun): systemd Requires(pre): shadow-utils -# For /usr/bin/cpio2rpm -Requires: rpm +# To extract .deb files with a bsdtar (= libarchive) subshell +Requires: bsdtar %description debuginfod-client The elfutils-debuginfod-client package contains shared libraries @@ -252,13 +246,6 @@ such servers to download those files on demand. %setup -q # Apply patches -%patch1 -p1 -b .pt-gnu-prop -%patch2 -p1 -b .debuginfod-client-cache -%patch3 -p1 -b .curl-gcc-10 -%patch4 -p1 -b .vmlinuz -%patch5 -p1 -b .debuginfod-timeout-progress -%patch6 -p1 -b .libasm-ebl -%patch7 -p1 -b .null-deref-10 # In case the above patches added any new test scripts, make sure they # are executable. @@ -436,10 +423,53 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Mar 30 2020 Mark Wielaard - 0.179-1 +- New upstream release. + debuginfod-client: + - When DEBUGINFOD_PROGRESS is set and the program doesn't + install its own debuginfod_progressfn_t show download + progress on stderr. + - DEBUGINFOD_TIMEOUT is now defined as seconds to get at + least 100K, defaults to 90 seconds. + - Default to $XDG_CACHE_HOME/debuginfod_client. + - New functions debuginfod_set_user_data, + debuginfod_get_user_data, debuginfod_get_url and + debuginfod_add_http_header. + - Support for file:// URLs. + + debuginfod: + - Performance improvements through highly parallelized scanning + and archive content caching. + - Uses libarchive directly for reading rpm archives. + - Support for indexing .deb/.ddeb archives through dpkg-deb + or bsdtar. + - Generic archive support through -Z EXT[=CMD]. Which can be + used for example for arch-linux pacman files by using + -Z '.tar.zst=zstdcat'. + - Better logging using User-Agent and X-Forwarded-For headers. + - More prometheus metrics. + - Support for eliding dots or extraneous slashes in path names. + + debuginfod-find: + - Accept /path/names in place of buildid hex. + + libelf: + - Handle PN_XNUM in elf_getphdrnum before shdr 0 is cached + - Ensure zlib resource cleanup on failure. + + libdwfl: + - dwfl_linux_kernel_find_elf and dwfl_linux_kernel_report_offline + now find and handle a compressed vmlinuz image. + + readelf, elflint: + - Handle PT_GNU_PROPERTY. + + translations: + - Updated Ukrainian translation. + * Tue Jan 28 2020 Fedora Release Engineering - 0.178-9 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - * Fri Jan 24 2020 Mark Wielaard - 0.178-8 - Add elfutils-0.178-gcc10-null-dereference.patch diff --git a/sources b/sources index 08769be..43f3cfa 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.178.tar.bz2) = 356656ad0db8f6877b461de1a11280de16a9cc5d8dde4381a938a212e828e32755135e5e3171d311c4c9297b728fbd98123048e2e8fbf7fe7de68976a2daabe5 +SHA512 (elfutils-0.179.tar.bz2) = ff2d96ad1db08e3a2ddaa60bd5a05e9b61ffa71d646f889cebb6bef51322e874930809c6dd0a257ced8c6e8de4b59ecf13ca6741dc68f9400293208278a0c052 From a02de956406198d33feeb5d24182ee2b540dc8bd Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 1 May 2020 00:15:04 +0200 Subject: [PATCH 112/216] 0.179-2 - Add elfutils-0.179-debug-client-alt-link.patch --- elfutils-0.179-debug-client-alt-link.patch | 60 ++++++++++++++++++++++ elfutils.spec | 7 ++- 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.179-debug-client-alt-link.patch diff --git a/elfutils-0.179-debug-client-alt-link.patch b/elfutils-0.179-debug-client-alt-link.patch new file mode 100644 index 0000000..bb84954 --- /dev/null +++ b/elfutils-0.179-debug-client-alt-link.patch @@ -0,0 +1,60 @@ +From b1d2404cc6ca0d9ce786e229a87c24db49163cfe Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Thu, 30 Apr 2020 23:57:26 +0200 +Subject: [PATCH] libdwfl: Handle debugaltlink in dwfl_standard_find_debuginfo. + +When we fall back to the debuginfod client then we need to do the +same trick we do for local lookups in dwfl_build_id_find_debuginfo. +If the debug file (dw) is already set, then we must be looking for +the altfile. But we cannot use the actual file/path name given as +hint. We'll have to lookup the alt file "build-id". Because the +debuginfod client only handles build-ids. + +Previously we would use the build-id of the main file which meant +the debuginfod client would give us another copy of the debug file, +which would then be set as its own altfile. This caused lots of +confusion... + +Signed-off-by: Mark Wielaard +--- + libdwfl/ChangeLog | 5 +++++ + libdwfl/find-debuginfo.c | 23 +++++++++++++++++++++-- + 2 files changed, 26 insertions(+), 2 deletions(-) + +diff --git a/libdwfl/find-debuginfo.c b/libdwfl/find-debuginfo.c +index 2dd11c48..4cfd0b8b 100644 +--- a/libdwfl/find-debuginfo.c ++++ b/libdwfl/find-debuginfo.c +@@ -398,8 +398,27 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod, + free (canon); + } + +- if (fd < 0 && bits_len > 0) +- fd = __libdwfl_debuginfod_find_debuginfo (mod->dwfl, bits, bits_len); ++ /* Still nothing? Try if we can use the debuginfod client. ++ But note that we might be looking for the alt file. ++ We use the same trick as dwfl_build_id_find_debuginfo. ++ If the debug file (dw) is already set, then we must be ++ looking for the altfile. But we cannot use the actual ++ file/path name given as hint. We'll have to lookup the ++ alt file "build-id". Because the debuginfod client only ++ handles build-ids. */ ++ if (fd < 0) ++ { ++ if (mod->dw != NULL) ++ { ++ const char *altname; ++ bits_len = INTUSE(dwelf_dwarf_gnu_debugaltlink) (mod->dw, &altname, ++ (const void **) ++ &bits); ++ } ++ ++ if (bits_len > 0) ++ fd = __libdwfl_debuginfod_find_debuginfo (mod->dwfl, bits, bits_len); ++ } + + return fd; + } +-- +2.18.2 + diff --git a/elfutils.spec b/elfutils.spec index 7e59ae4..aed7cf2 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.179 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -55,6 +55,7 @@ BuildRequires: curl %endif # Patches +Patch1: elfutils-0.179-debug-client-alt-link.patch %description Elfutils is a collection of utilities, including stack (to show @@ -246,6 +247,7 @@ such servers to download those files on demand. %setup -q # Apply patches +%patch1 -p1 -b .debug-client-alt # In case the above patches added any new test scripts, make sure they # are executable. @@ -423,6 +425,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Thu Apr 30 2020 Mark Wielaard - 0.179-2 +- Add elfutils-0.179-debug-client-alt-link.patch + * Mon Mar 30 2020 Mark Wielaard - 0.179-1 - New upstream release. debuginfod-client: From 2392ad530d13f5ebc0ef7db8cd42d46235ee75dd Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 11 Jun 2020 19:18:03 +0200 Subject: [PATCH 113/216] 0.180-1 - New upstream release. --- .gitignore | 1 + elfutils-0.179-debug-client-alt-link.patch | 60 ---------------------- elfutils.spec | 13 +++-- sources | 2 +- 4 files changed, 12 insertions(+), 64 deletions(-) delete mode 100644 elfutils-0.179-debug-client-alt-link.patch diff --git a/.gitignore b/.gitignore index 9f77f37..d198cb4 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ /elfutils-0.177.tar.bz2 /elfutils-0.178.tar.bz2 /elfutils-0.179.tar.bz2 +/elfutils-0.180.tar.bz2 diff --git a/elfutils-0.179-debug-client-alt-link.patch b/elfutils-0.179-debug-client-alt-link.patch deleted file mode 100644 index bb84954..0000000 --- a/elfutils-0.179-debug-client-alt-link.patch +++ /dev/null @@ -1,60 +0,0 @@ -From b1d2404cc6ca0d9ce786e229a87c24db49163cfe Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Thu, 30 Apr 2020 23:57:26 +0200 -Subject: [PATCH] libdwfl: Handle debugaltlink in dwfl_standard_find_debuginfo. - -When we fall back to the debuginfod client then we need to do the -same trick we do for local lookups in dwfl_build_id_find_debuginfo. -If the debug file (dw) is already set, then we must be looking for -the altfile. But we cannot use the actual file/path name given as -hint. We'll have to lookup the alt file "build-id". Because the -debuginfod client only handles build-ids. - -Previously we would use the build-id of the main file which meant -the debuginfod client would give us another copy of the debug file, -which would then be set as its own altfile. This caused lots of -confusion... - -Signed-off-by: Mark Wielaard ---- - libdwfl/ChangeLog | 5 +++++ - libdwfl/find-debuginfo.c | 23 +++++++++++++++++++++-- - 2 files changed, 26 insertions(+), 2 deletions(-) - -diff --git a/libdwfl/find-debuginfo.c b/libdwfl/find-debuginfo.c -index 2dd11c48..4cfd0b8b 100644 ---- a/libdwfl/find-debuginfo.c -+++ b/libdwfl/find-debuginfo.c -@@ -398,8 +398,27 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod, - free (canon); - } - -- if (fd < 0 && bits_len > 0) -- fd = __libdwfl_debuginfod_find_debuginfo (mod->dwfl, bits, bits_len); -+ /* Still nothing? Try if we can use the debuginfod client. -+ But note that we might be looking for the alt file. -+ We use the same trick as dwfl_build_id_find_debuginfo. -+ If the debug file (dw) is already set, then we must be -+ looking for the altfile. But we cannot use the actual -+ file/path name given as hint. We'll have to lookup the -+ alt file "build-id". Because the debuginfod client only -+ handles build-ids. */ -+ if (fd < 0) -+ { -+ if (mod->dw != NULL) -+ { -+ const char *altname; -+ bits_len = INTUSE(dwelf_dwarf_gnu_debugaltlink) (mod->dw, &altname, -+ (const void **) -+ &bits); -+ } -+ -+ if (bits_len > 0) -+ fd = __libdwfl_debuginfod_find_debuginfo (mod->dwfl, bits, bits_len); -+ } - - return fd; - } --- -2.18.2 - diff --git a/elfutils.spec b/elfutils.spec index aed7cf2..c146d11 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,5 +1,5 @@ Name: elfutils -Version: 0.179 +Version: 0.180 %global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ @@ -55,7 +55,6 @@ BuildRequires: curl %endif # Patches -Patch1: elfutils-0.179-debug-client-alt-link.patch %description Elfutils is a collection of utilities, including stack (to show @@ -247,7 +246,6 @@ such servers to download those files on demand. %setup -q # Apply patches -%patch1 -p1 -b .debug-client-alt # In case the above patches added any new test scripts, make sure they # are executable. @@ -425,6 +423,15 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Thu Jun 11 2020 Mark Wielaard - 0.180-1 +- New upstream release. + elflint: Allow SHF_EXCLUDE as generic section flag when --gnu is given. + libdw, readelf: Handle GCC LTO .gnu.debuglto_ prefix. + libdw: Use correct CU to resolve file names in dwarf_decl_file. + libdwfl: Handle debugaltlink in dwfl_standard_find_debuginfo. + size: Also obey radix printing for bsd format. + nm: Explicitly print weak 'V' or 'T' and common 'C' symbols. + * Thu Apr 30 2020 Mark Wielaard - 0.179-2 - Add elfutils-0.179-debug-client-alt-link.patch diff --git a/sources b/sources index 43f3cfa..186b1cd 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.179.tar.bz2) = ff2d96ad1db08e3a2ddaa60bd5a05e9b61ffa71d646f889cebb6bef51322e874930809c6dd0a257ced8c6e8de4b59ecf13ca6741dc68f9400293208278a0c052 +SHA512 (elfutils-0.180.tar.bz2) = 62e96035ccfe8928baca2285decbe8b8703a2daa956df81ece18fecf643272fb68955806b3e807a514141a7a9bf44520bf09461672aa580bd6807485fb604d25 From ab00a462ae28757d911b93a3f214ddc9e74bef82 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 1 Jul 2020 12:22:05 -0600 Subject: [PATCH 114/216] Disable LTO --- elfutils.spec | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index c146d11..2831705 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.180 -%global baserelease 2 +%global baserelease 3 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -252,6 +252,14 @@ such servers to download those files on demand. find . -name \*.sh ! -perm -0100 -print | xargs chmod +x %build +# This package uses top level ASM constructs which are incompatible with LTO. +# Top level ASMs are often used to implement symbol versioning. gcc-10 +# introduces a new mechanism for symbol versioning which works with LTO. +# Converting packages to use that mechanism instead of toplevel ASMs is +# recommended. +# Disable LTO +%define _lto_cflags %{nil} + # Remove -Wall from default flags. The makefiles enable enough warnings # themselves, and they use -Werror. Appending -Wall defeats the cases where # the makefiles disable some specific warnings for specific code. @@ -423,6 +431,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Jul 1 2020 Jeff Law - 0.180-2 +- Disable LTO + * Thu Jun 11 2020 Mark Wielaard - 0.180-1 - New upstream release. elflint: Allow SHF_EXCLUDE as generic section flag when --gnu is given. From 170c3e44ead49d8e550c5203faca8c71b158e131 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 3 Jul 2020 23:46:19 +0200 Subject: [PATCH 115/216] 0.180-3 - Add elfutils-0.180-mhd-result.patch --- elfutils-0.180-mhd-result.patch | 67 +++++++++++++++++++++++++++++++++ elfutils.spec | 5 +++ 2 files changed, 72 insertions(+) create mode 100644 elfutils-0.180-mhd-result.patch diff --git a/elfutils-0.180-mhd-result.patch b/elfutils-0.180-mhd-result.patch new file mode 100644 index 0000000..3a67a93 --- /dev/null +++ b/elfutils-0.180-mhd-result.patch @@ -0,0 +1,67 @@ +commit acb453851c9e6c46531b70fda7396885c0e7e1db +Author: Frank Ch. Eigler +Date: Thu Jul 2 14:52:48 2020 +0000 + + PR26195: adapt debuginfod to API change in libmicrohttpd-0.9.71 + + To make our code build with -Werror as well as against older libmicrohttpd, + we must conditionalize the data type (int vs. enum) returned by callbacks + and some mhd functions. + + Signed-off-by: Frank Ch. Eigler + +diff --git a/debuginfod/debuginfod.cxx b/debuginfod/debuginfod.cxx +index 76f1fa52..56210302 100644 +--- a/debuginfod/debuginfod.cxx ++++ b/debuginfod/debuginfod.cxx +@@ -92,6 +92,14 @@ using namespace std; + #include + + #include ++ ++#if MHD_VERSION >= 0x00097002 ++// libmicrohttpd 0.9.71 broke API ++#define MHD_RESULT enum MHD_Result ++#else ++#define MHD_RESULT int ++#endif ++ + #include + #include + #include +@@ -519,12 +527,12 @@ struct reportable_exception + + void report(ostream& o) const; // defined under obatched() class below + +- int mhd_send_response(MHD_Connection* c) const { ++ MHD_RESULT mhd_send_response(MHD_Connection* c) const { + MHD_Response* r = MHD_create_response_from_buffer (message.size(), + (void*) message.c_str(), + MHD_RESPMEM_MUST_COPY); + MHD_add_response_header (r, "Content-Type", "text/plain"); +- int rc = MHD_queue_response (c, code, r); ++ MHD_RESULT rc = MHD_queue_response (c, code, r); + MHD_destroy_response (r); + return rc; + } +@@ -1723,7 +1731,7 @@ handle_metrics (off_t* size) + + + /* libmicrohttpd callback */ +-static int ++static MHD_RESULT + handler_cb (void * /*cls*/, + struct MHD_Connection *connection, + const char *url, +@@ -1736,7 +1744,11 @@ handler_cb (void * /*cls*/, + struct MHD_Response *r = NULL; + string url_copy = url; + ++#if MHD_VERSION >= 0x00097002 ++ enum MHD_Result rc; ++#else + int rc = MHD_NO; // mhd ++#endif + int http_code = 500; + off_t http_size = -1; + struct timeval tv_start, tv_end; diff --git a/elfutils.spec b/elfutils.spec index 2831705..ad078f2 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -55,6 +55,7 @@ BuildRequires: curl %endif # Patches +Patch1: elfutils-0.180-mhd-result.patch %description Elfutils is a collection of utilities, including stack (to show @@ -246,6 +247,7 @@ such servers to download those files on demand. %setup -q # Apply patches +%patch1 -p1 -b .mhd_result # In case the above patches added any new test scripts, make sure they # are executable. @@ -431,6 +433,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Fri Jul 3 2020 Mark Wielaard - 0.180-3 +- Add elfutils-0.180-mhd-result.patch + * Wed Jul 1 2020 Jeff Law - 0.180-2 - Disable LTO From da1e3f3ac392f2d6ea6550e0be97bed9339bbd4e Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Mon, 13 Jul 2020 19:22:41 +0000 Subject: [PATCH 116/216] Use make macros https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro --- elfutils.spec | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index ad078f2..f7cf13b 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.180 -%global baserelease 3 +%global baserelease 4 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -274,11 +274,11 @@ RPM_OPT_FLAGS="${RPM_OPT_FLAGS} -Wformat" trap 'cat config.log' EXIT %configure CFLAGS="$RPM_OPT_FLAGS -fexceptions" trap '' EXIT -make -s %{?_smp_mflags} +%make_build -s %install rm -rf ${RPM_BUILD_ROOT} -make -s install DESTDIR=${RPM_BUILD_ROOT} +%make_install -s chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib*.so* @@ -297,7 +297,7 @@ touch ${RPM_BUILD_ROOT}%{_localstatedir}/cache/debuginfod/debuginfod.sqlite # Record some build root versions in build.log uname -r; rpm -q binutils gcc glibc -make -s %{?_smp_mflags} check || (cat tests/test-suite.log; false) +%make_build -s check || (cat tests/test-suite.log; false) # Only the latest Fedora and EPEL have these scriptlets, # older Fedora and plain RHEL don't. @@ -433,6 +433,10 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Jul 13 2020 Tom Stellard - 0.180-4 +- Use make macros +- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro + * Fri Jul 3 2020 Mark Wielaard - 0.180-3 - Add elfutils-0.180-mhd-result.patch From dd2bf6899d1cf543cd3e44fcbc016a57ea284cc1 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 18 Jul 2020 01:41:00 +0200 Subject: [PATCH 117/216] Properly escape %%check in spec comment. --- elfutils.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index ad078f2..973f7a9 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -40,7 +40,7 @@ BuildRequires: pkgconfig(libarchive) >= 3.1.2 # For tests need to bunzip2 test files. BuildRequires: bzip2 -# For the run-debuginfod-find.sh test case in %check for /usr/sbin/ss +# For the run-debuginfod-find.sh test case in %%check for /usr/sbin/ss BuildRequires: iproute BuildRequires: bsdtar BuildRequires: curl From ec548c1605c3f672001b4eae3f52a1c20bcdbbbb Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 23 Jul 2020 01:07:41 +0200 Subject: [PATCH 118/216] Remove elfutils-libelf-devel-static and elfutils-devel-static --- elfutils.spec | 42 +++++++++--------------------------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 6d0734e..55f3775 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.180 -%global baserelease 4 +%global baserelease 5 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -101,6 +101,7 @@ Recommends: elfutils-debuginfod-client-devel%{depsuffix} = %{version}-%{release} %else Requires: elfutils-debuginfod-client-devel%{depsuffix} = %{version}-%{release} %endif +Obsoletes: elfutils-devel-static%{depsuffix} < 0.180-5 %description devel The elfutils-devel package contains the libraries to create @@ -108,19 +109,6 @@ applications for handling compiled objects. libdw provides access to the DWARF debugging information. libasm provides a programmable assembler interface. -%package devel-static -Summary: Static archives to handle compiled objects -License: GPLv2+ or LGPLv3+ -%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. - %package libelf Summary: Library to read and write ELF files License: GPLv2+ or LGPLv3+ @@ -143,6 +131,7 @@ 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%{depsuffix} < 0.180-5 %description libelf-devel The elfutils-libelf-devel package contains the libraries to create @@ -150,18 +139,6 @@ 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. -%package libelf-devel-static -Summary: Static archive of libelf -License: GPLv2+ or LGPLv3+ -%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. - %if %{provide_yama_scope} %package default-yama-scope Summary: Default yama attach scope sysctl setting @@ -281,6 +258,9 @@ rm -rf ${RPM_BUILD_ROOT} %make_install -s chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib*.so* +# We don't want the static libraries +rm ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib{elf,dw,asm}.a + %find_lang %{name} @@ -368,10 +348,6 @@ fi %{_libdir}/libdw.so %{_libdir}/pkgconfig/libdw.pc -%files devel-static -%{_libdir}/libdw.a -%{_libdir}/libasm.a - %files -f %{name}.lang libelf %{!?_licensedir:%global license %%doc} %license COPYING-GPLV2 COPYING-LGPLV3 @@ -386,9 +362,6 @@ fi %{_libdir}/pkgconfig/libelf.pc %{_mandir}/man3/elf_*.3* -%files libelf-devel-static -%{_libdir}/libelf.a - %if %{provide_yama_scope} %files default-yama-scope %{_sysctldir}/10-default-yama-scope.conf @@ -433,6 +406,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Wed Jul 22 2020 Mark Wielaard - 0.180-5 +- Remove elfutils-libelf-devel-static and elfutils-devel-static subpackages. + * Mon Jul 13 2020 Tom Stellard - 0.180-4 - Use make macros - https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro From e7591c0f5ded6e688f74ad398cc4a88752f09010 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 23 Jul 2020 01:17:05 +0200 Subject: [PATCH 119/216] Remove duplicate listing of sysconfig/debuginfod (config) file. --- elfutils.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index 55f3775..a07708b 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -386,7 +386,6 @@ fi %{_bindir}/debuginfod %config(noreplace) %verify(not md5 size mtime) %{_sysconfdir}/sysconfig/debuginfod %{_unitdir}/debuginfod.service -%{_sysconfdir}/sysconfig/debuginfod %{_mandir}/man8/debuginfod.8* %dir %attr(0700,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod @@ -408,6 +407,7 @@ exit 0 %changelog * Wed Jul 22 2020 Mark Wielaard - 0.180-5 - Remove elfutils-libelf-devel-static and elfutils-devel-static subpackages. +- Remove duplicate listing of sysconfig/debuginfod (config) file. * Mon Jul 13 2020 Tom Stellard - 0.180-4 - Use make macros From 5638cbe410ea571891541c486b70e30cfc005bbf Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 24 Jul 2020 16:35:35 +0200 Subject: [PATCH 120/216] Obsoletes shouldn't include depsuffix. --- elfutils.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index a07708b..8d17eb2 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -101,7 +101,7 @@ Recommends: elfutils-debuginfod-client-devel%{depsuffix} = %{version}-%{release} %else Requires: elfutils-debuginfod-client-devel%{depsuffix} = %{version}-%{release} %endif -Obsoletes: elfutils-devel-static%{depsuffix} < 0.180-5 +Obsoletes: elfutils-devel-static < 0.180-5 %description devel The elfutils-devel package contains the libraries to create @@ -131,7 +131,7 @@ 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%{depsuffix} < 0.180-5 +Obsoletes: elfutils-libelf-devel-static < 0.180-5 %description libelf-devel The elfutils-libelf-devel package contains the libraries to create From 29f2206fd8986c657a413df78237827479c3adbc Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Mon, 27 Jul 2020 16:26:20 +0000 Subject: [PATCH 121/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_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 8d17eb2..3ea41a7 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.180 -%global baserelease 5 +%global baserelease 6 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -405,6 +405,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Jul 27 2020 Fedora Release Engineering - 0.180-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + * Wed Jul 22 2020 Mark Wielaard - 0.180-5 - Remove elfutils-libelf-devel-static and elfutils-devel-static subpackages. - Remove duplicate listing of sysconfig/debuginfod (config) file. From 98c6807f3d9ce47fb778f370984e597c204fafb1 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 26 Aug 2020 00:11:50 +0200 Subject: [PATCH 122/216] 0.180-7 - Add elfutils-0.180-shf-compressed.patch --- elfutils-0.180-shf-compressed.patch | 68 +++++++++++++++++++++++++++++ elfutils.spec | 7 ++- 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.180-shf-compressed.patch diff --git a/elfutils-0.180-shf-compressed.patch b/elfutils-0.180-shf-compressed.patch new file mode 100644 index 0000000..1a91d98 --- /dev/null +++ b/elfutils-0.180-shf-compressed.patch @@ -0,0 +1,68 @@ +commit 55c5c9a568ed707bcea1388bf3a525212d8cf4b8 +Author: Mark Wielaard +Date: Wed Aug 19 23:41:24 2020 +0200 + + libelf: Fixup SHF_COMPRESSED sh_addralign in elf_update if necessary. + + In elf_getdata.c we have the following to compensate for possibly + bad sh_addralign values of compressed sections: + + /* Compressed data has a header, but then compressed data. + Make sure to set the alignment of the header explicitly, + don't trust the file alignment for the section, it is + often wrong. */ + if ((flags & SHF_COMPRESSED) != 0) + { + entsize = 1; + align = __libelf_type_align (elf->class, ELF_T_CHDR); + } + + Which makes sure the d_data alignment is correct for the Chdr struct + at the start of the compressed section. + + But this means that if a user just reads such a compressed section + without changing it, and then tries to write it out again using + elf_update they get an error message about d_align and sh_addralign + being out of sync. + + We already correct obviously incorrect sh_entsize fields. + Do the same for the sh_addralign field of a SHF_COMPRESSED section. + + Signed-off-by: Mark Wielaard + +diff --git a/libelf/ChangeLog b/libelf/ChangeLog +index 8f6d2d2d..77044c1c 100644 +--- a/libelf/ChangeLog ++++ b/libelf/ChangeLog +@@ -1,3 +1,8 @@ ++2020-08-19 Mark Wielaard ++ ++ * elf32_updatenull.c (updatenull_wrlock): Fixup the sh_addralign ++ of an SHF_COMPRESSED section if necessary. ++ + 2020-06-04 Mark Wielaard + + * elf.h: Update from glibc. +diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c +index 5f3cdbf6..d0d4d1eb 100644 +--- a/libelf/elf32_updatenull.c ++++ b/libelf/elf32_updatenull.c +@@ -267,6 +267,18 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum) + update_if_changed (shdr->sh_entsize, sh_entsize, + scn->shdr_flags); + ++ /* Likewise for the alignment of a compressed section. ++ For a SHF_COMPRESSED section set the correct ++ sh_addralign value, which must match the d_align of ++ the data (see __libelf_set_rawdata in elf_getdata.c). */ ++ if ((shdr->sh_flags & SHF_COMPRESSED) != 0) ++ { ++ sh_align = __libelf_type_align (ELFW(ELFCLASS,LIBELFBITS), ++ ELF_T_CHDR); ++ update_if_changed (shdr->sh_addralign, sh_align, ++ scn->shdr_flags); ++ } ++ + if (scn->data_read == 0 + && __libelf_set_rawdata_wrlock (scn) != 0) + /* Something went wrong. The error value is already set. */ diff --git a/elfutils.spec b/elfutils.spec index 3ea41a7..18f6085 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.180 -%global baserelease 6 +%global baserelease 7 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -56,6 +56,7 @@ BuildRequires: curl # Patches Patch1: elfutils-0.180-mhd-result.patch +Patch2: elfutils-0.180-shf-compressed.patch %description Elfutils is a collection of utilities, including stack (to show @@ -225,6 +226,7 @@ such servers to download those files on demand. # Apply patches %patch1 -p1 -b .mhd_result +%patch2 -p1 -b .shf_compressed # In case the above patches added any new test scripts, make sure they # are executable. @@ -405,6 +407,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Tue Aug 25 2020 Mark Wielaard - 0.180-7 +- Add elfutils-0.180-shf-compressed.patch + * Mon Jul 27 2020 Fedora Release Engineering - 0.180-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild From 3c07e2507696ddca226628142a7e3ce2d59a1195 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 8 Sep 2020 15:12:34 +0200 Subject: [PATCH 123/216] 0.181-1 - Upgrade to upstream 0.181 --- .gitignore | 1 + elfutils-0.180-mhd-result.patch | 67 ---------------------------- elfutils-0.180-shf-compressed.patch | 68 ----------------------------- elfutils.spec | 22 +++++++--- sources | 2 +- 5 files changed, 18 insertions(+), 142 deletions(-) delete mode 100644 elfutils-0.180-mhd-result.patch delete mode 100644 elfutils-0.180-shf-compressed.patch diff --git a/.gitignore b/.gitignore index d198cb4..f7d1f6e 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ /elfutils-0.178.tar.bz2 /elfutils-0.179.tar.bz2 /elfutils-0.180.tar.bz2 +/elfutils-0.181.tar.bz2 diff --git a/elfutils-0.180-mhd-result.patch b/elfutils-0.180-mhd-result.patch deleted file mode 100644 index 3a67a93..0000000 --- a/elfutils-0.180-mhd-result.patch +++ /dev/null @@ -1,67 +0,0 @@ -commit acb453851c9e6c46531b70fda7396885c0e7e1db -Author: Frank Ch. Eigler -Date: Thu Jul 2 14:52:48 2020 +0000 - - PR26195: adapt debuginfod to API change in libmicrohttpd-0.9.71 - - To make our code build with -Werror as well as against older libmicrohttpd, - we must conditionalize the data type (int vs. enum) returned by callbacks - and some mhd functions. - - Signed-off-by: Frank Ch. Eigler - -diff --git a/debuginfod/debuginfod.cxx b/debuginfod/debuginfod.cxx -index 76f1fa52..56210302 100644 ---- a/debuginfod/debuginfod.cxx -+++ b/debuginfod/debuginfod.cxx -@@ -92,6 +92,14 @@ using namespace std; - #include - - #include -+ -+#if MHD_VERSION >= 0x00097002 -+// libmicrohttpd 0.9.71 broke API -+#define MHD_RESULT enum MHD_Result -+#else -+#define MHD_RESULT int -+#endif -+ - #include - #include - #include -@@ -519,12 +527,12 @@ struct reportable_exception - - void report(ostream& o) const; // defined under obatched() class below - -- int mhd_send_response(MHD_Connection* c) const { -+ MHD_RESULT mhd_send_response(MHD_Connection* c) const { - MHD_Response* r = MHD_create_response_from_buffer (message.size(), - (void*) message.c_str(), - MHD_RESPMEM_MUST_COPY); - MHD_add_response_header (r, "Content-Type", "text/plain"); -- int rc = MHD_queue_response (c, code, r); -+ MHD_RESULT rc = MHD_queue_response (c, code, r); - MHD_destroy_response (r); - return rc; - } -@@ -1723,7 +1731,7 @@ handle_metrics (off_t* size) - - - /* libmicrohttpd callback */ --static int -+static MHD_RESULT - handler_cb (void * /*cls*/, - struct MHD_Connection *connection, - const char *url, -@@ -1736,7 +1744,11 @@ handler_cb (void * /*cls*/, - struct MHD_Response *r = NULL; - string url_copy = url; - -+#if MHD_VERSION >= 0x00097002 -+ enum MHD_Result rc; -+#else - int rc = MHD_NO; // mhd -+#endif - int http_code = 500; - off_t http_size = -1; - struct timeval tv_start, tv_end; diff --git a/elfutils-0.180-shf-compressed.patch b/elfutils-0.180-shf-compressed.patch deleted file mode 100644 index 1a91d98..0000000 --- a/elfutils-0.180-shf-compressed.patch +++ /dev/null @@ -1,68 +0,0 @@ -commit 55c5c9a568ed707bcea1388bf3a525212d8cf4b8 -Author: Mark Wielaard -Date: Wed Aug 19 23:41:24 2020 +0200 - - libelf: Fixup SHF_COMPRESSED sh_addralign in elf_update if necessary. - - In elf_getdata.c we have the following to compensate for possibly - bad sh_addralign values of compressed sections: - - /* Compressed data has a header, but then compressed data. - Make sure to set the alignment of the header explicitly, - don't trust the file alignment for the section, it is - often wrong. */ - if ((flags & SHF_COMPRESSED) != 0) - { - entsize = 1; - align = __libelf_type_align (elf->class, ELF_T_CHDR); - } - - Which makes sure the d_data alignment is correct for the Chdr struct - at the start of the compressed section. - - But this means that if a user just reads such a compressed section - without changing it, and then tries to write it out again using - elf_update they get an error message about d_align and sh_addralign - being out of sync. - - We already correct obviously incorrect sh_entsize fields. - Do the same for the sh_addralign field of a SHF_COMPRESSED section. - - Signed-off-by: Mark Wielaard - -diff --git a/libelf/ChangeLog b/libelf/ChangeLog -index 8f6d2d2d..77044c1c 100644 ---- a/libelf/ChangeLog -+++ b/libelf/ChangeLog -@@ -1,3 +1,8 @@ -+2020-08-19 Mark Wielaard -+ -+ * elf32_updatenull.c (updatenull_wrlock): Fixup the sh_addralign -+ of an SHF_COMPRESSED section if necessary. -+ - 2020-06-04 Mark Wielaard - - * elf.h: Update from glibc. -diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c -index 5f3cdbf6..d0d4d1eb 100644 ---- a/libelf/elf32_updatenull.c -+++ b/libelf/elf32_updatenull.c -@@ -267,6 +267,18 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum) - update_if_changed (shdr->sh_entsize, sh_entsize, - scn->shdr_flags); - -+ /* Likewise for the alignment of a compressed section. -+ For a SHF_COMPRESSED section set the correct -+ sh_addralign value, which must match the d_align of -+ the data (see __libelf_set_rawdata in elf_getdata.c). */ -+ if ((shdr->sh_flags & SHF_COMPRESSED) != 0) -+ { -+ sh_align = __libelf_type_align (ELFW(ELFCLASS,LIBELFBITS), -+ ELF_T_CHDR); -+ update_if_changed (shdr->sh_addralign, sh_align, -+ scn->shdr_flags); -+ } -+ - if (scn->data_read == 0 - && __libelf_set_rawdata_wrlock (scn) != 0) - /* Something went wrong. The error value is already set. */ diff --git a/elfutils.spec b/elfutils.spec index 18f6085..ac8c4e2 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils -Version: 0.180 -%global baserelease 7 +Version: 0.181 +%global baserelease 1 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -55,8 +55,6 @@ BuildRequires: curl %endif # Patches -Patch1: elfutils-0.180-mhd-result.patch -Patch2: elfutils-0.180-shf-compressed.patch %description Elfutils is a collection of utilities, including stack (to show @@ -225,8 +223,6 @@ such servers to download those files on demand. %setup -q # Apply patches -%patch1 -p1 -b .mhd_result -%patch2 -p1 -b .shf_compressed # In case the above patches added any new test scripts, make sure they # are executable. @@ -407,6 +403,20 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Tue Sep 8 2020 Mark Wielaard - 0.181-1 +- Upgrade to upstream 0.181 + - libelf: elf_update now compensates (fixes up) a bad sh_addralign + for SHF_COMPRESSED sections. + - libdebuginfod: configure now takes --enable-libdebuginfod=dummy or + --disable-libdebuginfod for bootstrapping. + DEBUGINFOD_URLS now accepts "scheme-free" urls + (guessing at what the user meant, either http:// or file://) + - readelf, elflint: Handle aarch64 bti, pac bits in dynamic table and + gnu property notes. + - libdw, readelf: Recognize DW_CFA_AARCH64_negate_ra_state. Allows + unwinding on arm64 for code that is compiled for PAC + (Pointer Authentication Code) as long as it isn't enabled. + * Tue Aug 25 2020 Mark Wielaard - 0.180-7 - Add elfutils-0.180-shf-compressed.patch diff --git a/sources b/sources index 186b1cd..b0e26f0 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.180.tar.bz2) = 62e96035ccfe8928baca2285decbe8b8703a2daa956df81ece18fecf643272fb68955806b3e807a514141a7a9bf44520bf09461672aa580bd6807485fb604d25 +SHA512 (elfutils-0.181.tar.bz2) = d565541d5817f409dc89ebb1ee593366f69c371a1531308eeb67ff934b14a0fab0c9009fd7c23240efbaa1b4e04edac5c425e47d80e3e66ba03dcaf000afea36 From 2b7d5a5e49ee221c5008f449bf39cd9827c1b9dc Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Fri, 18 Sep 2020 14:42:45 +0200 Subject: [PATCH 124/216] 0.181-2 - Add ZSTD support elfutils-0.181-zstd.patch. --- elfutils-0.181-zstd.patch | 348 ++++++++++++++++++++++++++++++++++++++ elfutils.spec | 14 +- 2 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.181-zstd.patch diff --git a/elfutils-0.181-zstd.patch b/elfutils-0.181-zstd.patch new file mode 100644 index 0000000..1b68989 --- /dev/null +++ b/elfutils-0.181-zstd.patch @@ -0,0 +1,348 @@ +commit c5b0a640f0f7d2a195b822bcd88bb379476dbb97 +Author: Mark Wielaard +Date: Fri Sep 18 12:49:29 2020 +0200 + + zstd support + +diff --git a/config/elfutils.spec.in b/config/elfutils.spec.in +index 95f63f5a..37af1b07 100644 +--- a/config/elfutils.spec.in ++++ b/config/elfutils.spec.in +@@ -24,6 +24,7 @@ BuildRequires: flex + BuildRequires: zlib-devel + BuildRequires: bzip2-devel + BuildRequires: xz-devel ++BuildRequires: libzstd-devel + + # For debuginfod + BuildRequires: pkgconfig(libmicrohttpd) >= 0.9.33 +@@ -33,6 +34,7 @@ BuildRequires: pkgconfig(libarchive) >= 3.1.2 + + # For tests need to bunzip2 test files. + BuildRequires: bzip2 ++BuildRequires: zstd + # For the run-debuginfod-find.sh test case in %check for /usr/sbin/ss + BuildRequires: iproute + BuildRequires: bsdtar +diff --git a/config/libdw.pc.in b/config/libdw.pc.in +index 3fc283db..2e83a432 100644 +--- a/config/libdw.pc.in ++++ b/config/libdw.pc.in +@@ -17,6 +17,6 @@ Requires: libelf = @VERSION@ + + # We support various compressed ELF images, but don't export any of the + # data structures or functions. zlib (gz) is always required, bzip2 (bz2) +-# and lzma (xz) are optional. But bzip2 doesn't have a pkg-config file. +-Requires.private: zlib @LIBLZMA@ ++# lzma (xz) and zstd () are optional. But bzip2 doesn't have a pkg-config file. ++Requires.private: zlib @LIBLZMA@ @LIBZSTD@ + Libs.private: @BZ2_LIB@ +diff --git a/configure.ac b/configure.ac +index bf833872..1b794df3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -397,8 +397,8 @@ eu_ZIPLIB(zlib,ZLIB,z,gzdirect,gzip) + AS_IF([test "x$with_zlib" = xno], [AC_MSG_ERROR([zlib not found but is required])]) + LIBS="$save_LIBS" + +-dnl Test for bzlib and xz/lzma, gives BZLIB/LZMALIB .am +-dnl conditional and config.h USE_BZLIB/USE_LZMALIB #define. ++dnl Test for bzlib and xz/lzma/zstd, gives BZLIB/LZMALIB/ZSTD .am ++dnl conditional and config.h USE_BZLIB/USE_LZMALIB/USE_ZSTD #define. + save_LIBS="$LIBS" + LIBS= + eu_ZIPLIB(bzlib,BZLIB,bz2,BZ2_bzdopen,bzip2) +@@ -408,6 +408,9 @@ AC_SUBST([BZ2_LIB]) + eu_ZIPLIB(lzma,LZMA,lzma,lzma_auto_decoder,[LZMA (xz)]) + AS_IF([test "x$with_lzma" = xyes], [LIBLZMA="liblzma"], [LIBLZMA=""]) + AC_SUBST([LIBLZMA]) ++eu_ZIPLIB(zstd,ZSTD,zstd,ZSTD_decompress,[ZSTD (zst)]) ++AS_IF([test "x$with_zstd" = xyes], [LIBZSTD="libzstd"], [LIBLZSTD=""]) ++AC_SUBST([LIBZSTD]) + zip_LIBS="$LIBS" + LIBS="$save_LIBS" + AC_SUBST([zip_LIBS]) +@@ -677,6 +680,10 @@ if test "$HAVE_BUNZIP2" = "no"; then + AC_MSG_WARN([No bunzip2, needed to run make check]) + fi + ++# For tests that need to use zstd compression ++AC_CHECK_PROG(HAVE_ZSTD, zstd, yes, no) ++AM_CONDITIONAL([HAVE_ZSTD],[test "x$HAVE_ZSTD" = "xyes"]) ++ + # Look for libcurl for libdebuginfod minimum version as per rhel7. + AC_ARG_ENABLE([libdebuginfod],AC_HELP_STRING([--enable-libdebuginfod], [Build debuginfod client library (can be =dummy)])) + AS_IF([test "x$enable_libdebuginfod" != "xno"], [ +@@ -742,6 +749,7 @@ AC_MSG_NOTICE([ + gzip support : ${with_zlib} + bzip2 support : ${with_bzlib} + lzma/xz support : ${with_lzma} ++ zstd support : ${with_zstd} + libstdc++ demangle support : ${enable_demangler} + File textrel check : ${enable_textrelcheck} + Symbol versioning : ${enable_symbol_versioning} +@@ -759,6 +767,7 @@ AC_MSG_NOTICE([ + + EXTRA TEST FEATURES (used with make check) + have bunzip2 installed (required) : ${HAVE_BUNZIP2} ++ have zstd installed : ${HAVE_ZSTD} + debug branch prediction : ${use_debugpred} + gprof support : ${use_gprof} + gcov support : ${use_gcov} +diff --git a/libdwfl/Makefile.am b/libdwfl/Makefile.am +index 1de05492..a0013e41 100644 +--- a/libdwfl/Makefile.am ++++ b/libdwfl/Makefile.am +@@ -78,6 +78,9 @@ endif + if LZMA + libdwfl_a_SOURCES += lzma.c + endif ++if ZSTD ++libdwfl_a_SOURCES += zstd.c ++endif + if LIBDEBUGINFOD + libdwfl_a_SOURCES += debuginfod-client.c + endif +diff --git a/libdwfl/gzip.c b/libdwfl/gzip.c +index e9988cc2..ba8ecfba 100644 +--- a/libdwfl/gzip.c ++++ b/libdwfl/gzip.c +@@ -48,6 +48,12 @@ + # define inflateInit(z) lzma_auto_decoder (z, 1 << 30, 0) + # define do_inflate(z) lzma_code (z, LZMA_RUN) + # define inflateEnd(z) lzma_end (z) ++#elif defined ZSTD ++# define USE_INFLATE 1 ++# include ++# define unzip __libdw_unzstd ++# define DWFL_E_ZLIB DWFL_E_ZSTD ++# define MAGIC "\x28\xb5\x2f\xfd" + #elif defined BZLIB + # define USE_INFLATE 1 + # include +@@ -119,6 +125,7 @@ fail (struct unzip_state *state, Dwfl_Error failure) + return failure; + } + ++#ifndef ZSTD + static inline Dwfl_Error + zlib_fail (struct unzip_state *state, int result) + { +@@ -132,6 +139,7 @@ zlib_fail (struct unzip_state *state, int result) + return fail (state, DWFL_E_ZLIB); + } + } ++#endif + + #if !USE_INFLATE + static Dwfl_Error +@@ -197,7 +205,7 @@ unzip (int fd, off_t start_offset, + + ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE, start_offset); + if (unlikely (n < 0)) +- return zlib_fail (&state, Z (ERRNO)); ++ return fail (&state, DWFL_E_ERRNO); + + state.input_pos = n; + mapped = state.input_buffer; +@@ -223,7 +231,74 @@ unzip (int fd, off_t start_offset, + /* Not a compressed file. */ + return DWFL_E_BADELF; + +-#if USE_INFLATE ++#ifdef ZSTD ++ /* special case for libzstd since it is slightly different from the ++ API provided by bzlib and liblzma. */ ++ ++ void *next_in = mapped; ++ size_t avail_in = state.mapped_size; ++ void *next_out = NULL; ++ size_t avail_out = 0; ++ size_t total_out = 0; ++ ++ size_t result; ++ ZSTD_DCtx *dctx = ZSTD_createDCtx(); ++ if (dctx == NULL) ++ return fail (&state, DWFL_E_NOMEM); ++ ++ do ++ { ++ if (avail_in == 0 && state.input_buffer != NULL) ++ { ++ ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE, ++ start_offset + state.input_pos); ++ if (unlikely (n < 0)) ++ { ++ ZSTD_freeDCtx (dctx); ++ return fail (&state, DWFL_E_ERRNO); ++ } ++ next_in = state.input_buffer; ++ avail_in = n; ++ state.input_pos += n; ++ } ++ if (avail_out == 0) ++ { ++ ptrdiff_t pos = (void *) next_out - state.buffer; ++ if (!bigger_buffer (&state, avail_in)) ++ { ++ ZSTD_freeDCtx (dctx); ++ return fail (&state, DWFL_E_NOMEM); ++ } ++ next_out = state.buffer + pos; ++ avail_out = state.size - pos; ++ } ++ ++ ZSTD_inBuffer input = { next_in, avail_in, 0 }; ++ ZSTD_outBuffer output = { next_out, avail_out, 0 }; ++ result = ZSTD_decompressStream (dctx, &output, &input); ++ ++ if (! ZSTD_isError (result)) ++ { ++ total_out += output.pos; ++ next_out += output.pos; ++ avail_out -= output.pos; ++ next_in += input.pos; ++ avail_in -= input.pos; ++ } ++ ++ if (result == 0) ++ break; ++ } ++ while (avail_in > 0 && ! ZSTD_isError (result)); ++ ++ ZSTD_freeDCtx (dctx); ++ ++ if (ZSTD_isError (result)) ++ return fail (&state, DWFL_E_ZSTD); ++ ++ smaller_buffer (&state, total_out); ++ ++#elif USE_INFLATE + + /* This style actually only works with bzlib and liblzma. + The stupid zlib interface has nothing to grok the +diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h +index ad6779ad..4c6fcb28 100644 +--- a/libdwfl/libdwflP.h ++++ b/libdwfl/libdwflP.h +@@ -61,6 +61,7 @@ typedef struct Dwfl_Process Dwfl_Process; + DWFL_ERROR (ZLIB, N_("gzip decompression failed")) \ + DWFL_ERROR (BZLIB, N_("bzip2 decompression failed")) \ + DWFL_ERROR (LZMA, N_("LZMA decompression failed")) \ ++ DWFL_ERROR (ZSTD, N_("zstd decompression failed")) \ + DWFL_ERROR (UNKNOWN_MACHINE, N_("no support library found for machine")) \ + DWFL_ERROR (NOREL, N_("Callbacks missing for ET_REL file")) \ + DWFL_ERROR (BADRELTYPE, N_("Unsupported relocation type")) \ +@@ -612,6 +613,10 @@ extern Dwfl_Error __libdw_unlzma (int fd, off_t start_offset, + void *mapped, size_t mapped_size, + void **whole, size_t *whole_size) + internal_function; ++extern Dwfl_Error __libdw_unzstd (int fd, off_t start_offset, ++ void *mapped, size_t mapped_size, ++ void **whole, size_t *whole_size) ++ internal_function; + + /* Skip the image header before a file image: updates *START_OFFSET. */ + extern Dwfl_Error __libdw_image_header (int fd, off_t *start_offset, +diff --git a/libdwfl/open.c b/libdwfl/open.c +index 35fc5283..77bd2bd9 100644 +--- a/libdwfl/open.c ++++ b/libdwfl/open.c +@@ -44,6 +44,10 @@ + # define __libdw_unlzma(...) DWFL_E_BADELF + #endif + ++#if !USE_ZSTD ++# define __libdw_unzstd(...) DWFL_E_BADELF ++#endif ++ + /* Consumes and replaces *ELF only on success. */ + static Dwfl_Error + decompress (int fd __attribute__ ((unused)), Elf **elf) +@@ -64,6 +68,8 @@ decompress (int fd __attribute__ ((unused)), Elf **elf) + error = __libdw_bunzip2 (fd, offset, mapped, mapped_size, &buffer, &size); + if (error == DWFL_E_BADELF) + error = __libdw_unlzma (fd, offset, mapped, mapped_size, &buffer, &size); ++ if (error == DWFL_E_BADELF) ++ error = __libdw_unzstd (fd, offset, mapped, mapped_size, &buffer, &size); + + if (error == DWFL_E_NOERROR) + { +diff --git a/libdwfl/zstd.c b/libdwfl/zstd.c +new file mode 100644 +index 00000000..dc4d5238 +--- /dev/null ++++ b/libdwfl/zstd.c +@@ -0,0 +1,4 @@ ++/* libzstd is pretty close to zlib and bzlib. */ ++ ++#define ZSTD ++#include "gzip.c" +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 4629ce64..9d0707da 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -204,6 +204,10 @@ if LZMA + TESTS += run-readelf-s.sh run-dwflsyms.sh + endif + ++if HAVE_ZSTD ++TESTS += run-readelf-compressed-zstd.sh ++endif ++ + if HAVE_LIBASM + check_PROGRAMS += $(asm_TESTS) + TESTS += $(asm_TESTS) run-disasm-bpf.sh +@@ -256,6 +260,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ + run-nm-syms.sh testfilesyms32.bz2 testfilesyms64.bz2 \ + run-nm-self.sh run-readelf-self.sh run-readelf-info-plus.sh \ + run-readelf-compressed.sh \ ++ run-readelf-compressed-zstd.sh \ + run-readelf-const-values.sh testfile-const-values.debug.bz2 \ + run-addrcfi.sh run-dwarfcfi.sh \ + testfile11-debugframe.bz2 testfile12-debugframe.bz2 \ +diff --git a/tests/run-readelf-compressed-zstd.sh b/tests/run-readelf-compressed-zstd.sh +new file mode 100755 +index 00000000..96208092 +--- /dev/null ++++ b/tests/run-readelf-compressed-zstd.sh +@@ -0,0 +1,39 @@ ++#! /bin/sh ++# Copyright (C) 2018 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 ++ ++if ! grep -q -F '#define USE_ZSTD' ${abs_top_builddir}/config.h; then ++ echo "elfutils built without zstd support" ++ exit 77 ++fi ++ ++# See run-strip-reloc.sh ++testfiles hello_i386.ko ++ ++tempfiles hello_i386.ko.zst readelf.out.1 readelf.out.2 ++ ++testrun ${abs_top_builddir}/src/readelf -a hello_i386.ko > readelf.out.1 ++zstd hello_i386.ko ++testrun ${abs_top_builddir}/src/readelf -a hello_i386.ko.zst > readelf.out.2 ++ ++diff -u readelf.out.1 readelf.out.2 ++if [ $? != 0 ]; then ++ exit 1; ++fi ++ ++exit 0 diff --git a/elfutils.spec b/elfutils.spec index ac8c4e2..fe23ae4 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.181 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -31,6 +31,7 @@ BuildRequires: flex BuildRequires: zlib-devel BuildRequires: bzip2-devel BuildRequires: xz-devel +BuildRequires: libzstd-devel # For debuginfod BuildRequires: pkgconfig(libmicrohttpd) >= 0.9.33 @@ -40,11 +41,15 @@ BuildRequires: pkgconfig(libarchive) >= 3.1.2 # For tests need to bunzip2 test files. BuildRequires: bzip2 +BuildRequires: zstd # For the run-debuginfod-find.sh test case in %%check for /usr/sbin/ss BuildRequires: iproute BuildRequires: bsdtar BuildRequires: curl +BuildRequires: automake +BuildRequires: autoconf + %global _gnu %{nil} %global _program_prefix eu- @@ -55,6 +60,7 @@ BuildRequires: curl %endif # Patches +Patch1: elfutils-0.181-zstd.patch %description Elfutils is a collection of utilities, including stack (to show @@ -223,6 +229,9 @@ such servers to download those files on demand. %setup -q # Apply patches +%patch1 -p1 -b .zstd + +autoreconf -f -v -i # In case the above patches added any new test scripts, make sure they # are executable. @@ -403,6 +412,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Fri Sep 18 2020 Mark Wielaard - 0.181-2 +- Add ZSTD support elfutils-0.181-zstd.patch. + * Tue Sep 8 2020 Mark Wielaard - 0.181-1 - Upgrade to upstream 0.181 - libelf: elf_update now compensates (fixes up) a bad sh_addralign From 6f097526493073da5ce7c00213b701debaea2acc Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 19 Oct 2020 11:31:04 +0200 Subject: [PATCH 125/216] 0.181-3 - Add elfutils-0.181-array-param.patch. --- elfutils-0.181-array-param.patch | 472 +++++++++++++++++++++++++++++++ elfutils.spec | 7 +- 2 files changed, 478 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.181-array-param.patch diff --git a/elfutils-0.181-array-param.patch b/elfutils-0.181-array-param.patch new file mode 100644 index 0000000..5099b1a --- /dev/null +++ b/elfutils-0.181-array-param.patch @@ -0,0 +1,472 @@ +commit 09b034419ef16cf39abcd7a2df9d0fe704176d13 +Author: Mark Wielaard +Date: Sat Oct 17 21:22:22 2020 +0200 + + libebl: Remove unused ebl_syscall_abi. + + GCC11 -Warray-parameter warned about ebl_syscall_abi being inconsistently + declared (once with a pointer to int, once with an array of 6 int elements). + Since ebl_syscall_abi isn't actually used and was only implemented for + 3 backends without any tests just remove it. + + Signed-off-by: Mark Wielaard + +diff --git a/backends/Makefile.am b/backends/Makefile.am +index f4052125..3849f457 100644 +--- a/backends/Makefile.am ++++ b/backends/Makefile.am +@@ -40,13 +40,13 @@ modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \ + tilegx m68k bpf riscv csky + + i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_cfi.c \ +- i386_retval.c i386_regs.c i386_auxv.c i386_syscall.c \ ++ i386_retval.c i386_regs.c i386_auxv.c \ + i386_initreg.c i386_unwind.c + + sh_SRCS = sh_init.c sh_symbol.c sh_corenote.c sh_regs.c sh_retval.c + + x86_64_SRCS = x86_64_init.c x86_64_symbol.c x86_64_corenote.c x86_64_cfi.c \ +- x86_64_retval.c x86_64_regs.c x86_64_syscall.c x86_64_initreg.c \ ++ x86_64_retval.c x86_64_regs.c x86_64_initreg.c \ + x86_64_unwind.c x32_corenote.c + + +@@ -67,7 +67,7 @@ sparc_SRCS = sparc_init.c sparc_symbol.c sparc_regs.c sparc_retval.c \ + sparc_cfi.c sparc_initreg.c + + ppc_SRCS = ppc_init.c ppc_symbol.c ppc_retval.c ppc_regs.c \ +- ppc_corenote.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \ ++ ppc_corenote.c ppc_auxv.c ppc_attrs.c \ + ppc_cfi.c ppc_initreg.c + + ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c ppc64_corenote.c \ +diff --git a/backends/i386_init.c b/backends/i386_init.c +index 3f6b9ed1..579e5fad 100644 +--- a/backends/i386_init.c ++++ b/backends/i386_init.c +@@ -52,7 +52,6 @@ i386_init (Elf *elf __attribute__ ((unused)), + HOOK (eh, debugscn_p); + HOOK (eh, return_value_location); + HOOK (eh, register_info); +- HOOK (eh, syscall_abi); + HOOK (eh, auxv_info); + HOOK (eh, disasm); + HOOK (eh, abi_cfi); +diff --git a/backends/i386_syscall.c b/backends/i386_syscall.c +deleted file mode 100644 +index 535dcd86..00000000 +--- a/backends/i386_syscall.c ++++ /dev/null +@@ -1,50 +0,0 @@ +-/* Linux/i386 system call ABI in DWARF register numbers. +- 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 either +- +- * the GNU Lesser General Public License as published by the Free +- Software Foundation; either version 3 of the License, or (at +- your option) any later version +- +- or +- +- * 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 +- +- or both in parallel, as here. +- +- 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 copies of the GNU General Public License and +- the GNU Lesser General Public License along with this program. If +- not, see . */ +- +-#ifdef HAVE_CONFIG_H +-# include +-#endif +- +-#define BACKEND i386_ +-#include "libebl_CPU.h" +- +-int +-i386_syscall_abi (Ebl *ebl __attribute__ ((unused)), +- int *sp, int *pc, int *callno, int args[6]) +-{ +- *sp = 4; /* %esp */ +- *pc = 8; /* %eip */ +- *callno = 0; /* %eax */ +- args[0] = 3; /* %ebx */ +- args[1] = 1; /* %ecx */ +- args[2] = 2; /* %edx */ +- args[3] = 6; /* %esi */ +- args[4] = 7; /* %edi */ +- args[5] = 5; /* %ebp */ +- return 0; +-} +diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c +index f509aef6..ffc9842c 100644 +--- a/backends/ppc64_init.c ++++ b/backends/ppc64_init.c +@@ -58,7 +58,6 @@ ppc64_init (Elf *elf __attribute__ ((unused)), + HOOK (eh, bss_plt_p); + HOOK (eh, return_value_location); + HOOK (eh, register_info); +- HOOK (eh, syscall_abi); + HOOK (eh, core_note); + HOOK (eh, auxv_info); + HOOK (eh, check_object_attribute); +diff --git a/backends/ppc_init.c b/backends/ppc_init.c +index ac440ab2..08468f8f 100644 +--- a/backends/ppc_init.c ++++ b/backends/ppc_init.c +@@ -54,7 +54,6 @@ ppc_init (Elf *elf __attribute__ ((unused)), + HOOK (eh, bss_plt_p); + HOOK (eh, return_value_location); + HOOK (eh, register_info); +- HOOK (eh, syscall_abi); + HOOK (eh, core_note); + HOOK (eh, auxv_info); + HOOK (eh, check_object_attribute); +diff --git a/backends/ppc_syscall.c b/backends/ppc_syscall.c +deleted file mode 100644 +index b1b9c52b..00000000 +--- a/backends/ppc_syscall.c ++++ /dev/null +@@ -1,53 +0,0 @@ +-/* Linux/PPC system call ABI in DWARF register numbers. +- 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 either +- +- * the GNU Lesser General Public License as published by the Free +- Software Foundation; either version 3 of the License, or (at +- your option) any later version +- +- or +- +- * 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 +- +- or both in parallel, as here. +- +- 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 copies of the GNU General Public License and +- the GNU Lesser General Public License along with this program. If +- not, see . */ +- +-#ifdef HAVE_CONFIG_H +-# include +-#endif +- +-#define BACKEND ppc_ +-#include "libebl_CPU.h" +- +-int +-ppc_syscall_abi (Ebl *ebl __attribute__ ((unused)), +- int *sp, int *pc, int *callno, int args[6]) +-{ +- *sp = 1; +- *pc = -1; +- *callno = 0; +- args[0] = 3; +- args[1] = 4; +- args[2] = 5; +- args[3] = 6; +- args[4] = 7; +- args[5] = 8; +- return 0; +-} +- +-__typeof (ppc_syscall_abi) +-ppc64_syscall_abi __attribute__ ((alias ("ppc_syscall_abi"))); +diff --git a/backends/x86_64_init.c b/backends/x86_64_init.c +index 44c1ad28..8db9b643 100644 +--- a/backends/x86_64_init.c ++++ b/backends/x86_64_init.c +@@ -56,7 +56,6 @@ x86_64_init (Elf *elf __attribute__ ((unused)), + HOOK (eh, core_note); + HOOK (eh, return_value_location); + HOOK (eh, register_info); +- HOOK (eh, syscall_abi); + HOOK (eh, auxv_info); + HOOK (eh, disasm); + HOOK (eh, abi_cfi); +diff --git a/backends/x86_64_syscall.c b/backends/x86_64_syscall.c +deleted file mode 100644 +index 0deb8bad..00000000 +--- a/backends/x86_64_syscall.c ++++ /dev/null +@@ -1,50 +0,0 @@ +-/* Linux/x86-64 system call ABI in DWARF register numbers. +- 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 either +- +- * the GNU Lesser General Public License as published by the Free +- Software Foundation; either version 3 of the License, or (at +- your option) any later version +- +- or +- +- * 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 +- +- or both in parallel, as here. +- +- 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 copies of the GNU General Public License and +- the GNU Lesser General Public License along with this program. If +- not, see . */ +- +-#ifdef HAVE_CONFIG_H +-# include +-#endif +- +-#define BACKEND x86_64_ +-#include "libebl_CPU.h" +- +-int +-x86_64_syscall_abi (Ebl *ebl __attribute__ ((unused)), +- int *sp, int *pc, int *callno, int args[6]) +-{ +- *sp = 7; /* %rsp */ +- *pc = 16; /* %rip */ +- *callno = 0; /* %rax */ +- args[0] = 5; /* %rdi */ +- args[1] = 4; /* %rsi */ +- args[2] = 1; /* %rdx */ +- args[3] = 10; /* %r10 */ +- args[4] = 8; /* %r8 */ +- args[5] = 9; /* %r9 */ +- return 0; +-} +diff --git a/libebl/Makefile.am b/libebl/Makefile.am +index d0d475b8..d84e7ee2 100644 +--- a/libebl/Makefile.am ++++ b/libebl/Makefile.am +@@ -51,7 +51,7 @@ libebl_a_SOURCES = eblopenbackend.c eblclosebackend.c eblreloctypename.c \ + eblbsspltp.c eblretval.c eblreginfo.c eblnonerelocp.c \ + eblrelativerelocp.c eblsysvhashentrysize.c eblauxvinfo.c \ + eblcheckobjattr.c ebl_check_special_section.c \ +- ebl_syscall_abi.c eblabicfi.c eblstother.c eblinitreg.c \ ++ eblabicfi.c eblstother.c eblinitreg.c \ + ebldwarftoregno.c eblnormalizepc.c eblunwind.c \ + eblresolvesym.c eblcheckreloctargettype.c \ + ebl_data_marker_symbol.c +diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h +index 1e7960b8..1214bb84 100644 +--- a/libebl/ebl-hooks.h ++++ b/libebl/ebl-hooks.h +@@ -142,10 +142,6 @@ ssize_t EBLHOOK(register_info) (Ebl *ebl, + const char **prefix, const char **setname, + int *bits, int *type); + +-/* Return system call ABI registers. */ +-int EBLHOOK(syscall_abi) (Ebl *ebl, int *sp, int *pc, +- int *callno, int args[6]); +- + /* Disassembler function. */ + int EBLHOOK(disasm) (Ebl *ebl, const uint8_t **startp, const uint8_t *end, + GElf_Addr addr, const char *fmt, DisasmOutputCB_t outcb, +diff --git a/libebl/ebl_syscall_abi.c b/libebl/ebl_syscall_abi.c +deleted file mode 100644 +index a25369d2..00000000 +--- a/libebl/ebl_syscall_abi.c ++++ /dev/null +@@ -1,40 +0,0 @@ +-/* Return system call ABI mapped to DWARF register numbers. +- 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 either +- +- * the GNU Lesser General Public License as published by the Free +- Software Foundation; either version 3 of the License, or (at +- your option) any later version +- +- or +- +- * 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 +- +- or both in parallel, as here. +- +- 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 copies of the GNU General Public License and +- the GNU Lesser General Public License along with this program. If +- not, see . */ +- +-#ifdef HAVE_CONFIG_H +-# include +-#endif +- +-#include +- +- +-int +-ebl_syscall_abi (Ebl *ebl, int *sp, int *pc, int *callno, int *args) +-{ +- return ebl != NULL ? ebl->syscall_abi (ebl, sp, pc, callno, args) : -1; +-} +diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c +index b3b6fc01..90a83f26 100644 +--- a/libebl/eblopenbackend.c ++++ b/libebl/eblopenbackend.c +@@ -214,8 +214,6 @@ static ssize_t default_register_info (Ebl *ebl, + const char **prefix, + const char **setname, + int *bits, int *type); +-static int default_syscall_abi (Ebl *ebl, int *sp, int *pc, +- int *callno, int args[6]); + static bool default_check_object_attribute (Ebl *ebl, const char *vendor, + int tag, uint64_t value, + const char **tag_name, +@@ -259,7 +257,6 @@ fill_defaults (Ebl *result) + result->bss_plt_p = default_bss_plt_p; + result->return_value_location = default_return_value_location; + result->register_info = default_register_info; +- result->syscall_abi = default_syscall_abi; + result->check_object_attribute = default_check_object_attribute; + result->check_reloc_target_type = default_check_reloc_target_type; + result->disasm = NULL; +@@ -690,20 +687,6 @@ default_register_info (Ebl *ebl __attribute__ ((unused)), + return snprintf (name, namelen, "reg%d", regno); + } + +-static int +-default_syscall_abi (Ebl *ebl __attribute__ ((unused)), +- int *sp, int *pc, int *callno, int args[6]) +-{ +- *sp = *pc = *callno = -1; +- args[0] = -1; +- args[1] = -1; +- args[2] = -1; +- args[3] = -1; +- args[4] = -1; +- args[5] = -1; +- return -1; +-} +- + static bool + default_check_object_attribute (Ebl *ebl __attribute__ ((unused)), + const char *vendor __attribute__ ((unused)), +diff --git a/libebl/libebl.h b/libebl/libebl.h +index 23c0e950..731001d3 100644 +--- a/libebl/libebl.h ++++ b/libebl/libebl.h +@@ -241,14 +241,6 @@ extern ssize_t ebl_register_info (Ebl *ebl, + const char **prefix, const char **setname, + int *bits, int *type); + +-/* Fill in the DWARF register numbers for the registers used in system calls. +- The SP and PC are what kernel reports call the user stack pointer and PC. +- The CALLNO and ARGS are the system call number and incoming arguments. +- Each of these is filled with the DWARF register number corresponding, +- or -1 if there is none. Returns zero when the information is available. */ +-extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc, +- int *callno, int args[6]); +- + /* Supply the ABI-specified state of DWARF CFI before CIE initial programs. + + The DWARF 3.0 spec says that the default initial states of all registers +commit 4b2edc1161e6786b09b65da3a62ef24078324d4c +Author: Mark Wielaard +Date: Mon Oct 19 10:17:59 2020 +0200 + + libdw: dwarf_frame_register takes an array of at least 3 Dwarf_Ops + + GCC11 will warn about a mismatch in the declaration of dwarf_frame_register: + + dwarf_frame_register.c:37:61: error: argument 3 of type ‘Dwarf_Op *’ + declared as a pointer [-Werror=array-parameter=] + 37 | dwarf_frame_register (Dwarf_Frame *fs, int regno, Dwarf_Op *ops_mem, + | ~~~~~~~~~~^~~~~~~ + libdw.h:1068:43: note: previously declared as an array ‘Dwarf_Op[3]’ + 1068 | Dwarf_Op ops_mem[3], + | ~~~~~~~~~^~~~~~~~~~ + + When fixing that it will show an actual bug in the addrcfi testcase: + + addrcfi.c:98:16: error: ‘dwarf_frame_register’ accessing 96 bytes in a + region of size 64 [-Werror=stringop-overflow=] + 98 | int result = dwarf_frame_register (stuff->frame, regno, ops_mem, &ops, &nops); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + addrcfi.c:98:16: note: referencing argument 3 of type ‘Dwarf_Op *’ + 1069 | extern int dwarf_frame_register (Dwarf_Frame *frame, int regno, + | ^~~~~~~~~~~~~~~~~~~~ + + Fix the declaration, fix the bug and add an extra comment to the description + in libdw.h. + + Signed-off-by: Mark Wielaard + +diff --git a/libdw/dwarf_frame_register.c b/libdw/dwarf_frame_register.c +index d0159fb8..bcf3fa03 100644 +--- a/libdw/dwarf_frame_register.c ++++ b/libdw/dwarf_frame_register.c +@@ -34,7 +34,7 @@ + #include + + int +-dwarf_frame_register (Dwarf_Frame *fs, int regno, Dwarf_Op *ops_mem, ++dwarf_frame_register (Dwarf_Frame *fs, int regno, Dwarf_Op ops_mem[3], + Dwarf_Op **ops, size_t *nops) + { + /* Maybe there was a previous error. */ +diff --git a/libdw/libdw.h b/libdw/libdw.h +index 1a4e15a1..ad4fa6ea 100644 +--- a/libdw/libdw.h ++++ b/libdw/libdw.h +@@ -1061,9 +1061,11 @@ extern int dwarf_frame_cfa (Dwarf_Frame *frame, Dwarf_Op **ops, size_t *nops) + caller's REGNO is "same_value", i.e. this frame did not change it; + ask the caller frame where to find it. + +- For common simple expressions *OPS is OPS_MEM. For arbitrary DWARF +- expressions in the CFI, *OPS is an internal pointer that can be used as +- long as the Dwarf_CFI used to create FRAME remains alive. */ ++ For common simple expressions *OPS is OPS_MEM (which is a caller ++ owned array for for at least 3 Dwarf_Ops). For arbitrary DWARF ++ expressions in the CFI, *OPS is an internal pointer that can be ++ used as long as the Dwarf_CFI used to create FRAME remains ++ alive. */ + extern int dwarf_frame_register (Dwarf_Frame *frame, int regno, + Dwarf_Op ops_mem[3], + Dwarf_Op **ops, size_t *nops) +diff --git a/tests/addrcfi.c b/tests/addrcfi.c +index 589b8513..2b7d7bd0 100644 +--- a/tests/addrcfi.c ++++ b/tests/addrcfi.c +@@ -92,7 +92,7 @@ print_register (void *arg, + + printf ("\t%s reg%u (%s%s): ", setname, regno, prefix, regname); + +- Dwarf_Op ops_mem[2]; ++ Dwarf_Op ops_mem[3]; + Dwarf_Op *ops; + size_t nops; + int result = dwarf_frame_register (stuff->frame, regno, ops_mem, &ops, &nops); diff --git a/elfutils.spec b/elfutils.spec index fe23ae4..96ae649 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.181 -%global baserelease 2 +%global baserelease 3 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -61,6 +61,7 @@ BuildRequires: autoconf # Patches Patch1: elfutils-0.181-zstd.patch +Patch2: elfutils-0.181-array-param.patch %description Elfutils is a collection of utilities, including stack (to show @@ -230,6 +231,7 @@ such servers to download those files on demand. # Apply patches %patch1 -p1 -b .zstd +%patch2 -p1 -b .array_param autoreconf -f -v -i @@ -412,6 +414,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Oct 19 2020 Mark Wielaard - 0.181-3 +- Add elfutils-0.181-array-param.patch. + * Fri Sep 18 2020 Mark Wielaard - 0.181-2 - Add ZSTD support elfutils-0.181-zstd.patch. From cc0257826cd665a0f90755847f93f5b0d428bb85 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sat, 31 Oct 2020 17:52:50 +0100 Subject: [PATCH 126/216] elfutils 0.182 --- .gitignore | 1 + elfutils-0.181-array-param.patch | 472 ------------------------------- elfutils-0.181-zstd.patch | 348 ----------------------- elfutils.spec | 26 +- sources | 2 +- 5 files changed, 20 insertions(+), 829 deletions(-) delete mode 100644 elfutils-0.181-array-param.patch delete mode 100644 elfutils-0.181-zstd.patch diff --git a/.gitignore b/.gitignore index f7d1f6e..d0ad04a 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ /elfutils-0.179.tar.bz2 /elfutils-0.180.tar.bz2 /elfutils-0.181.tar.bz2 +/elfutils-0.182.tar.bz2 diff --git a/elfutils-0.181-array-param.patch b/elfutils-0.181-array-param.patch deleted file mode 100644 index 5099b1a..0000000 --- a/elfutils-0.181-array-param.patch +++ /dev/null @@ -1,472 +0,0 @@ -commit 09b034419ef16cf39abcd7a2df9d0fe704176d13 -Author: Mark Wielaard -Date: Sat Oct 17 21:22:22 2020 +0200 - - libebl: Remove unused ebl_syscall_abi. - - GCC11 -Warray-parameter warned about ebl_syscall_abi being inconsistently - declared (once with a pointer to int, once with an array of 6 int elements). - Since ebl_syscall_abi isn't actually used and was only implemented for - 3 backends without any tests just remove it. - - Signed-off-by: Mark Wielaard - -diff --git a/backends/Makefile.am b/backends/Makefile.am -index f4052125..3849f457 100644 ---- a/backends/Makefile.am -+++ b/backends/Makefile.am -@@ -40,13 +40,13 @@ modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \ - tilegx m68k bpf riscv csky - - i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_cfi.c \ -- i386_retval.c i386_regs.c i386_auxv.c i386_syscall.c \ -+ i386_retval.c i386_regs.c i386_auxv.c \ - i386_initreg.c i386_unwind.c - - sh_SRCS = sh_init.c sh_symbol.c sh_corenote.c sh_regs.c sh_retval.c - - x86_64_SRCS = x86_64_init.c x86_64_symbol.c x86_64_corenote.c x86_64_cfi.c \ -- x86_64_retval.c x86_64_regs.c x86_64_syscall.c x86_64_initreg.c \ -+ x86_64_retval.c x86_64_regs.c x86_64_initreg.c \ - x86_64_unwind.c x32_corenote.c - - -@@ -67,7 +67,7 @@ sparc_SRCS = sparc_init.c sparc_symbol.c sparc_regs.c sparc_retval.c \ - sparc_cfi.c sparc_initreg.c - - ppc_SRCS = ppc_init.c ppc_symbol.c ppc_retval.c ppc_regs.c \ -- ppc_corenote.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \ -+ ppc_corenote.c ppc_auxv.c ppc_attrs.c \ - ppc_cfi.c ppc_initreg.c - - ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c ppc64_corenote.c \ -diff --git a/backends/i386_init.c b/backends/i386_init.c -index 3f6b9ed1..579e5fad 100644 ---- a/backends/i386_init.c -+++ b/backends/i386_init.c -@@ -52,7 +52,6 @@ i386_init (Elf *elf __attribute__ ((unused)), - HOOK (eh, debugscn_p); - HOOK (eh, return_value_location); - HOOK (eh, register_info); -- HOOK (eh, syscall_abi); - HOOK (eh, auxv_info); - HOOK (eh, disasm); - HOOK (eh, abi_cfi); -diff --git a/backends/i386_syscall.c b/backends/i386_syscall.c -deleted file mode 100644 -index 535dcd86..00000000 ---- a/backends/i386_syscall.c -+++ /dev/null -@@ -1,50 +0,0 @@ --/* Linux/i386 system call ABI in DWARF register numbers. -- 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 either -- -- * the GNU Lesser General Public License as published by the Free -- Software Foundation; either version 3 of the License, or (at -- your option) any later version -- -- or -- -- * 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 -- -- or both in parallel, as here. -- -- 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 copies of the GNU General Public License and -- the GNU Lesser General Public License along with this program. If -- not, see . */ -- --#ifdef HAVE_CONFIG_H --# include --#endif -- --#define BACKEND i386_ --#include "libebl_CPU.h" -- --int --i386_syscall_abi (Ebl *ebl __attribute__ ((unused)), -- int *sp, int *pc, int *callno, int args[6]) --{ -- *sp = 4; /* %esp */ -- *pc = 8; /* %eip */ -- *callno = 0; /* %eax */ -- args[0] = 3; /* %ebx */ -- args[1] = 1; /* %ecx */ -- args[2] = 2; /* %edx */ -- args[3] = 6; /* %esi */ -- args[4] = 7; /* %edi */ -- args[5] = 5; /* %ebp */ -- return 0; --} -diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c -index f509aef6..ffc9842c 100644 ---- a/backends/ppc64_init.c -+++ b/backends/ppc64_init.c -@@ -58,7 +58,6 @@ ppc64_init (Elf *elf __attribute__ ((unused)), - HOOK (eh, bss_plt_p); - HOOK (eh, return_value_location); - HOOK (eh, register_info); -- HOOK (eh, syscall_abi); - HOOK (eh, core_note); - HOOK (eh, auxv_info); - HOOK (eh, check_object_attribute); -diff --git a/backends/ppc_init.c b/backends/ppc_init.c -index ac440ab2..08468f8f 100644 ---- a/backends/ppc_init.c -+++ b/backends/ppc_init.c -@@ -54,7 +54,6 @@ ppc_init (Elf *elf __attribute__ ((unused)), - HOOK (eh, bss_plt_p); - HOOK (eh, return_value_location); - HOOK (eh, register_info); -- HOOK (eh, syscall_abi); - HOOK (eh, core_note); - HOOK (eh, auxv_info); - HOOK (eh, check_object_attribute); -diff --git a/backends/ppc_syscall.c b/backends/ppc_syscall.c -deleted file mode 100644 -index b1b9c52b..00000000 ---- a/backends/ppc_syscall.c -+++ /dev/null -@@ -1,53 +0,0 @@ --/* Linux/PPC system call ABI in DWARF register numbers. -- 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 either -- -- * the GNU Lesser General Public License as published by the Free -- Software Foundation; either version 3 of the License, or (at -- your option) any later version -- -- or -- -- * 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 -- -- or both in parallel, as here. -- -- 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 copies of the GNU General Public License and -- the GNU Lesser General Public License along with this program. If -- not, see . */ -- --#ifdef HAVE_CONFIG_H --# include --#endif -- --#define BACKEND ppc_ --#include "libebl_CPU.h" -- --int --ppc_syscall_abi (Ebl *ebl __attribute__ ((unused)), -- int *sp, int *pc, int *callno, int args[6]) --{ -- *sp = 1; -- *pc = -1; -- *callno = 0; -- args[0] = 3; -- args[1] = 4; -- args[2] = 5; -- args[3] = 6; -- args[4] = 7; -- args[5] = 8; -- return 0; --} -- --__typeof (ppc_syscall_abi) --ppc64_syscall_abi __attribute__ ((alias ("ppc_syscall_abi"))); -diff --git a/backends/x86_64_init.c b/backends/x86_64_init.c -index 44c1ad28..8db9b643 100644 ---- a/backends/x86_64_init.c -+++ b/backends/x86_64_init.c -@@ -56,7 +56,6 @@ x86_64_init (Elf *elf __attribute__ ((unused)), - HOOK (eh, core_note); - HOOK (eh, return_value_location); - HOOK (eh, register_info); -- HOOK (eh, syscall_abi); - HOOK (eh, auxv_info); - HOOK (eh, disasm); - HOOK (eh, abi_cfi); -diff --git a/backends/x86_64_syscall.c b/backends/x86_64_syscall.c -deleted file mode 100644 -index 0deb8bad..00000000 ---- a/backends/x86_64_syscall.c -+++ /dev/null -@@ -1,50 +0,0 @@ --/* Linux/x86-64 system call ABI in DWARF register numbers. -- 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 either -- -- * the GNU Lesser General Public License as published by the Free -- Software Foundation; either version 3 of the License, or (at -- your option) any later version -- -- or -- -- * 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 -- -- or both in parallel, as here. -- -- 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 copies of the GNU General Public License and -- the GNU Lesser General Public License along with this program. If -- not, see . */ -- --#ifdef HAVE_CONFIG_H --# include --#endif -- --#define BACKEND x86_64_ --#include "libebl_CPU.h" -- --int --x86_64_syscall_abi (Ebl *ebl __attribute__ ((unused)), -- int *sp, int *pc, int *callno, int args[6]) --{ -- *sp = 7; /* %rsp */ -- *pc = 16; /* %rip */ -- *callno = 0; /* %rax */ -- args[0] = 5; /* %rdi */ -- args[1] = 4; /* %rsi */ -- args[2] = 1; /* %rdx */ -- args[3] = 10; /* %r10 */ -- args[4] = 8; /* %r8 */ -- args[5] = 9; /* %r9 */ -- return 0; --} -diff --git a/libebl/Makefile.am b/libebl/Makefile.am -index d0d475b8..d84e7ee2 100644 ---- a/libebl/Makefile.am -+++ b/libebl/Makefile.am -@@ -51,7 +51,7 @@ libebl_a_SOURCES = eblopenbackend.c eblclosebackend.c eblreloctypename.c \ - eblbsspltp.c eblretval.c eblreginfo.c eblnonerelocp.c \ - eblrelativerelocp.c eblsysvhashentrysize.c eblauxvinfo.c \ - eblcheckobjattr.c ebl_check_special_section.c \ -- ebl_syscall_abi.c eblabicfi.c eblstother.c eblinitreg.c \ -+ eblabicfi.c eblstother.c eblinitreg.c \ - ebldwarftoregno.c eblnormalizepc.c eblunwind.c \ - eblresolvesym.c eblcheckreloctargettype.c \ - ebl_data_marker_symbol.c -diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h -index 1e7960b8..1214bb84 100644 ---- a/libebl/ebl-hooks.h -+++ b/libebl/ebl-hooks.h -@@ -142,10 +142,6 @@ ssize_t EBLHOOK(register_info) (Ebl *ebl, - const char **prefix, const char **setname, - int *bits, int *type); - --/* Return system call ABI registers. */ --int EBLHOOK(syscall_abi) (Ebl *ebl, int *sp, int *pc, -- int *callno, int args[6]); -- - /* Disassembler function. */ - int EBLHOOK(disasm) (Ebl *ebl, const uint8_t **startp, const uint8_t *end, - GElf_Addr addr, const char *fmt, DisasmOutputCB_t outcb, -diff --git a/libebl/ebl_syscall_abi.c b/libebl/ebl_syscall_abi.c -deleted file mode 100644 -index a25369d2..00000000 ---- a/libebl/ebl_syscall_abi.c -+++ /dev/null -@@ -1,40 +0,0 @@ --/* Return system call ABI mapped to DWARF register numbers. -- 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 either -- -- * the GNU Lesser General Public License as published by the Free -- Software Foundation; either version 3 of the License, or (at -- your option) any later version -- -- or -- -- * 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 -- -- or both in parallel, as here. -- -- 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 copies of the GNU General Public License and -- the GNU Lesser General Public License along with this program. If -- not, see . */ -- --#ifdef HAVE_CONFIG_H --# include --#endif -- --#include -- -- --int --ebl_syscall_abi (Ebl *ebl, int *sp, int *pc, int *callno, int *args) --{ -- return ebl != NULL ? ebl->syscall_abi (ebl, sp, pc, callno, args) : -1; --} -diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c -index b3b6fc01..90a83f26 100644 ---- a/libebl/eblopenbackend.c -+++ b/libebl/eblopenbackend.c -@@ -214,8 +214,6 @@ static ssize_t default_register_info (Ebl *ebl, - const char **prefix, - const char **setname, - int *bits, int *type); --static int default_syscall_abi (Ebl *ebl, int *sp, int *pc, -- int *callno, int args[6]); - static bool default_check_object_attribute (Ebl *ebl, const char *vendor, - int tag, uint64_t value, - const char **tag_name, -@@ -259,7 +257,6 @@ fill_defaults (Ebl *result) - result->bss_plt_p = default_bss_plt_p; - result->return_value_location = default_return_value_location; - result->register_info = default_register_info; -- result->syscall_abi = default_syscall_abi; - result->check_object_attribute = default_check_object_attribute; - result->check_reloc_target_type = default_check_reloc_target_type; - result->disasm = NULL; -@@ -690,20 +687,6 @@ default_register_info (Ebl *ebl __attribute__ ((unused)), - return snprintf (name, namelen, "reg%d", regno); - } - --static int --default_syscall_abi (Ebl *ebl __attribute__ ((unused)), -- int *sp, int *pc, int *callno, int args[6]) --{ -- *sp = *pc = *callno = -1; -- args[0] = -1; -- args[1] = -1; -- args[2] = -1; -- args[3] = -1; -- args[4] = -1; -- args[5] = -1; -- return -1; --} -- - static bool - default_check_object_attribute (Ebl *ebl __attribute__ ((unused)), - const char *vendor __attribute__ ((unused)), -diff --git a/libebl/libebl.h b/libebl/libebl.h -index 23c0e950..731001d3 100644 ---- a/libebl/libebl.h -+++ b/libebl/libebl.h -@@ -241,14 +241,6 @@ extern ssize_t ebl_register_info (Ebl *ebl, - const char **prefix, const char **setname, - int *bits, int *type); - --/* Fill in the DWARF register numbers for the registers used in system calls. -- The SP and PC are what kernel reports call the user stack pointer and PC. -- The CALLNO and ARGS are the system call number and incoming arguments. -- Each of these is filled with the DWARF register number corresponding, -- or -1 if there is none. Returns zero when the information is available. */ --extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc, -- int *callno, int args[6]); -- - /* Supply the ABI-specified state of DWARF CFI before CIE initial programs. - - The DWARF 3.0 spec says that the default initial states of all registers -commit 4b2edc1161e6786b09b65da3a62ef24078324d4c -Author: Mark Wielaard -Date: Mon Oct 19 10:17:59 2020 +0200 - - libdw: dwarf_frame_register takes an array of at least 3 Dwarf_Ops - - GCC11 will warn about a mismatch in the declaration of dwarf_frame_register: - - dwarf_frame_register.c:37:61: error: argument 3 of type ‘Dwarf_Op *’ - declared as a pointer [-Werror=array-parameter=] - 37 | dwarf_frame_register (Dwarf_Frame *fs, int regno, Dwarf_Op *ops_mem, - | ~~~~~~~~~~^~~~~~~ - libdw.h:1068:43: note: previously declared as an array ‘Dwarf_Op[3]’ - 1068 | Dwarf_Op ops_mem[3], - | ~~~~~~~~~^~~~~~~~~~ - - When fixing that it will show an actual bug in the addrcfi testcase: - - addrcfi.c:98:16: error: ‘dwarf_frame_register’ accessing 96 bytes in a - region of size 64 [-Werror=stringop-overflow=] - 98 | int result = dwarf_frame_register (stuff->frame, regno, ops_mem, &ops, &nops); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - addrcfi.c:98:16: note: referencing argument 3 of type ‘Dwarf_Op *’ - 1069 | extern int dwarf_frame_register (Dwarf_Frame *frame, int regno, - | ^~~~~~~~~~~~~~~~~~~~ - - Fix the declaration, fix the bug and add an extra comment to the description - in libdw.h. - - Signed-off-by: Mark Wielaard - -diff --git a/libdw/dwarf_frame_register.c b/libdw/dwarf_frame_register.c -index d0159fb8..bcf3fa03 100644 ---- a/libdw/dwarf_frame_register.c -+++ b/libdw/dwarf_frame_register.c -@@ -34,7 +34,7 @@ - #include - - int --dwarf_frame_register (Dwarf_Frame *fs, int regno, Dwarf_Op *ops_mem, -+dwarf_frame_register (Dwarf_Frame *fs, int regno, Dwarf_Op ops_mem[3], - Dwarf_Op **ops, size_t *nops) - { - /* Maybe there was a previous error. */ -diff --git a/libdw/libdw.h b/libdw/libdw.h -index 1a4e15a1..ad4fa6ea 100644 ---- a/libdw/libdw.h -+++ b/libdw/libdw.h -@@ -1061,9 +1061,11 @@ extern int dwarf_frame_cfa (Dwarf_Frame *frame, Dwarf_Op **ops, size_t *nops) - caller's REGNO is "same_value", i.e. this frame did not change it; - ask the caller frame where to find it. - -- For common simple expressions *OPS is OPS_MEM. For arbitrary DWARF -- expressions in the CFI, *OPS is an internal pointer that can be used as -- long as the Dwarf_CFI used to create FRAME remains alive. */ -+ For common simple expressions *OPS is OPS_MEM (which is a caller -+ owned array for for at least 3 Dwarf_Ops). For arbitrary DWARF -+ expressions in the CFI, *OPS is an internal pointer that can be -+ used as long as the Dwarf_CFI used to create FRAME remains -+ alive. */ - extern int dwarf_frame_register (Dwarf_Frame *frame, int regno, - Dwarf_Op ops_mem[3], - Dwarf_Op **ops, size_t *nops) -diff --git a/tests/addrcfi.c b/tests/addrcfi.c -index 589b8513..2b7d7bd0 100644 ---- a/tests/addrcfi.c -+++ b/tests/addrcfi.c -@@ -92,7 +92,7 @@ print_register (void *arg, - - printf ("\t%s reg%u (%s%s): ", setname, regno, prefix, regname); - -- Dwarf_Op ops_mem[2]; -+ Dwarf_Op ops_mem[3]; - Dwarf_Op *ops; - size_t nops; - int result = dwarf_frame_register (stuff->frame, regno, ops_mem, &ops, &nops); diff --git a/elfutils-0.181-zstd.patch b/elfutils-0.181-zstd.patch deleted file mode 100644 index 1b68989..0000000 --- a/elfutils-0.181-zstd.patch +++ /dev/null @@ -1,348 +0,0 @@ -commit c5b0a640f0f7d2a195b822bcd88bb379476dbb97 -Author: Mark Wielaard -Date: Fri Sep 18 12:49:29 2020 +0200 - - zstd support - -diff --git a/config/elfutils.spec.in b/config/elfutils.spec.in -index 95f63f5a..37af1b07 100644 ---- a/config/elfutils.spec.in -+++ b/config/elfutils.spec.in -@@ -24,6 +24,7 @@ BuildRequires: flex - BuildRequires: zlib-devel - BuildRequires: bzip2-devel - BuildRequires: xz-devel -+BuildRequires: libzstd-devel - - # For debuginfod - BuildRequires: pkgconfig(libmicrohttpd) >= 0.9.33 -@@ -33,6 +34,7 @@ BuildRequires: pkgconfig(libarchive) >= 3.1.2 - - # For tests need to bunzip2 test files. - BuildRequires: bzip2 -+BuildRequires: zstd - # For the run-debuginfod-find.sh test case in %check for /usr/sbin/ss - BuildRequires: iproute - BuildRequires: bsdtar -diff --git a/config/libdw.pc.in b/config/libdw.pc.in -index 3fc283db..2e83a432 100644 ---- a/config/libdw.pc.in -+++ b/config/libdw.pc.in -@@ -17,6 +17,6 @@ Requires: libelf = @VERSION@ - - # We support various compressed ELF images, but don't export any of the - # data structures or functions. zlib (gz) is always required, bzip2 (bz2) --# and lzma (xz) are optional. But bzip2 doesn't have a pkg-config file. --Requires.private: zlib @LIBLZMA@ -+# lzma (xz) and zstd () are optional. But bzip2 doesn't have a pkg-config file. -+Requires.private: zlib @LIBLZMA@ @LIBZSTD@ - Libs.private: @BZ2_LIB@ -diff --git a/configure.ac b/configure.ac -index bf833872..1b794df3 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -397,8 +397,8 @@ eu_ZIPLIB(zlib,ZLIB,z,gzdirect,gzip) - AS_IF([test "x$with_zlib" = xno], [AC_MSG_ERROR([zlib not found but is required])]) - LIBS="$save_LIBS" - --dnl Test for bzlib and xz/lzma, gives BZLIB/LZMALIB .am --dnl conditional and config.h USE_BZLIB/USE_LZMALIB #define. -+dnl Test for bzlib and xz/lzma/zstd, gives BZLIB/LZMALIB/ZSTD .am -+dnl conditional and config.h USE_BZLIB/USE_LZMALIB/USE_ZSTD #define. - save_LIBS="$LIBS" - LIBS= - eu_ZIPLIB(bzlib,BZLIB,bz2,BZ2_bzdopen,bzip2) -@@ -408,6 +408,9 @@ AC_SUBST([BZ2_LIB]) - eu_ZIPLIB(lzma,LZMA,lzma,lzma_auto_decoder,[LZMA (xz)]) - AS_IF([test "x$with_lzma" = xyes], [LIBLZMA="liblzma"], [LIBLZMA=""]) - AC_SUBST([LIBLZMA]) -+eu_ZIPLIB(zstd,ZSTD,zstd,ZSTD_decompress,[ZSTD (zst)]) -+AS_IF([test "x$with_zstd" = xyes], [LIBZSTD="libzstd"], [LIBLZSTD=""]) -+AC_SUBST([LIBZSTD]) - zip_LIBS="$LIBS" - LIBS="$save_LIBS" - AC_SUBST([zip_LIBS]) -@@ -677,6 +680,10 @@ if test "$HAVE_BUNZIP2" = "no"; then - AC_MSG_WARN([No bunzip2, needed to run make check]) - fi - -+# For tests that need to use zstd compression -+AC_CHECK_PROG(HAVE_ZSTD, zstd, yes, no) -+AM_CONDITIONAL([HAVE_ZSTD],[test "x$HAVE_ZSTD" = "xyes"]) -+ - # Look for libcurl for libdebuginfod minimum version as per rhel7. - AC_ARG_ENABLE([libdebuginfod],AC_HELP_STRING([--enable-libdebuginfod], [Build debuginfod client library (can be =dummy)])) - AS_IF([test "x$enable_libdebuginfod" != "xno"], [ -@@ -742,6 +749,7 @@ AC_MSG_NOTICE([ - gzip support : ${with_zlib} - bzip2 support : ${with_bzlib} - lzma/xz support : ${with_lzma} -+ zstd support : ${with_zstd} - libstdc++ demangle support : ${enable_demangler} - File textrel check : ${enable_textrelcheck} - Symbol versioning : ${enable_symbol_versioning} -@@ -759,6 +767,7 @@ AC_MSG_NOTICE([ - - EXTRA TEST FEATURES (used with make check) - have bunzip2 installed (required) : ${HAVE_BUNZIP2} -+ have zstd installed : ${HAVE_ZSTD} - debug branch prediction : ${use_debugpred} - gprof support : ${use_gprof} - gcov support : ${use_gcov} -diff --git a/libdwfl/Makefile.am b/libdwfl/Makefile.am -index 1de05492..a0013e41 100644 ---- a/libdwfl/Makefile.am -+++ b/libdwfl/Makefile.am -@@ -78,6 +78,9 @@ endif - if LZMA - libdwfl_a_SOURCES += lzma.c - endif -+if ZSTD -+libdwfl_a_SOURCES += zstd.c -+endif - if LIBDEBUGINFOD - libdwfl_a_SOURCES += debuginfod-client.c - endif -diff --git a/libdwfl/gzip.c b/libdwfl/gzip.c -index e9988cc2..ba8ecfba 100644 ---- a/libdwfl/gzip.c -+++ b/libdwfl/gzip.c -@@ -48,6 +48,12 @@ - # define inflateInit(z) lzma_auto_decoder (z, 1 << 30, 0) - # define do_inflate(z) lzma_code (z, LZMA_RUN) - # define inflateEnd(z) lzma_end (z) -+#elif defined ZSTD -+# define USE_INFLATE 1 -+# include -+# define unzip __libdw_unzstd -+# define DWFL_E_ZLIB DWFL_E_ZSTD -+# define MAGIC "\x28\xb5\x2f\xfd" - #elif defined BZLIB - # define USE_INFLATE 1 - # include -@@ -119,6 +125,7 @@ fail (struct unzip_state *state, Dwfl_Error failure) - return failure; - } - -+#ifndef ZSTD - static inline Dwfl_Error - zlib_fail (struct unzip_state *state, int result) - { -@@ -132,6 +139,7 @@ zlib_fail (struct unzip_state *state, int result) - return fail (state, DWFL_E_ZLIB); - } - } -+#endif - - #if !USE_INFLATE - static Dwfl_Error -@@ -197,7 +205,7 @@ unzip (int fd, off_t start_offset, - - ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE, start_offset); - if (unlikely (n < 0)) -- return zlib_fail (&state, Z (ERRNO)); -+ return fail (&state, DWFL_E_ERRNO); - - state.input_pos = n; - mapped = state.input_buffer; -@@ -223,7 +231,74 @@ unzip (int fd, off_t start_offset, - /* Not a compressed file. */ - return DWFL_E_BADELF; - --#if USE_INFLATE -+#ifdef ZSTD -+ /* special case for libzstd since it is slightly different from the -+ API provided by bzlib and liblzma. */ -+ -+ void *next_in = mapped; -+ size_t avail_in = state.mapped_size; -+ void *next_out = NULL; -+ size_t avail_out = 0; -+ size_t total_out = 0; -+ -+ size_t result; -+ ZSTD_DCtx *dctx = ZSTD_createDCtx(); -+ if (dctx == NULL) -+ return fail (&state, DWFL_E_NOMEM); -+ -+ do -+ { -+ if (avail_in == 0 && state.input_buffer != NULL) -+ { -+ ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE, -+ start_offset + state.input_pos); -+ if (unlikely (n < 0)) -+ { -+ ZSTD_freeDCtx (dctx); -+ return fail (&state, DWFL_E_ERRNO); -+ } -+ next_in = state.input_buffer; -+ avail_in = n; -+ state.input_pos += n; -+ } -+ if (avail_out == 0) -+ { -+ ptrdiff_t pos = (void *) next_out - state.buffer; -+ if (!bigger_buffer (&state, avail_in)) -+ { -+ ZSTD_freeDCtx (dctx); -+ return fail (&state, DWFL_E_NOMEM); -+ } -+ next_out = state.buffer + pos; -+ avail_out = state.size - pos; -+ } -+ -+ ZSTD_inBuffer input = { next_in, avail_in, 0 }; -+ ZSTD_outBuffer output = { next_out, avail_out, 0 }; -+ result = ZSTD_decompressStream (dctx, &output, &input); -+ -+ if (! ZSTD_isError (result)) -+ { -+ total_out += output.pos; -+ next_out += output.pos; -+ avail_out -= output.pos; -+ next_in += input.pos; -+ avail_in -= input.pos; -+ } -+ -+ if (result == 0) -+ break; -+ } -+ while (avail_in > 0 && ! ZSTD_isError (result)); -+ -+ ZSTD_freeDCtx (dctx); -+ -+ if (ZSTD_isError (result)) -+ return fail (&state, DWFL_E_ZSTD); -+ -+ smaller_buffer (&state, total_out); -+ -+#elif USE_INFLATE - - /* This style actually only works with bzlib and liblzma. - The stupid zlib interface has nothing to grok the -diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h -index ad6779ad..4c6fcb28 100644 ---- a/libdwfl/libdwflP.h -+++ b/libdwfl/libdwflP.h -@@ -61,6 +61,7 @@ typedef struct Dwfl_Process Dwfl_Process; - DWFL_ERROR (ZLIB, N_("gzip decompression failed")) \ - DWFL_ERROR (BZLIB, N_("bzip2 decompression failed")) \ - DWFL_ERROR (LZMA, N_("LZMA decompression failed")) \ -+ DWFL_ERROR (ZSTD, N_("zstd decompression failed")) \ - DWFL_ERROR (UNKNOWN_MACHINE, N_("no support library found for machine")) \ - DWFL_ERROR (NOREL, N_("Callbacks missing for ET_REL file")) \ - DWFL_ERROR (BADRELTYPE, N_("Unsupported relocation type")) \ -@@ -612,6 +613,10 @@ extern Dwfl_Error __libdw_unlzma (int fd, off_t start_offset, - void *mapped, size_t mapped_size, - void **whole, size_t *whole_size) - internal_function; -+extern Dwfl_Error __libdw_unzstd (int fd, off_t start_offset, -+ void *mapped, size_t mapped_size, -+ void **whole, size_t *whole_size) -+ internal_function; - - /* Skip the image header before a file image: updates *START_OFFSET. */ - extern Dwfl_Error __libdw_image_header (int fd, off_t *start_offset, -diff --git a/libdwfl/open.c b/libdwfl/open.c -index 35fc5283..77bd2bd9 100644 ---- a/libdwfl/open.c -+++ b/libdwfl/open.c -@@ -44,6 +44,10 @@ - # define __libdw_unlzma(...) DWFL_E_BADELF - #endif - -+#if !USE_ZSTD -+# define __libdw_unzstd(...) DWFL_E_BADELF -+#endif -+ - /* Consumes and replaces *ELF only on success. */ - static Dwfl_Error - decompress (int fd __attribute__ ((unused)), Elf **elf) -@@ -64,6 +68,8 @@ decompress (int fd __attribute__ ((unused)), Elf **elf) - error = __libdw_bunzip2 (fd, offset, mapped, mapped_size, &buffer, &size); - if (error == DWFL_E_BADELF) - error = __libdw_unlzma (fd, offset, mapped, mapped_size, &buffer, &size); -+ if (error == DWFL_E_BADELF) -+ error = __libdw_unzstd (fd, offset, mapped, mapped_size, &buffer, &size); - - if (error == DWFL_E_NOERROR) - { -diff --git a/libdwfl/zstd.c b/libdwfl/zstd.c -new file mode 100644 -index 00000000..dc4d5238 ---- /dev/null -+++ b/libdwfl/zstd.c -@@ -0,0 +1,4 @@ -+/* libzstd is pretty close to zlib and bzlib. */ -+ -+#define ZSTD -+#include "gzip.c" -diff --git a/tests/Makefile.am b/tests/Makefile.am -index 4629ce64..9d0707da 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -204,6 +204,10 @@ if LZMA - TESTS += run-readelf-s.sh run-dwflsyms.sh - endif - -+if HAVE_ZSTD -+TESTS += run-readelf-compressed-zstd.sh -+endif -+ - if HAVE_LIBASM - check_PROGRAMS += $(asm_TESTS) - TESTS += $(asm_TESTS) run-disasm-bpf.sh -@@ -256,6 +260,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ - run-nm-syms.sh testfilesyms32.bz2 testfilesyms64.bz2 \ - run-nm-self.sh run-readelf-self.sh run-readelf-info-plus.sh \ - run-readelf-compressed.sh \ -+ run-readelf-compressed-zstd.sh \ - run-readelf-const-values.sh testfile-const-values.debug.bz2 \ - run-addrcfi.sh run-dwarfcfi.sh \ - testfile11-debugframe.bz2 testfile12-debugframe.bz2 \ -diff --git a/tests/run-readelf-compressed-zstd.sh b/tests/run-readelf-compressed-zstd.sh -new file mode 100755 -index 00000000..96208092 ---- /dev/null -+++ b/tests/run-readelf-compressed-zstd.sh -@@ -0,0 +1,39 @@ -+#! /bin/sh -+# Copyright (C) 2018 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 -+ -+if ! grep -q -F '#define USE_ZSTD' ${abs_top_builddir}/config.h; then -+ echo "elfutils built without zstd support" -+ exit 77 -+fi -+ -+# See run-strip-reloc.sh -+testfiles hello_i386.ko -+ -+tempfiles hello_i386.ko.zst readelf.out.1 readelf.out.2 -+ -+testrun ${abs_top_builddir}/src/readelf -a hello_i386.ko > readelf.out.1 -+zstd hello_i386.ko -+testrun ${abs_top_builddir}/src/readelf -a hello_i386.ko.zst > readelf.out.2 -+ -+diff -u readelf.out.1 readelf.out.2 -+if [ $? != 0 ]; then -+ exit 1; -+fi -+ -+exit 0 diff --git a/elfutils.spec b/elfutils.spec index 96ae649..6994f29 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils -Version: 0.181 -%global baserelease 3 +Version: 0.182 +%global baserelease 1 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -60,8 +60,6 @@ BuildRequires: autoconf %endif # Patches -Patch1: elfutils-0.181-zstd.patch -Patch2: elfutils-0.181-array-param.patch %description Elfutils is a collection of utilities, including stack (to show @@ -230,8 +228,6 @@ such servers to download those files on demand. %setup -q # Apply patches -%patch1 -p1 -b .zstd -%patch2 -p1 -b .array_param autoreconf -f -v -i @@ -270,6 +266,9 @@ chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib*.so* # We don't want the static libraries rm ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib{elf,dw,asm}.a +# We don't have standard DEBUGINFOD_URLS yet. +rm ${RPM_BUILD_ROOT}%{_sysconfdir}/profile.d/debuginfod.sh +rm ${RPM_BUILD_ROOT}%{_sysconfdir}/profile.d/debuginfod.csh %find_lang %{name} @@ -393,12 +392,13 @@ fi %files debuginfod %defattr(-,root,root) %{_bindir}/debuginfod -%config(noreplace) %verify(not md5 size mtime) %{_sysconfdir}/sysconfig/debuginfod +%config(noreplace) %{_sysconfdir}/sysconfig/debuginfod %{_unitdir}/debuginfod.service +%{_sysconfdir}/sysconfig/debuginfod %{_mandir}/man8/debuginfod.8* %dir %attr(0700,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod -%verify(not md5 size mtime) %attr(0600,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod/debuginfod.sqlite +%ghost %attr(0600,debuginfod,debuginfod) %{_localstatedir}/cache/debuginfod/debuginfod.sqlite %pre debuginfod getent group debuginfod >/dev/null || groupadd -r debuginfod @@ -414,6 +414,16 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Sat Oct 31 2020 Mark Wielaard - 0.182-1 +- Upgrade to upstream 0.182 + - backends: Support for tilegx has been removed. + - config: New /etc/profile.d files to provide default $DEBUGINFOD_URLS. + - debuginfod: More efficient package traversal, tolerate various + errors during scanning, grooming progress is more visible and + interruptible, more prometheus metrics. + - debuginfod-client: Now supports compressed (kernel) ELF images. + - libdwfl: Add ZSTD compression support. + * Mon Oct 19 2020 Mark Wielaard - 0.181-3 - Add elfutils-0.181-array-param.patch. diff --git a/sources b/sources index b0e26f0..8697cd9 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.181.tar.bz2) = d565541d5817f409dc89ebb1ee593366f69c371a1531308eeb67ff934b14a0fab0c9009fd7c23240efbaa1b4e04edac5c425e47d80e3e66ba03dcaf000afea36 +SHA512 (elfutils-0.182.tar.bz2) = 8ab0735bbe11b4383169341bf674ace360038b6ae5239f1d5a991c46260cd4bce545e078735b7de3b8fab132bb5da41f60689ff1b1d7ebccfada117a954a2c81 From a9f71f97e5b96753f886cb8cfd300ead5aa69a99 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Thu, 17 Dec 2020 04:59:39 +0000 Subject: [PATCH 127/216] Add BuildRequires: make https://fedoraproject.org/wiki/Changes/Remove_make_from_BuildRoot --- elfutils.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/elfutils.spec b/elfutils.spec index 6994f29..c27b90a 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -200,6 +200,7 @@ Requires: elfutils-libs%{depsuffix} = %{version}-%{release} Requires: elfutils-libelf%{depsuffix} = %{version}-%{release} Requires: elfutils-debuginfod-client%{depsuffix} = %{version}-%{release} BuildRequires: systemd +BuildRequires: make Requires(post): systemd Requires(preun): systemd Requires(postun): systemd From 29b93eed488fd41a40871c54dd8169f42380b1f7 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 17 Dec 2020 13:04:32 +0100 Subject: [PATCH 128/216] 0.182-2 - Add elfutils-0.182-s390-pid_memory_read.patch --- elfutils-0.182-s390-pid_memory_read.patch | 39 +++++++++++++++++++++++ elfutils.spec | 7 +++- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 elfutils-0.182-s390-pid_memory_read.patch diff --git a/elfutils-0.182-s390-pid_memory_read.patch b/elfutils-0.182-s390-pid_memory_read.patch new file mode 100644 index 0000000..2c056cb --- /dev/null +++ b/elfutils-0.182-s390-pid_memory_read.patch @@ -0,0 +1,39 @@ +commit e4d985a3c1c873f77d20fa0cd421458cc2824996 +Author: Andreas Krebbel +Date: Thu Nov 19 20:32:24 2020 +0100 + + IBM Z: Fix endianess problem in pid_memory_read + + The cached reads lack the big endian adjustments done in the fallback + path. + + Signed-off-by: Andreas Krebbel + +diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c +index 3a6af997..b23139d9 100644 +--- a/libdwfl/linux-pid-attach.c ++++ b/libdwfl/linux-pid-attach.c +@@ -193,14 +193,22 @@ pid_memory_read (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Word *result, void *arg) + { + struct __libdwfl_pid_arg *pid_arg = arg; + pid_t tid = pid_arg->tid_attached; ++ Dwfl_Process *process = dwfl->process; + assert (tid > 0); + + #ifdef HAVE_PROCESS_VM_READV + if (read_cached_memory (pid_arg, addr, result)) ++ { ++#if SIZEOF_LONG == 8 ++# if BYTE_ORDER == BIG_ENDIAN ++ if (ebl_get_elfclass (process->ebl) == ELFCLASS32) ++ *result >>= 32; ++# endif ++#endif + return true; ++ } + #endif + +- Dwfl_Process *process = dwfl->process; + if (ebl_get_elfclass (process->ebl) == ELFCLASS64) + { + #if SIZEOF_LONG == 8 diff --git a/elfutils.spec b/elfutils.spec index c27b90a..14349ab 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.182 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -60,6 +60,7 @@ BuildRequires: autoconf %endif # Patches +Patch1: elfutils-0.182-s390-pid_memory_read.patch %description Elfutils is a collection of utilities, including stack (to show @@ -229,6 +230,7 @@ such servers to download those files on demand. %setup -q # Apply patches +%patch1 -p1 autoreconf -f -v -i @@ -415,6 +417,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Thu Dec 17 2020 Mark Wielaard - 0.182-2 +- Add elfutils-0.182-s390-pid_memory_read.patch + * Sat Oct 31 2020 Mark Wielaard - 0.182-1 - Upgrade to upstream 0.182 - backends: Support for tilegx has been removed. From 27c1c2759c0f61a1ded0c577dcef50ac3c93adcf Mon Sep 17 00:00:00 2001 From: Robert Scheck Date: Thu, 24 Dec 2020 09:56:13 +0000 Subject: [PATCH 129/216] Spec file cleanup Remove old stuff no longer needed on all active branches --- elfutils.spec | 7 ------- 1 file changed, 7 deletions(-) diff --git a/elfutils.spec b/elfutils.spec index 14349ab..683592f 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -262,7 +262,6 @@ trap '' EXIT %make_build -s %install -rm -rf ${RPM_BUILD_ROOT} %make_install -s chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/lib*.so* @@ -315,7 +314,6 @@ fi %endif %files -%{!?_licensedir:%global license %%doc} %license COPYING COPYING-GPLV2 COPYING-LGPLV3 doc/COPYING-GFDL %doc README TODO CONTRIBUTING %{_bindir}/eu-addr2line @@ -338,7 +336,6 @@ fi %{_mandir}/man1/eu-*.1* %files libs -%{!?_licensedir:%global license %%doc} %license COPYING-GPLV2 COPYING-LGPLV3 %{_libdir}/libasm-%{version}.so %{_libdir}/libdw-%{version}.so @@ -360,7 +357,6 @@ fi %{_libdir}/pkgconfig/libdw.pc %files -f %{name}.lang libelf -%{!?_licensedir:%global license %%doc} %license COPYING-GPLV2 COPYING-LGPLV3 %{_libdir}/libelf-%{version}.so %{_libdir}/libelf.so.* @@ -379,21 +375,18 @@ fi %endif %files debuginfod-client -%defattr(-,root,root) %{_libdir}/libdebuginfod-%{version}.so %{_libdir}/libdebuginfod.so.* %{_bindir}/debuginfod-find %{_mandir}/man1/debuginfod-find.1* %files debuginfod-client-devel -%defattr(-,root,root) %{_libdir}/pkgconfig/libdebuginfod.pc %{_mandir}/man3/debuginfod_*.3* %{_includedir}/elfutils/debuginfod.h %{_libdir}/libdebuginfod.so %files debuginfod -%defattr(-,root,root) %{_bindir}/debuginfod %config(noreplace) %{_sysconfdir}/sysconfig/debuginfod %{_unitdir}/debuginfod.service From ceb631d7b41401202f89d35fd2e765aef11ee255 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Tue, 26 Jan 2021 04:26:50 +0000 Subject: [PATCH 130/216] - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_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 683592f..c69043a 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.182 -%global baserelease 2 +%global baserelease 3 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -410,6 +410,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Tue Jan 26 2021 Fedora Release Engineering - 0.182-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + * Thu Dec 17 2020 Mark Wielaard - 0.182-2 - Add elfutils-0.182-s390-pid_memory_read.patch From 639afad4058ad0cb00b564b4d000e3dd8196e478 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sun, 7 Feb 2021 20:39:39 +0100 Subject: [PATCH 131/216] 0.183-1 - Upgrade to upstream 0.183 --- .gitignore | 1 + elfutils-0.182-s390-pid_memory_read.patch | 39 ----------------------- elfutils.spec | 20 +++++++++--- sources | 2 +- 4 files changed, 18 insertions(+), 44 deletions(-) delete mode 100644 elfutils-0.182-s390-pid_memory_read.patch diff --git a/.gitignore b/.gitignore index d0ad04a..710bb51 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ /elfutils-0.180.tar.bz2 /elfutils-0.181.tar.bz2 /elfutils-0.182.tar.bz2 +/elfutils-0.183.tar.bz2 diff --git a/elfutils-0.182-s390-pid_memory_read.patch b/elfutils-0.182-s390-pid_memory_read.patch deleted file mode 100644 index 2c056cb..0000000 --- a/elfutils-0.182-s390-pid_memory_read.patch +++ /dev/null @@ -1,39 +0,0 @@ -commit e4d985a3c1c873f77d20fa0cd421458cc2824996 -Author: Andreas Krebbel -Date: Thu Nov 19 20:32:24 2020 +0100 - - IBM Z: Fix endianess problem in pid_memory_read - - The cached reads lack the big endian adjustments done in the fallback - path. - - Signed-off-by: Andreas Krebbel - -diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c -index 3a6af997..b23139d9 100644 ---- a/libdwfl/linux-pid-attach.c -+++ b/libdwfl/linux-pid-attach.c -@@ -193,14 +193,22 @@ pid_memory_read (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Word *result, void *arg) - { - struct __libdwfl_pid_arg *pid_arg = arg; - pid_t tid = pid_arg->tid_attached; -+ Dwfl_Process *process = dwfl->process; - assert (tid > 0); - - #ifdef HAVE_PROCESS_VM_READV - if (read_cached_memory (pid_arg, addr, result)) -+ { -+#if SIZEOF_LONG == 8 -+# if BYTE_ORDER == BIG_ENDIAN -+ if (ebl_get_elfclass (process->ebl) == ELFCLASS32) -+ *result >>= 32; -+# endif -+#endif - return true; -+ } - #endif - -- Dwfl_Process *process = dwfl->process; - if (ebl_get_elfclass (process->ebl) == ELFCLASS64) - { - #if SIZEOF_LONG == 8 diff --git a/elfutils.spec b/elfutils.spec index c69043a..e7d7922 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils -Version: 0.182 -%global baserelease 3 +Version: 0.183 +%global baserelease 1 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -49,6 +49,7 @@ BuildRequires: curl BuildRequires: automake BuildRequires: autoconf +BuildRequires: gettext-devel %global _gnu %{nil} %global _program_prefix eu- @@ -60,7 +61,6 @@ BuildRequires: autoconf %endif # Patches -Patch1: elfutils-0.182-s390-pid_memory_read.patch %description Elfutils is a collection of utilities, including stack (to show @@ -230,7 +230,6 @@ such servers to download those files on demand. %setup -q # Apply patches -%patch1 -p1 autoreconf -f -v -i @@ -410,6 +409,19 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Feb 8 2021 Mark Wielaard - 0.183-1 +- Upgrade to upstream 0.183 + - debuginfod: New thread-busy metric and more detailed error metrics. + New --fdcache-mintmp and tracking of filesystem freespace. + - debuginfod-client: DEBUGINFOD_SONAME macro added to debuginfod.h can + be used to dlopen the libdebuginfod.so library. + New function debuginfod_set_verbose_fd and DEBUGINFOD_VERBOSE + environment variable. + - config: profile.sh and profile.csh won't export DEBUGINFOD_URLS + unless configured --enable-debuginfod-urls[=URLS] + - elflint, readelf: Recognize SHF_GNU_RETAIN. + Handle SHT_X86_64_UNWIND as valid relocation target type. + * Tue Jan 26 2021 Fedora Release Engineering - 0.182-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild diff --git a/sources b/sources index 8697cd9..9e0e03d 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (elfutils-0.182.tar.bz2) = 8ab0735bbe11b4383169341bf674ace360038b6ae5239f1d5a991c46260cd4bce545e078735b7de3b8fab132bb5da41f60689ff1b1d7ebccfada117a954a2c81 +SHA512 (elfutils-0.183.tar.bz2) = bdafdd738a33cebe4f87849e5e6f1133881e77ef71b27faa0f0234ff80e9674f506957898326c2a55fd8438cbd189f7930597d0b4b9ca6c77921cc0cbd83b6b7 From 8cda32be22f01e35f786df20c2e04d2dd38a1c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 2 Mar 2021 16:13:53 +0100 Subject: [PATCH 132/216] Rebuilt for updated systemd-rpm-macros See https://pagure.io/fesco/issue/2583. --- elfutils.spec | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/elfutils.spec b/elfutils.spec index e7d7922..783c8c4 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.183 -%global baserelease 1 +%global baserelease 2 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -409,6 +409,10 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek - 0.183-2 +- Rebuilt for updated systemd-rpm-macros + See https://pagure.io/fesco/issue/2583. + * Mon Feb 8 2021 Mark Wielaard - 0.183-1 - Upgrade to upstream 0.183 - debuginfod: New thread-busy metric and more detailed error metrics. From 178121d8af4ecfc285628abb367adee265af14ff Mon Sep 17 00:00:00 2001 From: Martin Cermak Date: Wed, 24 Mar 2021 10:53:42 +0100 Subject: [PATCH 133/216] Introduce CI gating setup for elfutils Set up CI gating. This will introduce new testcase called fedora-ci.koji-build.tier0.functional and will configure it as a mandatory CI gating testcase for elfutils fedora builds. The provided test coverage comes from RHEL. This commit "upstreams" it and makes it public. The test cases are executed by running ./runtest.sh. The main.fmf file keeps the testcase metadata. Makefiles and PURPOSE files are legacy and could be dropped. We keep them for backward compatibility though. The plans and .fmf folders contain configuration files needed for execution of provided testcases within the Fedora CI infrastructure. Rest of the provided files are reproducer or helper files. Provided tests use Flexible Metadata Format, as documented in https://fmf.readthedocs.io/ . plans/ci.fmf: Change how from beakerlib to tmt Removed tests that didn't run unprivileged with tmt run --all provision --how=local - tests/Regression/GNU-Property-notes-not-recognized Tries to install extra pacakger with yum. - tests/Regression/bz447416-segfaults Tries to do eu-stack -p 1 - tests/Regression/elfutils-default-yama-scope-scriptlet-failed Does not have permission to do: grep /var/log/anaconda/packaging.log - tests/Sanity/yama-scope su: user ptrace_scope_testuser does not exist or the user entry does not contain all the required fields - tests/testsuite yum-builddep -y /tmp/tmp.7gnbiIzrYg/SPECS/elfutils.spec - tests/Regression/rpmtests Tries to download and builddep src.rpm package from koji. Removed not enabled tests: - tests/Regression/bz652858-elfutils-prelink-stap-interaction - tests/Sanity/elfutils-debuginfod CVE reproducers are now public, so no longer confidential. Remove unused tests/Sanity/elfutils-debuginfod/typescript --- .fmf/version | 1 + elfutils.spec | 5 +- gating.yaml | 13 ++ plans/ci.fmf | 6 + .../Makefile | 65 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 16 +++ .../runtest.sh | 43 +++++++ .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 15 +++ .../runtest.sh | 44 +++++++ .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + .../m.o | Bin 0 -> 880 bytes .../main.fmf | 15 +++ .../runtest.sh | 39 ++++++ .../Makefile | 63 ++++++++++ .../PURPOSE | 5 + .../eu-readelf-n-crash.core.xz | Bin 0 -> 360 bytes .../main.fmf | 16 +++ .../runtest.sh | 48 ++++++++ .../add-ppc64-fallback-unwinder/Makefile | 65 ++++++++++ .../add-ppc64-fallback-unwinder/PURPOSE | 5 + .../backtrace.ppc64le.fp.core.bz2 | Bin 0 -> 37786 bytes .../backtrace.ppc64le.fp.exec.bz2 | Bin 0 -> 383808 bytes .../add-ppc64-fallback-unwinder/main.fmf | 16 +++ .../add-ppc64-fallback-unwinder/output.ref | 17 +++ .../add-ppc64-fallback-unwinder/runtest.sh | 55 +++++++++ .../Regression/api-break-in-libasm-h/Makefile | 65 ++++++++++ .../Regression/api-break-in-libasm-h/PURPOSE | 3 + .../Regression/api-break-in-libasm-h/main.fmf | 14 +++ .../api-break-in-libasm-h/runtest.sh | 39 ++++++ tests/Regression/api-break-in-libasm-h/test.c | 6 + .../Makefile | 64 ++++++++++ .../PURPOSE | 12 ++ .../libantlr.a.bz2 | Bin 0 -> 103524 bytes .../main.fmf | 23 ++++ .../runtest.sh | 64 ++++++++++ .../Makefile | 65 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 16 +++ .../runtest.sh | 72 +++++++++++ .../bz1717349-vaguely-related-SEGV/Makefile | 64 ++++++++++ .../bz1717349-vaguely-related-SEGV/PURPOSE | 3 + .../bz1717349-vaguely-related-SEGV/main.fmf | 13 ++ .../qat_c3xxx.ko | Bin 0 -> 18712 bytes .../bz1717349-vaguely-related-SEGV/runtest.sh | 42 +++++++ .../Makefile | 63 ++++++++++ .../PURPOSE | 9 ++ .../ld.bz2 | Bin 0 -> 141187 bytes .../ld.debug.bz2 | Bin 0 -> 307251 bytes .../main.fmf | 20 +++ .../runtest.sh | 74 +++++++++++ .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + .../a.out | Bin 0 -> 8304 bytes .../main.fmf | 15 +++ .../runtest.sh | 60 +++++++++ .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 17 +++ .../runtest.sh | 56 +++++++++ .../vpoolengineUS.bz2 | Bin 0 -> 32098179 bytes .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 15 +++ .../proc_maps.txt | 82 +++++++++++++ .../runtest.sh | 53 ++++++++ .../Makefile | 64 ++++++++++ .../POC2 | Bin 0 -> 10467 bytes .../PURPOSE | 5 + .../main.fmf | 15 +++ .../runtest.sh | 39 ++++++ .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 16 +++ .../runtest.sh | 50 ++++++++ .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 15 +++ .../runtest.sh | 52 ++++++++ .../Makefile | 65 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 17 +++ .../runtest.sh | 66 ++++++++++ .../testinfo.desc | 16 +++ .../testprog.c | 115 ++++++++++++++++++ .../testprog2.c | 12 ++ .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 15 +++ .../runtest.sh | 36 ++++++ .../test3-clang.o | Bin 0 -> 46352 bytes .../require-compression-libraries/Makefile | 64 ++++++++++ .../require-compression-libraries/PURPOSE | 5 + .../require-compression-libraries/main.fmf | 16 +++ .../require-compression-libraries/runtest.sh | 38 ++++++ .../require-compression-libraries/t.c | 5 + .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + ...000001,sig_11,src_001936,op_flip1,pos_1100 | Bin 0 -> 6984 bytes ...g_11,src_002816,op_int16,pos_370,val_+1024 | Bin 0 -> 1456 bytes .../id_000002,src_001890,op_flip4,pos_371 | Bin 0 -> 1456 bytes ...00006,src_001890,op_arith8,pos_371,val_+14 | Bin 0 -> 1456 bytes .../id_000011,src_001899,op_flip1,pos_371 | Bin 0 -> 1456 bytes .../main.fmf | 15 +++ .../runtest.sh | 44 +++++++ .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 15 +++ .../runtest.sh | 47 +++++++ .../Makefile | 64 ++++++++++ .../PURPOSE | 5 + .../addr2line-buffer-over-flow1 | Bin 0 -> 1860 bytes .../main.fmf | 16 +++ .../runtest.sh | 39 ++++++ .../Double-free-libelf | Bin 0 -> 1896 bytes .../Makefile | 65 ++++++++++ .../PURPOSE | 5 + .../main.fmf | 16 +++ .../runtest.sh | 42 +++++++ .../Buffer-over-readelf | Bin 0 -> 2488 bytes .../Makefile | 65 ++++++++++ .../PURPOSE | 5 + .../bz1532205.supp | 25 ++++ .../main.fmf | 16 +++ .../runtest.sh | 43 +++++++ .../Makefile | 64 ++++++++++ .../POC-stack | Bin 0 -> 4542 bytes .../PURPOSE | 5 + .../main.fmf | 15 +++ .../runtest.sh | 39 ++++++ .../Makefile | 64 ++++++++++ .../POC-stack | Bin 0 -> 4542 bytes .../PURPOSE | 5 + .../bz1532205.supp | 25 ++++ .../main.fmf | 16 +++ .../runtest.sh | 42 +++++++ .../Makefile | 64 ++++++++++ .../POC1 | Bin 0 -> 4000 bytes .../PURPOSE | 3 + .../main.fmf | 13 ++ .../runtest.sh | 38 ++++++ .../Makefile | 64 ++++++++++ .../POC2 | Bin 0 -> 4000 bytes .../PURPOSE | 5 + .../main.fmf | 16 +++ .../runtest.sh | 42 +++++++ .../CVE-2018-18521-divide-by-zero/Makefile | 64 ++++++++++ .../CVE-2018-18521-divide-by-zero/POC2 | Bin 0 -> 4000 bytes .../CVE-2018-18521-divide-by-zero/PURPOSE | 5 + .../CVE-2018-18521-divide-by-zero/main.fmf | 16 +++ .../CVE-2018-18521-divide-by-zero/runtest.sh | 43 +++++++ .../Makefile | 64 ++++++++++ .../POC2 | Bin 0 -> 4000 bytes .../PURPOSE | 5 + .../main.fmf | 15 +++ .../runtest.sh | 38 ++++++ tests/Security/CVE-2019-7146/Makefile | 64 ++++++++++ tests/Security/CVE-2019-7146/PURPOSE | 3 + tests/Security/CVE-2019-7146/main.fmf | 14 +++ tests/Security/CVE-2019-7146/poc | Bin 0 -> 428 bytes tests/Security/CVE-2019-7146/runtest.sh | 41 +++++++ .../Makefile | 64 ++++++++++ .../POC1 | Bin 0 -> 3208 bytes .../PURPOSE | 5 + .../main.fmf | 16 +++ .../runtest.sh | 43 +++++++ .../Makefile | 64 ++++++++++ .../POC1 | Bin 0 -> 10442 bytes .../POC2 | Bin 0 -> 10467 bytes .../PURPOSE | 5 + .../main.fmf | 16 +++ .../runtest.sh | 40 ++++++ .../Makefile | 64 ++++++++++ .../POC | Bin 0 -> 10393 bytes .../PURPOSE | 5 + .../main.fmf | 16 +++ .../runtest.sh | 40 ++++++ .../Makefile | 64 ++++++++++ .../POC2 | Bin 0 -> 2659 bytes .../PURPOSE | 5 + .../main.fmf | 16 +++ .../runtest.sh | 41 +++++++ .../Makefile | 63 ++++++++++ .../PURPOSE | 5 + .../dwz-overflow.elf | Bin 0 -> 24928 bytes .../main.fmf | 16 +++ .../runtest.sh | 56 +++++++++ 190 files changed, 5074 insertions(+), 1 deletion(-) create mode 100644 .fmf/version create mode 100644 gating.yaml create mode 100644 plans/ci.fmf create mode 100644 tests/Regression/GNU-Attribute-notes-not-recognized/Makefile create mode 100644 tests/Regression/GNU-Attribute-notes-not-recognized/PURPOSE create mode 100644 tests/Regression/GNU-Attribute-notes-not-recognized/main.fmf create mode 100755 tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh create mode 100644 tests/Regression/RFE-support-reading-compressed-ELF-objects/Makefile create mode 100644 tests/Regression/RFE-support-reading-compressed-ELF-objects/PURPOSE create mode 100644 tests/Regression/RFE-support-reading-compressed-ELF-objects/main.fmf create mode 100755 tests/Regression/RFE-support-reading-compressed-ELF-objects/runtest.sh create mode 100644 tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/Makefile create mode 100644 tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/PURPOSE create mode 100644 tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/m.o create mode 100644 tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/main.fmf create mode 100755 tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/runtest.sh create mode 100644 tests/Regression/abrt-faf-elfutils-IO-default-xsputn/Makefile create mode 100644 tests/Regression/abrt-faf-elfutils-IO-default-xsputn/PURPOSE create mode 100644 tests/Regression/abrt-faf-elfutils-IO-default-xsputn/eu-readelf-n-crash.core.xz create mode 100644 tests/Regression/abrt-faf-elfutils-IO-default-xsputn/main.fmf create mode 100755 tests/Regression/abrt-faf-elfutils-IO-default-xsputn/runtest.sh create mode 100644 tests/Regression/add-ppc64-fallback-unwinder/Makefile create mode 100644 tests/Regression/add-ppc64-fallback-unwinder/PURPOSE create mode 100644 tests/Regression/add-ppc64-fallback-unwinder/backtrace.ppc64le.fp.core.bz2 create mode 100644 tests/Regression/add-ppc64-fallback-unwinder/backtrace.ppc64le.fp.exec.bz2 create mode 100644 tests/Regression/add-ppc64-fallback-unwinder/main.fmf create mode 100644 tests/Regression/add-ppc64-fallback-unwinder/output.ref create mode 100755 tests/Regression/add-ppc64-fallback-unwinder/runtest.sh create mode 100644 tests/Regression/api-break-in-libasm-h/Makefile create mode 100644 tests/Regression/api-break-in-libasm-h/PURPOSE create mode 100644 tests/Regression/api-break-in-libasm-h/main.fmf create mode 100755 tests/Regression/api-break-in-libasm-h/runtest.sh create mode 100644 tests/Regression/api-break-in-libasm-h/test.c create mode 100644 tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/Makefile create mode 100644 tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/PURPOSE create mode 100644 tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/libantlr.a.bz2 create mode 100644 tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/main.fmf create mode 100755 tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/runtest.sh create mode 100644 tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/Makefile create mode 100644 tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/PURPOSE create mode 100644 tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/main.fmf create mode 100755 tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/runtest.sh create mode 100644 tests/Regression/bz1717349-vaguely-related-SEGV/Makefile create mode 100644 tests/Regression/bz1717349-vaguely-related-SEGV/PURPOSE create mode 100644 tests/Regression/bz1717349-vaguely-related-SEGV/main.fmf create mode 100644 tests/Regression/bz1717349-vaguely-related-SEGV/qat_c3xxx.ko create mode 100755 tests/Regression/bz1717349-vaguely-related-SEGV/runtest.sh create mode 100644 tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/Makefile create mode 100644 tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/PURPOSE create mode 100755 tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/ld.bz2 create mode 100644 tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/ld.debug.bz2 create mode 100644 tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/main.fmf create mode 100755 tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/runtest.sh create mode 100644 tests/Regression/bz917874-RHDT-Assertion-failure-in-eu-addr2line/Makefile create mode 100644 tests/Regression/bz917874-RHDT-Assertion-failure-in-eu-addr2line/PURPOSE create mode 100644 tests/Regression/bz917874-RHDT-Assertion-failure-in-eu-addr2line/a.out create mode 100644 tests/Regression/bz917874-RHDT-Assertion-failure-in-eu-addr2line/main.fmf create mode 100755 tests/Regression/bz917874-RHDT-Assertion-failure-in-eu-addr2line/runtest.sh create mode 100644 tests/Regression/bz927626-RHDT-Stack-overflow-in-dwarf-getsrclines/Makefile create mode 100644 tests/Regression/bz927626-RHDT-Stack-overflow-in-dwarf-getsrclines/PURPOSE create mode 100644 tests/Regression/bz927626-RHDT-Stack-overflow-in-dwarf-getsrclines/main.fmf create mode 100755 tests/Regression/bz927626-RHDT-Stack-overflow-in-dwarf-getsrclines/runtest.sh create mode 100644 tests/Regression/bz927626-RHDT-Stack-overflow-in-dwarf-getsrclines/vpoolengineUS.bz2 create mode 100644 tests/Regression/bz967130-RHDT-eu-unstrip-M-abort-on-socket-line/Makefile create mode 100644 tests/Regression/bz967130-RHDT-eu-unstrip-M-abort-on-socket-line/PURPOSE create mode 100644 tests/Regression/bz967130-RHDT-eu-unstrip-M-abort-on-socket-line/main.fmf create mode 100644 tests/Regression/bz967130-RHDT-eu-unstrip-M-abort-on-socket-line/proc_maps.txt create mode 100755 tests/Regression/bz967130-RHDT-eu-unstrip-M-abort-on-socket-line/runtest.sh create mode 100644 tests/Regression/elfutils-segmentation-fault-in-elf64-xlatetom-in/Makefile create mode 100644 tests/Regression/elfutils-segmentation-fault-in-elf64-xlatetom-in/POC2 create mode 100644 tests/Regression/elfutils-segmentation-fault-in-elf64-xlatetom-in/PURPOSE create mode 100644 tests/Regression/elfutils-segmentation-fault-in-elf64-xlatetom-in/main.fmf create mode 100755 tests/Regression/elfutils-segmentation-fault-in-elf64-xlatetom-in/runtest.sh create mode 100644 tests/Regression/eu-readelf-reports-machine-type-is-unknown/Makefile create mode 100644 tests/Regression/eu-readelf-reports-machine-type-is-unknown/PURPOSE create mode 100644 tests/Regression/eu-readelf-reports-machine-type-is-unknown/main.fmf create mode 100755 tests/Regression/eu-readelf-reports-machine-type-is-unknown/runtest.sh create mode 100644 tests/Regression/eu-strip-generates-empty-output-if/Makefile create mode 100644 tests/Regression/eu-strip-generates-empty-output-if/PURPOSE create mode 100644 tests/Regression/eu-strip-generates-empty-output-if/main.fmf create mode 100755 tests/Regression/eu-strip-generates-empty-output-if/runtest.sh create mode 100644 tests/Regression/eu-strip-invalid-section-alignment-while/Makefile create mode 100644 tests/Regression/eu-strip-invalid-section-alignment-while/PURPOSE create mode 100644 tests/Regression/eu-strip-invalid-section-alignment-while/main.fmf create mode 100755 tests/Regression/eu-strip-invalid-section-alignment-while/runtest.sh create mode 100644 tests/Regression/eu-strip-invalid-section-alignment-while/testinfo.desc create mode 100644 tests/Regression/eu-strip-invalid-section-alignment-while/testprog.c create mode 100644 tests/Regression/eu-strip-invalid-section-alignment-while/testprog2.c create mode 100644 tests/Regression/initial-DWARF5-support-in-eu-readelf/Makefile create mode 100644 tests/Regression/initial-DWARF5-support-in-eu-readelf/PURPOSE create mode 100644 tests/Regression/initial-DWARF5-support-in-eu-readelf/main.fmf create mode 100755 tests/Regression/initial-DWARF5-support-in-eu-readelf/runtest.sh create mode 100644 tests/Regression/initial-DWARF5-support-in-eu-readelf/test3-clang.o create mode 100644 tests/Regression/require-compression-libraries/Makefile create mode 100644 tests/Regression/require-compression-libraries/PURPOSE create mode 100644 tests/Regression/require-compression-libraries/main.fmf create mode 100755 tests/Regression/require-compression-libraries/runtest.sh create mode 100644 tests/Regression/require-compression-libraries/t.c create mode 100644 tests/Regression/robustify-elfutils-0-172-against-bad-DWARF5-data/Makefile create mode 100644 tests/Regression/robustify-elfutils-0-172-against-bad-DWARF5-data/PURPOSE create mode 100644 tests/Regression/robustify-elfutils-0-172-against-bad-DWARF5-data/crashes/id_000001,sig_11,src_001936,op_flip1,pos_1100 create mode 100644 tests/Regression/robustify-elfutils-0-172-against-bad-DWARF5-data/crashes/id_000001,sig_11,src_002816,op_int16,pos_370,val_+1024 create mode 100644 tests/Regression/robustify-elfutils-0-172-against-bad-DWARF5-data/crashes/id_000002,src_001890,op_flip4,pos_371 create mode 100644 tests/Regression/robustify-elfutils-0-172-against-bad-DWARF5-data/crashes/id_000006,src_001890,op_arith8,pos_371,val_+14 create mode 100644 tests/Regression/robustify-elfutils-0-172-against-bad-DWARF5-data/crashes/id_000011,src_001899,op_flip1,pos_371 create mode 100644 tests/Regression/robustify-elfutils-0-172-against-bad-DWARF5-data/main.fmf create mode 100755 tests/Regression/robustify-elfutils-0-172-against-bad-DWARF5-data/runtest.sh create mode 100644 tests/Regression/static-relocations-not-known-to-older-linkers/Makefile create mode 100644 tests/Regression/static-relocations-not-known-to-older-linkers/PURPOSE create mode 100644 tests/Regression/static-relocations-not-known-to-older-linkers/main.fmf create mode 100755 tests/Regression/static-relocations-not-known-to-older-linkers/runtest.sh create mode 100644 tests/Security/CVE-2018-16062-elfutils-Heap-based-buffer-over-read/Makefile create mode 100644 tests/Security/CVE-2018-16062-elfutils-Heap-based-buffer-over-read/PURPOSE create mode 100644 tests/Security/CVE-2018-16062-elfutils-Heap-based-buffer-over-read/addr2line-buffer-over-flow1 create mode 100644 tests/Security/CVE-2018-16062-elfutils-Heap-based-buffer-over-read/main.fmf create mode 100755 tests/Security/CVE-2018-16062-elfutils-Heap-based-buffer-over-read/runtest.sh create mode 100644 tests/Security/CVE-2018-16402-double-free-due-to-double-decompression/Double-free-libelf create mode 100644 tests/Security/CVE-2018-16402-double-free-due-to-double-decompression/Makefile create mode 100644 tests/Security/CVE-2018-16402-double-free-due-to-double-decompression/PURPOSE create mode 100644 tests/Security/CVE-2018-16402-double-free-due-to-double-decompression/main.fmf create mode 100755 tests/Security/CVE-2018-16402-double-free-due-to-double-decompression/runtest.sh create mode 100644 tests/Security/CVE-2018-16403-heap-based-buffer-over-read-in-libdw-dwarf_getabbrev-c/Buffer-over-readelf create mode 100644 tests/Security/CVE-2018-16403-heap-based-buffer-over-read-in-libdw-dwarf_getabbrev-c/Makefile create mode 100644 tests/Security/CVE-2018-16403-heap-based-buffer-over-read-in-libdw-dwarf_getabbrev-c/PURPOSE create mode 100644 tests/Security/CVE-2018-16403-heap-based-buffer-over-read-in-libdw-dwarf_getabbrev-c/bz1532205.supp create mode 100644 tests/Security/CVE-2018-16403-heap-based-buffer-over-read-in-libdw-dwarf_getabbrev-c/main.fmf create mode 100755 tests/Security/CVE-2018-16403-heap-based-buffer-over-read-in-libdw-dwarf_getabbrev-c/runtest.sh create mode 100644 tests/Security/CVE-2018-18310-elfutils-invalid-memory-address-dereference/Makefile create mode 100644 tests/Security/CVE-2018-18310-elfutils-invalid-memory-address-dereference/POC-stack create mode 100644 tests/Security/CVE-2018-18310-elfutils-invalid-memory-address-dereference/PURPOSE create mode 100644 tests/Security/CVE-2018-18310-elfutils-invalid-memory-address-dereference/main.fmf create mode 100755 tests/Security/CVE-2018-18310-elfutils-invalid-memory-address-dereference/runtest.sh create mode 100644 tests/Security/CVE-2018-18310-invalid-memory-address-dereference/Makefile create mode 100644 tests/Security/CVE-2018-18310-invalid-memory-address-dereference/POC-stack create mode 100644 tests/Security/CVE-2018-18310-invalid-memory-address-dereference/PURPOSE create mode 100644 tests/Security/CVE-2018-18310-invalid-memory-address-dereference/bz1532205.supp create mode 100644 tests/Security/CVE-2018-18310-invalid-memory-address-dereference/main.fmf create mode 100755 tests/Security/CVE-2018-18310-invalid-memory-address-dereference/runtest.sh create mode 100644 tests/Security/CVE-2018-18520-elfutils-eu-size-cannot-handle-recursive-ar-files/Makefile create mode 100644 tests/Security/CVE-2018-18520-elfutils-eu-size-cannot-handle-recursive-ar-files/POC1 create mode 100644 tests/Security/CVE-2018-18520-elfutils-eu-size-cannot-handle-recursive-ar-files/PURPOSE create mode 100644 tests/Security/CVE-2018-18520-elfutils-eu-size-cannot-handle-recursive-ar-files/main.fmf create mode 100755 tests/Security/CVE-2018-18520-elfutils-eu-size-cannot-handle-recursive-ar-files/runtest.sh create mode 100644 tests/Security/CVE-2018-18520-eu-size-cannot-handle-recursive-ar-files/Makefile create mode 100644 tests/Security/CVE-2018-18520-eu-size-cannot-handle-recursive-ar-files/POC2 create mode 100644 tests/Security/CVE-2018-18520-eu-size-cannot-handle-recursive-ar-files/PURPOSE create mode 100644 tests/Security/CVE-2018-18520-eu-size-cannot-handle-recursive-ar-files/main.fmf create mode 100755 tests/Security/CVE-2018-18520-eu-size-cannot-handle-recursive-ar-files/runtest.sh create mode 100644 tests/Security/CVE-2018-18521-divide-by-zero/Makefile create mode 100644 tests/Security/CVE-2018-18521-divide-by-zero/POC2 create mode 100644 tests/Security/CVE-2018-18521-divide-by-zero/PURPOSE create mode 100644 tests/Security/CVE-2018-18521-divide-by-zero/main.fmf create mode 100755 tests/Security/CVE-2018-18521-divide-by-zero/runtest.sh create mode 100644 tests/Security/CVE-2018-18521-elfutils-Divide-by-zero-in-arlib_add_symbols-function-in-arlib-c/Makefile create mode 100644 tests/Security/CVE-2018-18521-elfutils-Divide-by-zero-in-arlib_add_symbols-function-in-arlib-c/POC2 create mode 100644 tests/Security/CVE-2018-18521-elfutils-Divide-by-zero-in-arlib_add_symbols-function-in-arlib-c/PURPOSE create mode 100644 tests/Security/CVE-2018-18521-elfutils-Divide-by-zero-in-arlib_add_symbols-function-in-arlib-c/main.fmf create mode 100755 tests/Security/CVE-2018-18521-elfutils-Divide-by-zero-in-arlib_add_symbols-function-in-arlib-c/runtest.sh create mode 100644 tests/Security/CVE-2019-7146/Makefile create mode 100644 tests/Security/CVE-2019-7146/PURPOSE create mode 100644 tests/Security/CVE-2019-7146/main.fmf create mode 100644 tests/Security/CVE-2019-7146/poc create mode 100755 tests/Security/CVE-2019-7146/runtest.sh create mode 100644 tests/Security/CVE-2019-7149-elfutils-heap-based-buffer-over-read/Makefile create mode 100644 tests/Security/CVE-2019-7149-elfutils-heap-based-buffer-over-read/POC1 create mode 100644 tests/Security/CVE-2019-7149-elfutils-heap-based-buffer-over-read/PURPOSE create mode 100644 tests/Security/CVE-2019-7149-elfutils-heap-based-buffer-over-read/main.fmf create mode 100755 tests/Security/CVE-2019-7149-elfutils-heap-based-buffer-over-read/runtest.sh create mode 100644 tests/Security/CVE-2019-7150-segmentation-fault-in-elf64_xlatetom/Makefile create mode 100644 tests/Security/CVE-2019-7150-segmentation-fault-in-elf64_xlatetom/POC1 create mode 100644 tests/Security/CVE-2019-7150-segmentation-fault-in-elf64_xlatetom/POC2 create mode 100644 tests/Security/CVE-2019-7150-segmentation-fault-in-elf64_xlatetom/PURPOSE create mode 100644 tests/Security/CVE-2019-7150-segmentation-fault-in-elf64_xlatetom/main.fmf create mode 100755 tests/Security/CVE-2019-7150-segmentation-fault-in-elf64_xlatetom/runtest.sh create mode 100644 tests/Security/CVE-2019-7664-Out-of-bound-write-in-elf_cvt_note/Makefile create mode 100644 tests/Security/CVE-2019-7664-Out-of-bound-write-in-elf_cvt_note/POC create mode 100644 tests/Security/CVE-2019-7664-Out-of-bound-write-in-elf_cvt_note/PURPOSE create mode 100644 tests/Security/CVE-2019-7664-Out-of-bound-write-in-elf_cvt_note/main.fmf create mode 100755 tests/Security/CVE-2019-7664-Out-of-bound-write-in-elf_cvt_note/runtest.sh create mode 100644 tests/Security/CVE-2019-7665-heap-based-buffer-over-read-in-function-elf32_xlatetom/Makefile create mode 100644 tests/Security/CVE-2019-7665-heap-based-buffer-over-read-in-function-elf32_xlatetom/POC2 create mode 100644 tests/Security/CVE-2019-7665-heap-based-buffer-over-read-in-function-elf32_xlatetom/PURPOSE create mode 100644 tests/Security/CVE-2019-7665-heap-based-buffer-over-read-in-function-elf32_xlatetom/main.fmf create mode 100755 tests/Security/CVE-2019-7665-heap-based-buffer-over-read-in-function-elf32_xlatetom/runtest.sh create mode 100644 tests/Security/bz1139128-CVE-2014-0172-elfutils-integer-overflow/Makefile create mode 100644 tests/Security/bz1139128-CVE-2014-0172-elfutils-integer-overflow/PURPOSE create mode 100644 tests/Security/bz1139128-CVE-2014-0172-elfutils-integer-overflow/dwz-overflow.elf create mode 100644 tests/Security/bz1139128-CVE-2014-0172-elfutils-integer-overflow/main.fmf create mode 100755 tests/Security/bz1139128-CVE-2014-0172-elfutils-integer-overflow/runtest.sh diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/elfutils.spec b/elfutils.spec index 783c8c4..28460d3 100644 --- a/elfutils.spec +++ b/elfutils.spec @@ -1,6 +1,6 @@ Name: elfutils Version: 0.183 -%global baserelease 2 +%global baserelease 3 Release: %{baserelease}%{?dist} URL: http://elfutils.org/ %global source_url ftp://sourceware.org/pub/elfutils/%{version}/ @@ -409,6 +409,9 @@ exit 0 %systemd_postun_with_restart debuginfod.service %changelog +* Mon Apr 19 2021 Mark Wielaard - 0.183-3 +- Introduce CI gating setup + * Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek - 0.183-2 - Rebuilt for updated systemd-rpm-macros See https://pagure.io/fesco/issue/2583. diff --git a/gating.yaml b/gating.yaml new file mode 100644 index 0000000..4fab4ec --- /dev/null +++ b/gating.yaml @@ -0,0 +1,13 @@ +--- !Policy +product_versions: + - fedora-* +decision_context: bodhi_update_push_stable +subject_type: koji_build +rules: + - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional} +--- !Policy +product_versions: + - rhel-9 +decision_context: osci_compose_gate +rules: + - !PassingTestCaseRule {test_case_name: baseos-ci.brew-build.tier1.functional} diff --git a/plans/ci.fmf b/plans/ci.fmf new file mode 100644 index 0000000..85710d6 --- /dev/null +++ b/plans/ci.fmf @@ -0,0 +1,6 @@ +summary: CI Gating Plan +discover: + how: fmf + directory: tests +execute: + how: tmt diff --git a/tests/Regression/GNU-Attribute-notes-not-recognized/Makefile b/tests/Regression/GNU-Attribute-notes-not-recognized/Makefile new file mode 100644 index 0000000..03e071d --- /dev/null +++ b/tests/Regression/GNU-Attribute-notes-not-recognized/Makefile @@ -0,0 +1,65 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /tools/elfutils/Regression/GNU-Attribute-notes-not-recognized +# Description: GNU-Attribute-notes-not-recognized +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2018 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/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/tools/elfutils/Regression/GNU-Attribute-notes-not-recognized +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Martin Cermak " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: GNU-Attribute-notes-not-recognized" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 48h" >> $(METADATA) + @echo "RunFor: elfutils" >> $(METADATA) + @echo "Requires: elfutils" >> $(METADATA) + @echo "Requires: bash" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 1650125" >> $(METADATA) + @echo "Releases: -RHEL4 -RHEL6 -RHEL7 -RHELClient5 -RHELServer5" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/tests/Regression/GNU-Attribute-notes-not-recognized/PURPOSE b/tests/Regression/GNU-Attribute-notes-not-recognized/PURPOSE new file mode 100644 index 0000000..8f81c9c --- /dev/null +++ b/tests/Regression/GNU-Attribute-notes-not-recognized/PURPOSE @@ -0,0 +1,5 @@ +PURPOSE of /tools/elfutils/Regression/GNU-Attribute-notes-not-recognized +Description: GNU-Attribute-notes-not-recognized +Author: Martin Cermak +Bug summary: elfutils doesn't recognize GNU Attribute notes +Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1650125 diff --git a/tests/Regression/GNU-Attribute-notes-not-recognized/main.fmf b/tests/Regression/GNU-Attribute-notes-not-recognized/main.fmf new file mode 100644 index 0000000..896cbd2 --- /dev/null +++ b/tests/Regression/GNU-Attribute-notes-not-recognized/main.fmf @@ -0,0 +1,16 @@ +summary: GNU-Attribute-notes-not-recognized +description: | + Bug summary: elfutils doesn't recognize GNU Attribute notes + Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1650125 +contact: +- Martin Cermak +component: +- elfutils +test: ./runtest.sh +framework: beakerlib +recommend: +- elfutils +- bash +duration: 48h +extra-summary: /tools/elfutils/Regression/GNU-Attribute-notes-not-recognized +extra-task: /tools/elfutils/Regression/GNU-Attribute-notes-not-recognized diff --git a/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh b/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh new file mode 100755 index 0000000..d60f5ac --- /dev/null +++ b/tests/Regression/GNU-Attribute-notes-not-recognized/runtest.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/elfutils/Regression/GNU-Attribute-notes-not-recognized +# Description: GNU-Attribute-notes-not-recognized +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2018 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 + rlPhaseStartTest + # Rely on that /bin/bash is annobin-annotated per + # - https://fedoraproject.org/wiki/Toolchain/Watermark + # - https://fedoraproject.org/wiki/Changes/Annobin + # Seems to work fine with bash-4.4.19-6.el8 and elfutils-0.174-5.el8. + set -o pipefail + rlRun "eu-readelf -n /bin/bash | grep -2 '^ GA' | fgrep 'GNU Build Attribute' | tail -50" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/RFE-support-reading-compressed-ELF-objects/Makefile b/tests/Regression/RFE-support-reading-compressed-ELF-objects/Makefile new file mode 100644 index 0000000..13ee890 --- /dev/null +++ b/tests/Regression/RFE-support-reading-compressed-ELF-objects/Makefile @@ -0,0 +1,64 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /tools/elfutils/Regression/RFE-support-reading-compressed-ELF-objects +# Description: Test for BZ#1674430 (RFE support reading compressed ELF objects) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2019 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/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/tools/elfutils/Regression/RFE-support-reading-compressed-ELF-objects +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Martin Cermak " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: Test for BZ#1674430 (RFE support reading compressed ELF objects)" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 48h" >> $(METADATA) + @echo "RunFor: elfutils" >> $(METADATA) + @echo "Requires: elfutils" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 1674430" >> $(METADATA) + @echo "Releases: -RHEL4 -RHELClient5 -RHELServer5" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/tests/Regression/RFE-support-reading-compressed-ELF-objects/PURPOSE b/tests/Regression/RFE-support-reading-compressed-ELF-objects/PURPOSE new file mode 100644 index 0000000..5d1cbba --- /dev/null +++ b/tests/Regression/RFE-support-reading-compressed-ELF-objects/PURPOSE @@ -0,0 +1,5 @@ +PURPOSE of /tools/elfutils/Regression/RFE-support-reading-compressed-ELF-objects +Description: Test for BZ#1674430 (RFE support reading compressed ELF objects) +Author: Martin Cermak +Bug summary: RFE: support reading compressed ELF objects +Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1674430 diff --git a/tests/Regression/RFE-support-reading-compressed-ELF-objects/main.fmf b/tests/Regression/RFE-support-reading-compressed-ELF-objects/main.fmf new file mode 100644 index 0000000..3053404 --- /dev/null +++ b/tests/Regression/RFE-support-reading-compressed-ELF-objects/main.fmf @@ -0,0 +1,15 @@ +summary: Test for BZ#1674430 (RFE support reading compressed ELF objects) +description: | + Bug summary: RFE: support reading compressed ELF objects + Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1674430 +contact: +- Martin Cermak +component: +- elfutils +test: ./runtest.sh +framework: beakerlib +recommend: +- elfutils +duration: 48h +extra-summary: /tools/elfutils/Regression/RFE-support-reading-compressed-ELF-objects +extra-task: /tools/elfutils/Regression/RFE-support-reading-compressed-ELF-objects diff --git a/tests/Regression/RFE-support-reading-compressed-ELF-objects/runtest.sh b/tests/Regression/RFE-support-reading-compressed-ELF-objects/runtest.sh new file mode 100755 index 0000000..c39793d --- /dev/null +++ b/tests/Regression/RFE-support-reading-compressed-ELF-objects/runtest.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/elfutils/Regression/RFE-support-reading-compressed-ELF-objects +# Description: Test for BZ#1674430 (RFE support reading compressed ELF objects) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2019 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" +KOXZS_TO_TEST=20 + +rlJournalStart + rlPhaseStartTest + # Look to see that dwelf_elf_begin is now in libdw.so + rlRun "eu-nm -D $(ldd $(which eu-readelf) | awk '/libdw.so/ {print $3}') | fgrep 'dwelf_elf_begin'" + # Also eu-readelf now takes advantage of dwelf_elf_begin() to directly read compressed ELF files. + for koxz in $(find /usr/lib/modules/ | fgrep '.ko.xz' | shuf -n $KOXZS_TO_TEST); do + rlRun "eu-readelf -n $koxz" + done + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/Makefile b/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/Makefile new file mode 100644 index 0000000..3923e29 --- /dev/null +++ b/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/Makefile @@ -0,0 +1,64 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /tools/elfutils/Regression/SHT_X86_64_UNWIND-section-not-recognized +# Description: SHT_X86_64_UNWIND-section-not-recognized +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2018 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/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/tools/elfutils/Regression/SHT_X86_64_UNWIND-section-not-recognized +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE m.o + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Martin Cermak " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: SHT_X86_64_UNWIND-section-not-recognized" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 48h" >> $(METADATA) + @echo "RunFor: elfutils" >> $(METADATA) + @echo "Requires: elfutils" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 1650114" >> $(METADATA) + @echo "Releases: -RHEL4 -RHEL6 -RHEL7 -RHELClient5 -RHELServer5" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/PURPOSE b/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/PURPOSE new file mode 100644 index 0000000..a725362 --- /dev/null +++ b/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/PURPOSE @@ -0,0 +1,5 @@ +PURPOSE of /tools/elfutils/Regression/SHT_X86_64_UNWIND-section-not-recognized +Description: SHT_X86_64_UNWIND-section-not-recognized +Author: Martin Cermak +Bug summary: elfutils doesn't recognize gold linker SHT_X86_64_UNWIND section +Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1650114 diff --git a/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/m.o b/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/m.o new file mode 100644 index 0000000000000000000000000000000000000000..cd5b63921ba786041ee8586710e85fee1b9de6b1 GIT binary patch literal 880 zcmb7?K}!Nb6vzLgl^!aVCoXPKyZ2A?uNpb;E@WIxC4(KeI4@)U-5sA0i>7Max|Y>V$T{| zj9%*}+0W@rspl5DPc|9y7i|$hoz^^|oBAg1kUz;dDGTX-og-s?`sppC<1G@lNrUqCQT~$<#OgUwE503jhEB literal 0 HcmV?d00001 diff --git a/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/main.fmf b/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/main.fmf new file mode 100644 index 0000000..669db9f --- /dev/null +++ b/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/main.fmf @@ -0,0 +1,15 @@ +summary: SHT_X86_64_UNWIND-section-not-recognized +description: | + Bug summary: elfutils doesn't recognize gold linker SHT_X86_64_UNWIND section + Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1650114 +contact: +- Martin Cermak +component: +- elfutils +test: ./runtest.sh +framework: beakerlib +recommend: +- elfutils +duration: 48h +extra-summary: /tools/elfutils/Regression/SHT_X86_64_UNWIND-section-not-recognized +extra-task: /tools/elfutils/Regression/SHT_X86_64_UNWIND-section-not-recognized diff --git a/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/runtest.sh b/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/runtest.sh new file mode 100755 index 0000000..cd5a8d6 --- /dev/null +++ b/tests/Regression/SHT_X86_64_UNWIND-section-not-recognized/runtest.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/elfutils/Regression/SHT_X86_64_UNWIND-section-not-recognized +# Description: SHT_X86_64_UNWIND-section-not-recognized +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2018 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 + rlPhaseStartTest + set -o pipefail + rlRun "eu-readelf -S m.o | fgrep .eh_frame | fgrep X86_64_UNWIND" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/Makefile b/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/Makefile new file mode 100644 index 0000000..d8c5c79 --- /dev/null +++ b/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/Makefile @@ -0,0 +1,63 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /tools/elfutils/Regression/abrt-faf-elfutils-IO-default-xsputn +# Description: abrt-faf-elfutils-IO-default-xsputn +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2015 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/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/tools/elfutils/Regression/abrt-faf-elfutils-IO-default-xsputn +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE eu-readelf-n-crash.core.xz + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Martin Cermak " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: abrt-faf-elfutils-IO-default-xsputn" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 5m" >> $(METADATA) + @echo "RunFor: elfutils" >> $(METADATA) + @echo "Requires: elfutils xz" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 1262839" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/PURPOSE b/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/PURPOSE new file mode 100644 index 0000000..33a3c69 --- /dev/null +++ b/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/PURPOSE @@ -0,0 +1,5 @@ +PURPOSE of /tools/elfutils/Regression/abrt-faf-elfutils-IO-default-xsputn +Description: abrt-faf-elfutils-IO-default-xsputn +Author: Martin Cermak +Bug summary: [abrt] [faf] elfutils: _IO_default_xsputn(): /usr/bin/eu-readelf killed by 11 +Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1262839 diff --git a/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/eu-readelf-n-crash.core.xz b/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/eu-readelf-n-crash.core.xz new file mode 100644 index 0000000000000000000000000000000000000000..9326d2e67b083416dc2e7b0274779688d2797d64 GIT binary patch literal 360 zcmV-u0hj*$H+ooF000E$*0e?f03iVu0001VFXf})408b{T>w9kMTBTQiLIB4=izwQ z=ox2*tJSE4VH-EJ7)fmyrb!7@VemI`y&)%;kPz|6HSrgxuyb@JGyN5r4CMdEaF&!2 zz|c%#$+(I|?bAw*$&-ACm5fSsfbR7vrE$H;^RDoquBQf)l@}fd2z0Xq=nZq|Dz*8b zj9jcLNCn{E`JqthjPxj*rhe;Q|?1S|*pDX&|3M=8FqOawirXY8TonXhtZC-=dm zYYou*pxxljU5oLk3ZU(a>XV^1pv%W$d=usg_0H(urpcQ{&HAbzz;+()Gfl+{uw2Z1 zs31H4;=Q*hEZ}#|4hI5g%v0|G0000Z9s!~b7Lu$00m1_G7ytk|ON9Qh#Ao{g00000 G1X)@pb*iHP literal 0 HcmV?d00001 diff --git a/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/main.fmf b/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/main.fmf new file mode 100644 index 0000000..48f5fc9 --- /dev/null +++ b/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/main.fmf @@ -0,0 +1,16 @@ +summary: abrt-faf-elfutils-IO-default-xsputn +description: | + Bug summary: [abrt] [faf] elfutils: _IO_default_xsputn(): /usr/bin/eu-readelf killed by 11 + Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1262839 +contact: +- Martin Cermak +component: +- elfutils +test: ./runtest.sh +framework: beakerlib +recommend: +- elfutils +- xz +duration: 5m +extra-summary: /tools/elfutils/Regression/abrt-faf-elfutils-IO-default-xsputn +extra-task: /tools/elfutils/Regression/abrt-faf-elfutils-IO-default-xsputn diff --git a/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/runtest.sh b/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/runtest.sh new file mode 100755 index 0000000..685d143 --- /dev/null +++ b/tests/Regression/abrt-faf-elfutils-IO-default-xsputn/runtest.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/elfutils/Regression/abrt-faf-elfutils-IO-default-xsputn +# Description: abrt-faf-elfutils-IO-default-xsputn +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2015 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 + +rlJournalStart + rlPhaseStartSetup + rlRun "TMPD=$(mktemp -d)" + rlRun "cp eu-readelf-n-crash.core.xz $TMPD/" + rlRun "pushd $TMPD" + rlRun "unxz eu-readelf-n-crash.core.xz" + rlPhaseEnd + + rlPhaseStartTest + rlRun "eu-readelf -n ./eu-readelf-n-crash.core" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPD" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/add-ppc64-fallback-unwinder/Makefile b/tests/Regression/add-ppc64-fallback-unwinder/Makefile new file mode 100644 index 0000000..c6ab7c3 --- /dev/null +++ b/tests/Regression/add-ppc64-fallback-unwinder/Makefile @@ -0,0 +1,65 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /tools/elfutils/Regression/add-ppc64-fallback-unwinder +# Description: add-ppc64-fallback-unwinder +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2017 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/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/tools/elfutils/Regression/add-ppc64-fallback-unwinder +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE backtrace.ppc64le.fp.core.bz2 backtrace.ppc64le.fp.exec.bz2 output.ref + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Martin Cermak " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: add-ppc64-fallback-unwinder" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 10m" >> $(METADATA) + @echo "RunFor: elfutils" >> $(METADATA) + @echo "Requires: elfutils" >> $(METADATA) + @echo "Requires: bzip2" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 1454754" >> $(METADATA) + @echo "Releases: -RHEL4 -RHELClient5 -RHELServer5" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/tests/Regression/add-ppc64-fallback-unwinder/PURPOSE b/tests/Regression/add-ppc64-fallback-unwinder/PURPOSE new file mode 100644 index 0000000..198b5c0 --- /dev/null +++ b/tests/Regression/add-ppc64-fallback-unwinder/PURPOSE @@ -0,0 +1,5 @@ +PURPOSE of /tools/elfutils/Regression/add-ppc64-fallback-unwinder +Description: add-ppc64-fallback-unwinder +Author: Martin Cermak +Bug summary: Add ppc64 fallback unwinder to elfutils libdw +Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1454754 diff --git a/tests/Regression/add-ppc64-fallback-unwinder/backtrace.ppc64le.fp.core.bz2 b/tests/Regression/add-ppc64-fallback-unwinder/backtrace.ppc64le.fp.core.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e63babf38a441f9fd94ee88910be5f5eb173435f GIT binary patch literal 37786 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 emVZY30$-doAlsUYiB!db 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

g+q{{AFf#DFp>|T@THr4GH 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%0DP0pu| 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%0D^+0iDKh;*oSKYUTmifyw)P6 zuq4>Afi@jWnISc5(!A+l;0=yQ)`AZ<)({u0F)W8TV*LreWv|L$jgN zl{*7Svw#*!Vx-DMU~g#*Uzkf7<%CnKOBp?!luiNC8HS7vXh6XMIAf0)xJVjLeDt8Zz!3wE3n5dSNC;ApA%cc1JYr7H_Go&T!O6`-7{YI@1tMhj!Pw!Z z1TyJc5g4M8;S$pQU=(=q!{I|mf~1}4vE$Iug~Qi0BgK@cHa0ZdLru3+RSDMKrtepa zv%Y%#4EJ$Sp3>}jdR~{G=v(KmFjZeoe><7%{J9DT*+}|WJkUKcuR{Kv0Bbd(=pK|^ zJ;+d(xtV0QukG=mprFp173iE~k|d9^<%*#7`Vm0VVR{j{n)E(84$kMR!&&#(alRh7 z2Isw^@Ixn?TR^)F0kopQC%4W{-t8yBGB%W0DV^~H4jZhBBhufB@P_t9kPMzd6d{wq zK^~j~&*nU;gWPY>AvbB^Dif$vt^#o~Fqo#E0m(bhp!eAMA4`z%r2m;6j%&x*H|Vk^)xiuTltnYneW-=<690KnSE3*!NR!Gt03I%UNG@()BNg zK1nS-gJ;0zV`8H+t4qv;xHdp=d;0vHJ9$+Wa*U{}h;%z{reP`9q0@$@UUl|yWoA7}7)gv-?+b7~ zt2Z>?jlUt=oP2mwiGcH50<0BN6}mj1AMS{%#wxo&+7KBHgfJoS;0K4YOdYzaY0BZ} zCe%Vpy$cA@xKTYCtW~4EQfa8220Cad#A4uiJN$2VZR6Zs^Lp9*ES3t+hON|%j#kM<%iv=)kZeyxl~KS9 zWWx2!jqv|(GL>FKd$g9r$bWss5+n)wVKbD-$GcR6ArXeDuJ^pU zkgQo@cDLQ=4&Q?6bQ5qmrj`>P)?6~;X$@F})~i(GkYwPXJr85dgmk$F+7Rm*F7wOD`JcP;(q=RH`g7onVA$+Z5KXDV00!h> z@FN)j1J(LYlg`-xE{Rr0o%=QWe}A^>@$}7G8$aQ!?&-@@UBYG4c3gk6dD}8D+7X)T zy3f(mr}}gfO|jKx-Enlf1^w5#=Kr4u@BC`CoQ@ncGW<6NjzkOgX(}@2=(;Y;n~Bit zG=0Y!F7j;FqwM8smsU#up6}+*;=_Y+Fa-W-Vspu_Y zYf{34(?W+6-Nczy3Wl%ak8hcWm3vqS+#H{W?*H=*eoxTf_ufZG=l%AO97cZfLn^2a z-IgRN+3cqSpZk6-2fLu@dCD%EXlF}(VM6``u<_^yR@WiH^s&4+7u$=k)$l{a)iN** z4A8!dKX0ql%{P6e%cwF*Di;t%&Xt`S%)}t*#<-V@jKpbiK`9n z&POwWci(q8oF;82fNi&ymIu9WpZ$L;&PNY3-t_E1hC!o4f+6yCR4MtMR!wK~_Bp;z zTT`6+7wHP9W!r}2Z(Yr&FAK2vzVDyOh2v%SyefbB#qWeRbaT$$I(7(XbSkyKhGkQY z)OPm#3Ry0ob#0?I4UAReeVSe2>HjRAQ+vb9YjYB{)i7iRj!HZ;hYmr;W0@z_^PY02 z>3okDvC*}_8o}I|oR+P&@2u@>ey83S%@>XA@BW<5a-&9sL(|GTt=L;>wOVZ+6J1v> zbrInPjWI~#F@dz%B+=nm0C}sU{qz$qWcU&#AUDILo2R?XafPvRllUC4;7CndWdaPI;Eex9N;(NOALj zi0{^sc@vOwvDw6k+o?iHB|zsjy;&xC^+7z^1764y->Jb^ z2`HH;fn_q!HE9MF>}Uw0z%sBs_+t0knWF;e2kx|+zI<-Eezo*t?WAlO)%jtc{EFqNA3wdvc-AsK{Jga8G$Hu9}$3IM?l zg9y%(2gkfV=wu?&^^C_yc|$`y9oB4}+j9gc(`O^+!lgZGA;aUWEKD6EU^#Vndzn6- z0sQ&w)?fg{5Y&Ma2MwrK5RoJ{s$^06rvuTcBq9LO8^G1ufF1w< literal 0 HcmV?d00001 diff --git a/tests/Regression/add-ppc64-fallback-unwinder/main.fmf b/tests/Regression/add-ppc64-fallback-unwinder/main.fmf new file mode 100644 index 0000000..844bc0f --- /dev/null +++ b/tests/Regression/add-ppc64-fallback-unwinder/main.fmf @@ -0,0 +1,16 @@ +summary: add-ppc64-fallback-unwinder +description: | + Bug summary: Add ppc64 fallback unwinder to elfutils libdw + Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1454754 +contact: +- Martin Cermak +component: +- elfutils +test: ./runtest.sh +framework: beakerlib +recommend: +- elfutils +- bzip2 +duration: 10m +extra-summary: /tools/elfutils/Regression/add-ppc64-fallback-unwinder +extra-task: /tools/elfutils/Regression/add-ppc64-fallback-unwinder diff --git a/tests/Regression/add-ppc64-fallback-unwinder/output.ref b/tests/Regression/add-ppc64-fallback-unwinder/output.ref new file mode 100644 index 0000000..5f21abd --- /dev/null +++ b/tests/Regression/add-ppc64-fallback-unwinder/output.ref @@ -0,0 +1,17 @@ +PID 23727 - core +TID 23728: +#0 0x00000000100104bc raise +#1 0x0000000010002a1c sigusr2 +#2 0x0000000010002a1c sigusr2 +#3 0x0000000010002b38 stdarg +#4 0x0000000010002bc4 backtracegen +#5 0x0000000010002bf0 start +#6 0x0000000010004c28 start_thread +eu-stack: dwfl_thread_getframes tid 23728 at 0x10004c27 in /root/mjw/elfutils/tests/backtrace.ppc64le.fp.exec: (null) +TID 23727: +#0 0x0000000010006034 pthread_join +#1 0x00000000100025bc main +#2 0x00000000100025bc main +#3 0x00000000100123c4 generic_start_main +#4 0x0000000010012570 __libc_start_main +eu-stack: dwfl_thread_getframes tid 23727 at 0x1001256f in /root/mjw/elfutils/tests/backtrace.ppc64le.fp.exec: No DWARF information found diff --git a/tests/Regression/add-ppc64-fallback-unwinder/runtest.sh b/tests/Regression/add-ppc64-fallback-unwinder/runtest.sh new file mode 100755 index 0000000..dcc6717 --- /dev/null +++ b/tests/Regression/add-ppc64-fallback-unwinder/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/add-ppc64-fallback-unwinder +# Description: add-ppc64-fallback-unwinder +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2017 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 "TEMPD=\$(mktemp -d)" + rlRun "cp backtrace.ppc64le.fp.core.bz2 backtrace.ppc64le.fp.exec.bz2 output.ref $TEMPD" + rlRun "pushd $TEMPD" + rlRun "bunzip2 backtrace.ppc64le.fp.core.bz2" + rlRun "bunzip2 backtrace.ppc64le.fp.exec.bz2" + rlPhaseEnd + + rlPhaseStartTest + rlRun "eu-stack --exec backtrace.ppc64le.fp.exec --core backtrace.ppc64le.fp.core |& tee output.txt" + rlRun "grep '^#' output.ref > output.ref.filtered" + rlRun "grep '^#' output.txt > output.txt.filtered" + rlRun "diff output.txt.filtered output.ref.filtered" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TEMPD" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/api-break-in-libasm-h/Makefile b/tests/Regression/api-break-in-libasm-h/Makefile new file mode 100644 index 0000000..ea40a57 --- /dev/null +++ b/tests/Regression/api-break-in-libasm-h/Makefile @@ -0,0 +1,65 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /tools/elfutils/Regression/api-break-in-libasm-h +# Description: api-break-in-libasm-h +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2020 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/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/tools/elfutils/Regression/api-break-in-libasm-h +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE test.c + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Martin Cermak " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: api-break-in-libasm-h" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 48h" >> $(METADATA) + @echo "RunFor: elfutils" >> $(METADATA) + @echo "Requires: elfutils-devel" >> $(METADATA) + @echo "Requires: gcc" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 1789885" >> $(METADATA) + @echo "Releases: -RHEL4 -RHELClient5 -RHELServer5" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/tests/Regression/api-break-in-libasm-h/PURPOSE b/tests/Regression/api-break-in-libasm-h/PURPOSE new file mode 100644 index 0000000..00cfe40 --- /dev/null +++ b/tests/Regression/api-break-in-libasm-h/PURPOSE @@ -0,0 +1,3 @@ +PURPOSE of /tools/elfutils/Regression/api-break-in-libasm-h +Description: api-break-in-libasm-h +Author: Martin Cermak diff --git a/tests/Regression/api-break-in-libasm-h/main.fmf b/tests/Regression/api-break-in-libasm-h/main.fmf new file mode 100644 index 0000000..057a742 --- /dev/null +++ b/tests/Regression/api-break-in-libasm-h/main.fmf @@ -0,0 +1,14 @@ +summary: api-break-in-libasm-h +description: '' +contact: +- Martin Cermak +component: +- elfutils +test: ./runtest.sh +framework: beakerlib +recommend: +- elfutils-devel +- gcc +duration: 48h +extra-summary: /tools/elfutils/Regression/api-break-in-libasm-h +extra-task: /tools/elfutils/Regression/api-break-in-libasm-h diff --git a/tests/Regression/api-break-in-libasm-h/runtest.sh b/tests/Regression/api-break-in-libasm-h/runtest.sh new file mode 100755 index 0000000..25e19cd --- /dev/null +++ b/tests/Regression/api-break-in-libasm-h/runtest.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/elfutils/Regression/api-break-in-libasm-h +# Description: api-break-in-libasm-h +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2020 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 + rlPhaseStartTest + rlRun "test -f /usr/include/elfutils/libasm.h" + rlRun "gcc -I/usr/include/elfutils -c test.c" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/api-break-in-libasm-h/test.c b/tests/Regression/api-break-in-libasm-h/test.c new file mode 100644 index 0000000..83a8af0 --- /dev/null +++ b/tests/Regression/api-break-in-libasm-h/test.c @@ -0,0 +1,6 @@ +#include +#include +#include + + + diff --git a/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/Makefile b/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/Makefile new file mode 100644 index 0000000..165d96b --- /dev/null +++ b/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/Makefile @@ -0,0 +1,64 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /tools/elfutils/Regression/bz1059897-Support-64-bit-SYM64-symbol-table +# Description: Test for BZ#1059897 (Support 64-bit /SYM64/ symbol table) +# Author: Vaclav Kadlcik +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 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/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/tools/elfutils/Regression/bz1059897-Support-64-bit-SYM64-symbol-table +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE libantlr.a.bz2 + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Vaclav Kadlcik " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: Test for BZ#1059897 (Support 64-bit /SYM64/ symbol table)" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 5m" >> $(METADATA) + @echo "RunFor: elfutils" >> $(METADATA) + @echo "Requires: elfutils" >> $(METADATA) + @echo "Requires: bzip2" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 1059897" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/PURPOSE b/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/PURPOSE new file mode 100644 index 0000000..736226e --- /dev/null +++ b/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/PURPOSE @@ -0,0 +1,12 @@ +PURPOSE of /tools/elfutils/Regression/bz1059897-Support-64-bit-SYM64-symbol-table +Description: Test for BZ#1059897 (Support 64-bit /SYM64/ symbol table) +Author: Vaclav Kadlcik +Bug summary: Support 64-bit /SYM64/ symbol table +Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1059897 + +Verify that a 64-bit symbol table produced on s390x is readable by elfutils +tools. The test is based on Ed Santiago's examples in Bugzilla; a test file +(libantlr.a) is taken from antlr-C++-2.7.7-30.el7.s390x.rpm. Mark Wielaard +mentioned another test included in the upstream; it gets processed within +../../testsuite (which runs the complete upstream testsuite) so its omission +here is intentional. diff --git a/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/libantlr.a.bz2 b/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/libantlr.a.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b839b74808bcb6b0c1c0061b9cc99c42edf47a81 GIT binary patch literal 103524 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 z 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

    fd`56KXYzvBY|4vC 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 literal 0 HcmV?d00001 diff --git a/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/main.fmf b/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/main.fmf new file mode 100644 index 0000000..1f1766e --- /dev/null +++ b/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/main.fmf @@ -0,0 +1,23 @@ +summary: Test for BZ#1059897 (Support 64-bit /SYM64/ symbol table) +description: | + Bug summary: Support 64-bit /SYM64/ symbol table + Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1059897 + + Verify that a 64-bit symbol table produced on s390x is readable by elfutils + tools. The test is based on Ed Santiago's examples in Bugzilla; a test file + (libantlr.a) is taken from antlr-C++-2.7.7-30.el7.s390x.rpm. Mark Wielaard + mentioned another test included in the upstream; it gets processed within + ../../testsuite (which runs the complete upstream testsuite) so its omission + here is intentional. +contact: +- Vaclav Kadlcik +component: +- elfutils +test: ./runtest.sh +framework: beakerlib +recommend: +- elfutils +- bzip2 +duration: 5m +extra-summary: /tools/elfutils/Regression/bz1059897-Support-64-bit-SYM64-symbol-table +extra-task: /tools/elfutils/Regression/bz1059897-Support-64-bit-SYM64-symbol-table diff --git a/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/runtest.sh b/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/runtest.sh new file mode 100755 index 0000000..2b35c4c --- /dev/null +++ b/tests/Regression/bz1059897-Support-64-bit-SYM64-symbol-table/runtest.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/elfutils/Regression/bz1059897-Support-64-bit-SYM64-symbol-table +# Description: Test for BZ#1059897 (Support 64-bit /SYM64/ symbol table) +# Author: Vaclav Kadlcik +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 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" + +TEST_ARCHIVE_1='libantlr.a' # see PURPOSE & Bugzilla + +rlJournalStart + rlPhaseStartSetup + rlAssertRpm $PACKAGE + rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory" + rlRun "cp ${TEST_ARCHIVE_1}.bz2 $TmpDir" 0 "Copying test files" + rlRun "pushd $TmpDir" + rlPhaseEnd + + rlPhaseStartTest + + rlRun "bunzip2 ${TEST_ARCHIVE_1}.bz2" + rlAssertExists "$TEST_ARCHIVE_1" + + rlRun -s "eu-ar t $TEST_ARCHIVE_1" 0 "Checking eu-ar runs" + rlAssertExists "$rlRun_LOG" + rlAssertGrep '^/SYM64/$' "$rlRun_LOG" + rlAssertGrep '^ANTLRUtil\.o$' "$rlRun_LOG" + + rlRun -s "eu-readelf -a $TEST_ARCHIVE_1" 0 "Checking eu-readelf runs" + rlAssertExists "$rlRun_LOG" + rlAssertGrep '^ELF Header:$' "$rlRun_LOG" + + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TmpDir" 0 "Removing tmp directory" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/Makefile b/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/Makefile new file mode 100644 index 0000000..1a21968 --- /dev/null +++ b/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/Makefile @@ -0,0 +1,65 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /tools/elfutils/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore +# Description: Test for BZ#1371517 (eu-stack killed by SIGABRT processing gcore) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2017 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/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/tools/elfutils/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Martin Cermak " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: Test for BZ#1371517 (eu-stack killed by SIGABRT processing gcore)" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 48h" >> $(METADATA) + @echo "RunFor: elfutils" >> $(METADATA) + @echo "Requires: elfutils" >> $(METADATA) + @echo "Requires: gdb" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 1371517" >> $(METADATA) + @echo "Releases: -RHEL4 -RHELClient5 -RHELServer5" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/PURPOSE b/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/PURPOSE new file mode 100644 index 0000000..d82ebd0 --- /dev/null +++ b/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/PURPOSE @@ -0,0 +1,5 @@ +PURPOSE of /tools/elfutils/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore +Description: Test for BZ#1371517 (eu-stack killed by SIGABRT processing gcore) +Author: Martin Cermak +Bug summary: eu-stack killed by SIGABRT processing gcore created core file +Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1371517 diff --git a/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/main.fmf b/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/main.fmf new file mode 100644 index 0000000..639d979 --- /dev/null +++ b/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/main.fmf @@ -0,0 +1,16 @@ +summary: Test for BZ#1371517 (eu-stack killed by SIGABRT processing gcore) +description: | + Bug summary: eu-stack killed by SIGABRT processing gcore created core file + Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1371517 +contact: +- Martin Cermak +component: +- elfutils +test: ./runtest.sh +framework: beakerlib +recommend: +- elfutils +- gdb +duration: 48h +extra-summary: /tools/elfutils/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore +extra-task: /tools/elfutils/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore diff --git a/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/runtest.sh b/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/runtest.sh new file mode 100755 index 0000000..34fbabd --- /dev/null +++ b/tests/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore/runtest.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/elfutils/Regression/bz1371517-eu-stack-killed-by-SIGABRT-processing-gcore +# Description: Test for BZ#1371517 (eu-stack killed by SIGABRT processing gcore) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2017 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 + +rlJournalStart + rlPhaseStartSetup + rlRun "rpm -q elfutils" + rlRun "rpm -q gdb" + rlRun "TMPD=\$(mktemp -d)" + rlRun "pushd $TMPD" + rlPhaseEnd + + rlPhaseStart FAIL "Build an unstripped binary" + # ... so that we don't need to rely on the infra providing us with + # a (coreutils-) debuginfo package. + echo -e "#include \nint main () { sleep(100); return 0; }" | gcc -g -xc -o sleep100 - + rlRun "file sleep100 | fgrep 'not stripped'" + rlPhaseEnd + + rlPhaseStartTest + ./sleep100 & + SLEEP_PID=$! + rlRun "gcore $SLEEP_PID" + # On some arches, such as aarch64, or s390x, eu-stack doesn't end at some + # reasonable point, when printing the trace, and goes across main, to + # __libc_start_main and even higher and then finally complains about + # "no matching address range". But we don't want to be so strict to check + # for this right now. Mark Wielaard says it is okay, so I trust him ... + # Following assert fails when we get SEGV, which would be bz1371517, which + # reproduces e.g. on f25 using elfutils-0.166-2.fc25, or on rhel-7.3 + # using elfutils-0.166-2.el7. + rlRun "eu-stack --executable=./sleep100 --core=core.$SLEEP_PID > output.txt" 0,1 + # Print the output. Yeah, this could be done using tee or something in + # the above line and play games with exitcodes within a pipe chain, but + # this actually is https://en.wikipedia.org/wiki/KISS_principle :) + rlRun "cat output.txt" + # ... we do want to check at least that "main" was listed in the trace. + rlRun "awk {'print \$3'} output.txt | grep ^main$" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPD" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/bz1717349-vaguely-related-SEGV/Makefile b/tests/Regression/bz1717349-vaguely-related-SEGV/Makefile new file mode 100644 index 0000000..1246ea1 --- /dev/null +++ b/tests/Regression/bz1717349-vaguely-related-SEGV/Makefile @@ -0,0 +1,64 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /tools/elfutils/Regression/bz1717349-vaguely-related-SEGV +# Description: bz1717349-vaguely-related-SEGV +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2019 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/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/tools/elfutils/Regression/bz1717349-vaguely-related-SEGV +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE qat_c3xxx.ko + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Martin Cermak " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: bz1717349-vaguely-related-SEGV" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 48h" >> $(METADATA) + @echo "RunFor: elfutils" >> $(METADATA) + @echo "Requires: elfutils" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 1717349" >> $(METADATA) + @echo "Releases: -RHEL4 -RHELClient5 -RHELServer5" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/tests/Regression/bz1717349-vaguely-related-SEGV/PURPOSE b/tests/Regression/bz1717349-vaguely-related-SEGV/PURPOSE new file mode 100644 index 0000000..b1fac9a --- /dev/null +++ b/tests/Regression/bz1717349-vaguely-related-SEGV/PURPOSE @@ -0,0 +1,3 @@ +PURPOSE of /tools/elfutils/Regression/bz1717349-vaguely-related-SEGV +Description: bz1717349-vaguely-related-SEGV +Author: Martin Cermak diff --git a/tests/Regression/bz1717349-vaguely-related-SEGV/main.fmf b/tests/Regression/bz1717349-vaguely-related-SEGV/main.fmf new file mode 100644 index 0000000..52eae32 --- /dev/null +++ b/tests/Regression/bz1717349-vaguely-related-SEGV/main.fmf @@ -0,0 +1,13 @@ +summary: bz1717349-vaguely-related-SEGV +description: '' +contact: +- Martin Cermak +component: +- elfutils +test: ./runtest.sh +framework: beakerlib +recommend: +- elfutils +duration: 48h +extra-summary: /tools/elfutils/Regression/bz1717349-vaguely-related-SEGV +extra-task: /tools/elfutils/Regression/bz1717349-vaguely-related-SEGV diff --git a/tests/Regression/bz1717349-vaguely-related-SEGV/qat_c3xxx.ko b/tests/Regression/bz1717349-vaguely-related-SEGV/qat_c3xxx.ko new file mode 100644 index 0000000000000000000000000000000000000000..c50cd17f0baf85589930aa32891816be4eeb5e81 GIT binary patch literal 18712 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 Zz`q0rmSFr?O{NN8Apf5o2oQLL{{+yg!dn0U literal 0 HcmV?d00001 diff --git a/tests/Regression/bz1717349-vaguely-related-SEGV/runtest.sh b/tests/Regression/bz1717349-vaguely-related-SEGV/runtest.sh new file mode 100755 index 0000000..a0ba81d --- /dev/null +++ b/tests/Regression/bz1717349-vaguely-related-SEGV/runtest.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/elfutils/Regression/bz1717349-vaguely-related-SEGV +# Description: bz1717349-vaguely-related-SEGV +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2019 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 + rlPhaseStartTest + # This works with base rhel eu-strip, as well as with various SCL versions of it. Convenience :) + rlRun "which eu-strip" + rlRun "rpm -qf `which eu-strip`" + # Test: SEGV is considered a FAIL (reproduces with elfutils-0.176-4.el8), whereas fixed version exists with 0) + rlRun "eu-strip --remove-comment --reloc-debug-sections -f qat_c3xxx.ko.debug qat_c3xxx.ko" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/Makefile b/tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/Makefile new file mode 100644 index 0000000..9d3b9ba --- /dev/null +++ b/tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/Makefile @@ -0,0 +1,63 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /tools/elfutils/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted +# Description: Test for BZ#806474 (eu-unstrip unwilling to reassembled corrupted) +# Author: Vaclav Kadlcik +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 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/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/tools/elfutils/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE ld.bz2 ld.debug.bz2 + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Vaclav Kadlcik " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: Test for BZ#806474 (eu-unstrip unwilling to reassembled corrupted)" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 5m" >> $(METADATA) + @echo "RunFor: elfutils" >> $(METADATA) + @echo "Requires: elfutils bzip2" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 806474" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/PURPOSE b/tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/PURPOSE new file mode 100644 index 0000000..163e2ce --- /dev/null +++ b/tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/PURPOSE @@ -0,0 +1,9 @@ +PURPOSE of /tools/elfutils/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted +Description: Test for BZ#806474 (eu-unstrip unwilling to reassembled corrupted) +Author: Vaclav Kadlcik +Bug summary: eu-unstrip unwilling to reassembled corrupted separate debuginfo +Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=806474 + +Make sure eu-unstrip can merge (when forced) a stripped binary and a separate +debuginfo in spite of the debuginfo was produced by a buggy version of binutils +(see BZ#698005). The test is based on Mark Wielaard's suggestion in Bugzilla. diff --git a/tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/ld.bz2 b/tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/ld.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..0a30dfeb14e271da1f61dace10ff6ba11b22a9aa GIT binary patch literal 141187 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 literal 0 HcmV?d00001 diff --git a/tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/ld.debug.bz2 b/tests/Regression/bz806474-eu-unstrip-unwilling-to-reassembled-corrupted/ld.debug.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f18e2336f05cba4f32af87d54b8787787ad4851f GIT binary patch literal 307251 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 z
    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 n%W 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

YT;=*oCQMWSe*DBlFqbPsKL8I6oc%~Y6s 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�`YU_mq{dH6T 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

YT;=*oCQMWSe*DBlFqbPsKL8I6oc%~Y6s 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�`YU_mq{dH6T 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