diff options
author | Mark Wielaard <[email protected]> | 2015-10-04 23:47:47 +0200 |
---|---|---|
committer | Mark Wielaard <[email protected]> | 2015-10-09 11:22:00 +0200 |
commit | 3a45dbbe7e1862e72bc886fa7f12a5c5c09311e0 (patch) | |
tree | b83ebacc89bfeedb8402e4efcdd71a3a91590bf9 | |
parent | 86ed7f7f53179d7a893329e6b9851dbb75aba405 (diff) |
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 <[email protected]>
-rw-r--r-- | src/ChangeLog | 5 | ||||
-rw-r--r-- | src/strip.c | 8 | ||||
-rwxr-xr-x | tests/run-strip-test.sh | 16 |
3 files changed, 15 insertions, 14 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index f5778856..5e69d3a4 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2015-10-04 Mark Wielaard <[email protected]> + + * 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 <[email protected]> * unstrip.c (MAX): Removed. diff --git a/src/strip.c b/src/strip.c index 41169eda..6fdb3bf9 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 2ebb5a91..43d27e53 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=$? |