[PATCH 1/4] strip: Always copy over any phdrs if there are any.

Mark Wielaard mark@klomp.org
Fri Oct 26 21:51:00 GMT 2018


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 |  6 +++++
 src/strip.c   | 70 +++++++++++++++++++++++++++++++++++------------------------
 2 files changed, 48 insertions(+), 28 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 602312e..5a57e8f 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -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-10-16  Mark Wielaard  <mark@klomp.org>
 
 	* readelf.c (print_debug_frame_section): Make sure readp is never
diff --git a/src/strip.c b/src/strip.c
index fdebc5e..cb479de 100644
--- a/src/strip.c
+++ b/src/strip.c
@@ -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.  */
-- 
1.8.3.1



More information about the Elfutils-devel mailing list