From: Mark Wielaard Date: Sun, 4 Oct 2015 21:47:47 +0000 (+0200) Subject: strip: Only sanity check symbols to not discarded sections for debug file. X-Git-Tag: elfutils-0.164~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3a45dbbe7e1862e72bc886fa7f12a5c5c09311e0;p=thirdparty%2Felfutils.git 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 --- diff --git a/src/ChangeLog b/src/ChangeLog index f57788563..5e69d3a4e 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2015-10-04 Mark Wielaard + + * strip.c (handle_elf): Only sanity check section symbols to not + kept discarded sections if we are creating a debug file. + 2015-10-07 Mark Wielaard * unstrip.c (MAX): Removed. diff --git a/src/strip.c b/src/strip.c index 41169eda8..6fdb3bf9a 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 2ebb5a91a..43d27e533 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=$?