]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
strip: Make sure old .shstrab is removed when eu-strip recreates it.
authorMark Wielaard <mark@klomp.org>
Wed, 7 Jun 2017 12:05:36 +0000 (14:05 +0200)
committerMark Wielaard <mark@klomp.org>
Wed, 14 Jun 2017 12:51:33 +0000 (14:51 +0200)
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>
src/ChangeLog
src/strip.c
tests/ChangeLog
tests/run-strip-test.sh

index cbb77fc874ccab9277d93edbc8f44dbdbea26483..6ac0ef2d8aa5da11b4e5188c3ebb16c0ce2fa47b 100644 (file)
@@ -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.
index f7474418a045ff6d292b6b1cf3e2fd2a2ed1c08e..11b2a379b8fa7d539a6cb3c0ccf9339bae76c72a 100644 (file)
@@ -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.  */
index 43b5bd8a8b519bcd7fae0058048bf3cade3c5dbc..a7b202244a4a3605ff17e964e68ed1ef775394ab 100644 (file)
@@ -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-05-30  Mark Wielaard  <mark@klomp.org>
 
        * run-backtrace-fp-core-ppc64le.sh: New test.
index 42aa9888c5f6d20dd28d088f25da0750ad81395d..280814e6debfffab0ce9dcfb392fdf277dd47dd8 100755 (executable)
@@ -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