]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
strip: Handle compressed relocation target sections.
authorMark Wielaard <mjw@redhat.com>
Sat, 6 Aug 2016 13:13:19 +0000 (15:13 +0200)
committerMark Wielaard <mjw@redhat.com>
Mon, 15 Aug 2016 07:58:09 +0000 (09:58 +0200)
binutils 2.27 assembler will create compressed sections for x86 ELF
targets. The linker will decompress them again and it doesn't do this
for any other target. This broke one of the run-strip-reloc.sh self tests.

Fix by checking if the target of a relocation section is compressed and
first decompressing it before applying relocations and then compressing
again if necessary.

Add explicit testcases for compressed and uncompressed ET_REL files
to run-strip-reloc.sh.

Signed-off-by: Mark Wielaard <mjw@redhat.com>
src/ChangeLog
src/strip.c
tests/ChangeLog
tests/run-strip-reloc.sh

index e5a3fce384f640de70ebae2350a756be13e83e3a..835888da18f8cc3d39ea91c47db16281d8dcf997 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-06  Mark Wielaard  <mjw@redhat.com>
+
+       * strip.c (handle_elf): Uncompress and recompress relocation target
+       section if necessary.
+
 2016-07-08  Mark Wielaard  <mjw@redhat.com>
 
        * Makefile.am (strip_LDADD): Add libdw.
index 23d3d51bc719ee260aa1d7e96bb524634d1145d0..f56554f7dea48c8854f095589ae1827ffa37152f 100644 (file)
@@ -1,5 +1,5 @@
 /* Discard section not used at runtime from object files.
-   Copyright (C) 2000-2012, 2014, 2015 Red Hat, Inc.
+   Copyright (C) 2000-2012, 2014, 2015, 2016 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -1791,10 +1791,18 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
              Elf_Data *reldata = elf_getdata (scn, NULL);
              if (reldata == NULL || reldata->d_buf == NULL)
                INTERNAL_ERROR (fname);
-             /* We actually wanted the rawdata, but since we already
-                accessed it earlier as elf_getdata () that won't
-                work. But debug sections are all ELF_T_BYTE, so it
-                doesn't really matter.  */
+
+             /* Make sure we adjust the uncompressed debug data
+                (and recompress if necessary at the end).  */
+             GElf_Chdr tchdr;
+             int tcompress_type = 0;
+             if (gelf_getchdr (tscn, &tchdr) != NULL)
+               {
+                 tcompress_type = tchdr.ch_type;
+                 if (elf_compress (tscn, 0, 0) != 1)
+                   INTERNAL_ERROR (fname);
+               }
+
              Elf_Data *tdata = elf_getdata (tscn, NULL);
              if (tdata == NULL || tdata->d_buf == NULL
                  || tdata->d_type != ELF_T_BYTE)
@@ -1976,6 +1984,10 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
              nrels = next;
              shdr->sh_size = reldata->d_size = nrels * shdr->sh_entsize;
              gelf_update_shdr (scn, shdr);
+
+             if (tcompress_type != 0)
+               if (elf_compress (tscn, tcompress_type, 0) != 1)
+                 INTERNAL_ERROR (fname);
            }
        }
     }
index d782ec30049db3040a042fe5a56f1802c4ae0ab5..f21a0b794c6ec85b1e77b4ab095ad3f45cdfe3b7 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-06  Mark Wielaard  <mjw@redhat.com>
+
+       * run-strip-reloc.sh: Add explicit compressed and uncompressed
+       test cases.
+
 2016-08-10  Richard Henderson  <rth@redhat.com>
 
        * file-bpf-dis1.expect.bz2: Fix expected mod and endian operations
index 9fbba29b8f862cdfac679e9e42df5bac1478930b..e587eab3fdc0a3bff21dbd40206bc54084503bb4 100755 (executable)
@@ -108,4 +108,15 @@ runtest hello_m68k.ko 1
 runtest ${abs_top_builddir}/src/strip 0
 runtest ${abs_top_builddir}/src/strip.o 1
 
+# Copy ET_REL file for self-test and make sure to run with/without
+# elf section compression.
+tempfiles strip-uncompressed.o strip-compressed.o
+testrun ${abs_top_builddir}/src/elfcompress -o strip-uncompressed.o -t none \
+  ${abs_top_builddir}/src/strip.o
+testrun ${abs_top_builddir}/src/elfcompress -o strip-compressed.o -t zlib \
+  --force ${abs_top_builddir}/src/strip.o
+
+runtest strip-uncompressed.o 1
+runtest strip-compressed.o 1
+
 exit $status