]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
strip: Always copy over any phdrs if there are any.
authorMark Wielaard <mark@klomp.org>
Thu, 25 Oct 2018 10:37:04 +0000 (12:37 +0200)
committerMark Wielaard <mark@klomp.org>
Tue, 6 Nov 2018 11:07:48 +0000 (12:07 +0100)
Ignore the type of ELF file, just copy over any phdrs if the original
file contained any. Also refuse to move around any allocated sections
based on whether there are any phdrs instead of on ELF file type.

Signed-off-by: Mark Wielaard <mark@klomp.org>
src/ChangeLog
src/strip.c

index ca1533d36d652a137968ae0130ab6e4b50c8020e..3a893b710b95764e835a96dfacaeeaeaeca12d39 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-24  Mark Wielaard  <mark@klomp.org>
+
+       * strip.c (handle_elf): Always copy over phdrs if there are any
+       and check phnum instead of e_type to determine whether to move
+       allocated sections.
+
 2018-11-02  Mark Wielaard  <mark@klomp.org>
 
        * unstrip.c (copy_elf): Add ELF_CHECK to make sure gelf_getehdr ()
index fdebc5e2942cb17468f237fef2b7ad62a8ad99b3..cb479deb27447684baa28f2a9b9e44591b848379 100644 (file)
@@ -588,49 +588,63 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
   else
     newelf = elf_clone (elf, ELF_C_EMPTY);
 
-  if (unlikely (gelf_newehdr (newelf, gelf_getclass (elf)) == 0)
-      || (ehdr->e_type != ET_REL
-         && unlikely (gelf_newphdr (newelf, phnum) == 0)))
+  if (unlikely (gelf_newehdr (newelf, gelf_getclass (elf)) == 0))
     {
-      error (0, 0, gettext ("cannot create new file '%s': %s"),
+      error (0, 0, gettext ("cannot create new ehdr for file '%s': %s"),
             output_fname ?: fname, elf_errmsg (-1));
       goto fail;
     }
 
   /* Copy over the old program header if needed.  */
-  if (ehdr->e_type != ET_REL)
-    for (cnt = 0; cnt < phnum; ++cnt)
-      {
-       GElf_Phdr phdr_mem;
-       GElf_Phdr *phdr = gelf_getphdr (elf, cnt, &phdr_mem);
-       if (phdr == NULL
-           || unlikely (gelf_update_phdr (newelf, cnt, phdr) == 0))
-         INTERNAL_ERROR (fname);
-      }
+  if (phnum > 0)
+    {
+      if (unlikely (gelf_newphdr (newelf, phnum) == 0))
+       {
+         error (0, 0, gettext ("cannot create new phdr for file '%s': %s"),
+                output_fname ?: fname, elf_errmsg (-1));
+         goto fail;
+       }
+
+      for (cnt = 0; cnt < phnum; ++cnt)
+       {
+         GElf_Phdr phdr_mem;
+         GElf_Phdr *phdr = gelf_getphdr (elf, cnt, &phdr_mem);
+         if (phdr == NULL
+             || unlikely (gelf_update_phdr (newelf, cnt, phdr) == 0))
+           INTERNAL_ERROR (fname);
+       }
+    }
 
   if (debug_fname != NULL)
     {
       /* Also create an ELF descriptor for the debug file */
       debugelf = elf_begin (debug_fd, ELF_C_WRITE_MMAP, NULL);
-      if (unlikely (gelf_newehdr (debugelf, gelf_getclass (elf)) == 0)
-         || (ehdr->e_type != ET_REL
-             && unlikely (gelf_newphdr (debugelf, phnum) == 0)))
+      if (unlikely (gelf_newehdr (debugelf, gelf_getclass (elf)) == 0))
        {
-         error (0, 0, gettext ("cannot create new file '%s': %s"),
+         error (0, 0, gettext ("cannot create new ehdr for file '%s': %s"),
                 debug_fname, elf_errmsg (-1));
          goto fail_close;
        }
 
       /* Copy over the old program header if needed.  */
-      if (ehdr->e_type != ET_REL)
-       for (cnt = 0; cnt < phnum; ++cnt)
-         {
-           GElf_Phdr phdr_mem;
-           GElf_Phdr *phdr = gelf_getphdr (elf, cnt, &phdr_mem);
-           if (phdr == NULL
-               || unlikely (gelf_update_phdr (debugelf, cnt, phdr) == 0))
-             INTERNAL_ERROR (fname);
-         }
+      if (phnum > 0)
+       {
+         if (unlikely (gelf_newphdr (debugelf, phnum) == 0))
+           {
+             error (0, 0, gettext ("cannot create new phdr for file '%s': %s"),
+                    debug_fname, elf_errmsg (-1));
+             goto fail_close;
+           }
+
+         for (cnt = 0; cnt < phnum; ++cnt)
+           {
+             GElf_Phdr phdr_mem;
+             GElf_Phdr *phdr = gelf_getphdr (elf, cnt, &phdr_mem);
+             if (phdr == NULL
+                 || unlikely (gelf_update_phdr (debugelf, cnt, phdr) == 0))
+               INTERNAL_ERROR (fname);
+           }
+       }
     }
 
   /* Number of sections.  */
@@ -738,7 +752,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
         to keep the layout of all allocated sections as similar as
         possible to the original file.  In relocatable object files
         everything can be moved.  */
-      if (ehdr->e_type == ET_REL
+      if (phnum == 0
          || (shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) == 0)
        shdr_info[cnt].shdr.sh_offset = 0;
 
@@ -2328,7 +2342,7 @@ while computing checksum for debug information"));
   /* The ELF library better follows our layout when this is not a
      relocatable object file.  */
   elf_flagelf (newelf, ELF_C_SET,
-              (ehdr->e_type != ET_REL ? ELF_F_LAYOUT : 0)
+              (phnum > 0 ? ELF_F_LAYOUT : 0)
               | (permissive ? ELF_F_PERMISSIVE : 0));
 
   /* Finally write the file.  */