SHA256
3
0
forked from pool/elfutils
elfutils/test.diff

127 lines
4.2 KiB
Diff

---
libelf/elf32_updatenull.c | 35 +++++++++++++++++++++++++++++++----
1 file changed, 31 insertions(+), 4 deletions(-)
Index: b/libelf/elf32_updatenull.c
===================================================================
--- a/libelf/elf32_updatenull.c
+++ b/libelf/elf32_updatenull.c
@@ -55,6 +55,7 @@
#include <assert.h>
#include <endian.h>
#include <libelf.h>
+#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <sys/param.h>
@@ -144,7 +145,7 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf
return -1;
/* At least the ELF header is there. */
- off_t size = elf_typesize (LIBELFBITS, ELF_T_EHDR, 1);
+ off_t size = elf_typesize (LIBELFBITS, ELF_T_EHDR, 1), old_size;
/* Set the program header position. */
if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL
@@ -166,9 +167,12 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf
{
/* The user is supposed to fill out e_phoff. Use it and
e_phnum to determine the maximum extend. */
+ old_size = size;
size = MAX ((size_t) size,
ehdr->e_phoff
+ elf_typesize (LIBELFBITS, ELF_T_PHDR, ehdr->e_phnum));
+ fprintf(stderr, "e_phoff: old=%ld, new=%ld\n", (long) old_size,
+ (long) size);
}
else
{
@@ -176,8 +180,11 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf
elf_typesize (LIBELFBITS, ELF_T_EHDR, 1),
ehdr_flags);
+ old_size = size;
/* We need no alignment here. */
size += elf_typesize (LIBELFBITS, ELF_T_PHDR, ehdr->e_phnum);
+ fprintf(stderr, "e_phnum: old=%ld, new=%ld\n", (long) old_size,
+ (long) size);
}
}
@@ -334,9 +341,13 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf
/* Even the sh_offset is only the "conceptual" possition
in the file. So completely ignore NOBITS sections. */
if (shdr->sh_type != SHT_NOBITS)
- size = MAX ((GElf_Word) size,
- shdr->sh_offset + shdr->sh_size);
-
+ {
+ old_size = size;
+ size = MAX ((GElf_Word) size,
+ shdr->sh_offset + shdr->sh_size);
+ fprintf(stderr, "sh_offset: old=%ld, new=%ld\n",
+ (long) old_size, (long) size);
+ }
/* The alignment must be a power of two. This is a
requirement from the ELF specification. Additionally
we test for the alignment of the section being large
@@ -355,7 +366,11 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf
update_if_changed (shdr->sh_addralign, sh_align,
scn->shdr_flags);
+ old_size = size;
size = (size + sh_align - 1) & ~(sh_align - 1);
+ fprintf(stderr, "sh_align: old=%ld, new=%ld\n",
+ (long) old_size, (long) size);
+
int offset_changed = 0;
update_if_changed (shdr->sh_offset, (GElf_Word) size,
offset_changed);
@@ -373,8 +388,11 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf
update_if_changed (shdr->sh_size, (GElf_Word) offset,
changed);
+ old_size = size;
if (shdr->sh_type != SHT_NOBITS)
size += offset;
+ fprintf(stderr, "sh_size: old=%ld, new=%ld\n",
+ (long) old_size, (long) size);
scn->flags |= changed;
}
@@ -401,9 +419,12 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf
{
/* The user is supposed to fill out e_phoff. Use it and
e_phnum to determine the maximum extend. */
+ old_size = size;
size = MAX ((GElf_Word) size,
(ehdr->e_shoff
+ (elf_typesize (LIBELFBITS, ELF_T_SHDR, shnum))));
+ fprintf(stderr, "e_shoff: old=%ld, new=%ld\n", (long) old_size,
+ (long) size);
}
else
{
@@ -413,7 +434,10 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf
want to be surprised by architectures with less strict
alignment rules. */
#define SHDR_ALIGN sizeof (ElfW2(LIBELFBITS,Off))
+ old_size = size;
size = (size + SHDR_ALIGN - 1) & ~(SHDR_ALIGN - 1);
+ fprintf(stderr, "e_shoff(align): old=%ld, new=%ld\n",
+ (long) old_size, (long) size);
update_if_changed (ehdr->e_shoff, (GElf_Word) size, elf->flags);
update_if_changed (ehdr->e_shentsize,
@@ -421,7 +445,10 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf
ehdr_flags);
/* Account for the section header size. */
+ old_size = size;
size += elf_typesize (LIBELFBITS, ELF_T_SHDR, shnum);
+ fprintf(stderr, "shnum: old=%ld, new=%ld\n", (long) old_size,
+ (long) size);
}
}