- New upstream release. Remove upstreamed patches.
- provide_yama_scope for either fedora >= 22 and rhel >= 7.
This commit is contained in:
Mark Wielaard 2017-08-03 12:14:34 +02:00
parent ba7355de65
commit 01b23e5949
11 changed files with 10 additions and 2271 deletions

1
.gitignore vendored
View File

@ -10,3 +10,4 @@
/elfutils-0.167.tar.bz2
/elfutils-0.168.tar.bz2
/elfutils-0.169.tar.bz2
/elfutils-0.170.tar.bz2

Binary file not shown.

Binary file not shown.

View File

@ -1,98 +0,0 @@
commit e014cbba4e16f717807bca88512d2875a1c17ee4
Author: Mark Wielaard <mark@klomp.org>
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 <mark@klomp.org>
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 <mark@klomp.org>
+
+ * strip.c (handle_elf): Assume e_shstrndx section can be removed.
+
2017-04-20 Ulf Hermann <ulf.hermann@qt.io>
* 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 <mark@klomp.org>
+
+ * run-strip-test.sh: Test strip -g doesn't introduce extra .shstrtab.
+
2017-02-13 Ulf Hermann <ulf.hermann@qt.io>
Mark Wielaard <mark@klomp.org>
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

View File

@ -1,275 +0,0 @@
From 1b2cd3f4dc581eed0fc1ee98f97aa492a19873b0 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mark@klomp.org>
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 <mark@klomp.org>
---
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 <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#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 <http://www.gnu.org/licenses/>.
+
+. $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'; \

View File

@ -1,27 +0,0 @@
commit 1dd301b7c302b9df980946e2d04ca99748754991
Author: Mark Wielaard <mark@klomp.org>
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 <mark@klomp.org>
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 <assert.h>
#if defined(__s390__) && defined(__linux__)
# include <sys/user.h>
-# include <asm/ptrace.h>
# include <sys/ptrace.h>
+# include <asm/ptrace.h>
#endif
#define BACKEND s390_

View File

@ -1,553 +0,0 @@
commit 17bfd57dd13f81b8ed5d1ee5109355bc377cf76c
Author: Mark Wielaard <mark@klomp.org>
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 <mark@klomp.org>
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.<any...>" 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 <drepper@redhat.com>, 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 <elf.h>
#include <stddef.h>
+#include <string.h>
#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.<any...>" 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 <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <libeblP.h>
+
+
+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 <drepper@redhat.com>, 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 <http://www.gnu.org/licenses/>.
+
+. $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'; \

View File

@ -1,235 +0,0 @@
commit b065d4a401e2120c11c92357b213a85e6d70f300
Author: Mark Wielaard <mark@klomp.org>
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 <mark@klomp.org>
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 <mark@klomp.org>
+
+ * 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 <mark@klomp.org>
* 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 <mark@klomp.org>
+
+ * run-strip-nothing.sh: New test.
+ * Makefile.am (TESTS): Add run-strip-nothing.sh.
+ (EXTRA_DIST): Likewise.
+
2017-06-06 Mark Wielaard <mark@klomp.org>
* 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 <http://www.gnu.org/licenses/>.
+
+. $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'; \

File diff suppressed because it is too large Load Diff

View File

@ -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 <mjw@fedoraproject.org> - 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 <releng@fedoraproject.org> - 0.169-8
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild

View File

@ -1 +1 @@
SHA512 (elfutils-0.169.tar.bz2) = 0a81a20bb2aff533d035d6b76f1403437b2e11bce390db57e34b8c26e4b9b3150346d83dddcbfbbdc58063f046ca3223508dba35c6ce88e375d201e7a777a8b9
SHA512 (elfutils-0.170.tar.bz2) = bcfabe5fc500369bff72794bf060bfeef2f1a66a5bd7d2a1642adb7d54f6431bf48f13d0305433590539f3979188ce649d4fe70382f02c3be2ff24bf4c2d571a