This is the mail archive of the
elfutils-devel@sourceware.org
mailing list for the elfutils project.
[PATCH] strip: Only sanity check symbols to not discarded sections for debug file.
- From: Mark Wielaard <mjw at redhat dot com>
- To: elfutils-devel at lists dot fedorahosted dot org
- Date: Mon, 05 Oct 2015 00:12:18 +0200
- Subject: [PATCH] strip: Only sanity check symbols to not discarded sections for debug file.
We can only sanity check the symbols to discarded sections when creating a
debug file. Otherwise we won't keep track of debug_data. This can trigger
erroneously when there are relocation symbols in the symtab for a .debug
section but we are not putting those symbols in a separate .debug file.
Adjust run-strip-test.sh to always run in-place strip size check even
for ET_REL files. Before this fix the sanity check would trigger for
some ET_REL files because they contained such relocation symbols to
.debug sections (but debug_data would be NULL because -f wasn't used).
Signed-off-by: Mark Wielaard <mjw@redhat.com>
---
src/ChangeLog | 5 +++++
src/strip.c | 8 +++++---
tests/run-strip-test.sh | 16 +++++-----------
3 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/src/ChangeLog b/src/ChangeLog
index 411c70b..7bd2a61 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-04 Mark Wielaard <mjw@redhat.com>
+
+ * strip.c (handle_elf): Only sanity check section symbols to not
+ kept discarded sections if we are creating a debug file.
+
2015-10-02 Mark Wielaard <mjw@redhat.com>
* unstrip.c (copy_elided_sections): Use SH_INFO_LINK_P, not just
diff --git a/src/strip.c b/src/strip.c
index 41169ed..6fdb3bf 100644
--- a/src/strip.c
+++ b/src/strip.c
@@ -1379,9 +1379,11 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
shdr_info[cnt].shdr.sh_info = destidx - 1;
}
}
- else if (debug_fname == NULL
- || shdr_info[cnt].debug_data == NULL)
- /* This is a section or group signature symbol
+ else if (debug_fname != NULL
+ && shdr_info[cnt].debug_data == NULL)
+ /* 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. */
{
size_t sidx = (sym->st_shndx != SHN_XINDEX
diff --git a/tests/run-strip-test.sh b/tests/run-strip-test.sh
index 2ebb5a9..43d27e5 100755
--- a/tests/run-strip-test.sh
+++ b/tests/run-strip-test.sh
@@ -50,17 +50,11 @@ 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
+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; }
tempfiles testfile.sections
testrun ${abs_top_builddir}/src/readelf -S testfile.temp > testfile.sections || status=$?
--
2.4.3