Skip to content

Commit

Permalink
strip: Always copy over any phdrs if there are any.
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
Mark Wielaard committed Nov 6, 2018
1 parent e574889 commit b15ee95
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 28 deletions.
6 changes: 6 additions & 0 deletions src/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2018-10-24 Mark Wielaard <[email protected]>

* 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 <[email protected]>

* unstrip.c (copy_elf): Add ELF_CHECK to make sure gelf_getehdr ()
Expand Down
70 changes: 42 additions & 28 deletions src/strip.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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. */
Expand Down

0 comments on commit b15ee95

Please sign in to comment.