summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/copy/section.c3
-rw-r--r--src/copy/segments.c18
2 files changed, 8 insertions, 13 deletions
diff --git a/src/copy/section.c b/src/copy/section.c
index e096b2b..6fd08e2 100644
--- a/src/copy/section.c
+++ b/src/copy/section.c
@@ -31,14 +31,13 @@ void elfu_copySection(Elf *eo, Elf_Scn *scn)
shdrOut.sh_name = shdr.sh_name;
shdrOut.sh_type = shdr.sh_type;
shdrOut.sh_flags = shdr.sh_flags;
- /* sh_addr */
shdrOut.sh_addr = shdr.sh_addr;
/* sh_offset */
/* sh_size */
shdrOut.sh_link = shdr.sh_link;
shdrOut.sh_info = shdr.sh_info;
shdrOut.sh_addralign = shdr.sh_addralign;
- //shdrOut.sh_entsize = shdr.sh_entsize;
+ shdrOut.sh_entsize = shdr.sh_entsize;
if (!gelf_update_shdr(scnOut, &shdrOut)) {
fprintf(stderr, "gelf_update_shdr() failed: %s\n", elf_errmsg(-1));
diff --git a/src/copy/segments.c b/src/copy/segments.c
index 0928de6..0f320c1 100644
--- a/src/copy/segments.c
+++ b/src/copy/segments.c
@@ -114,8 +114,9 @@ void elfu_copySegments2(Elf *eo, Elf *ei)
if (phdr.p_type == PT_PHDR) {
/* Skip PHDR entries and fix them up later */
}
- else if (phdr.p_filesz == 0) {
+ else if (phdr.p_memsz == 0) {
phdrOut.p_filesz = 0;
+ phdrOut.p_memsz = 0;
} else {
/* Try to guess the end of the segment */
Elf_Scn *scn, *scnOut;
@@ -144,17 +145,12 @@ void elfu_copySegments2(Elf *eo, Elf *ei)
fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1));
}
- phdrOut.p_filesz = shdrOut.sh_offset - phdrOut.p_offset + shdrOut.sh_size;
- }
+ phdrOut.p_filesz = shdrOut.sh_offset - phdrOut.p_offset;
+ if (shdrOut.sh_type != SHT_NOBITS) {
+ phdrOut.p_filesz += shdrOut.sh_size;
+ }
- if (phdr.p_type == PT_PHDR) {
- /* Skip PHDR entries and fix them up later */
- }
- else if (phdr.p_memsz == 0) {
- phdrOut.p_memsz = 0;
- } else {
- // TODO: Calculate memory size (depends on .bss, etc.)
- phdrOut.p_memsz = phdrOut.p_filesz; // FIXME
+ phdrOut.p_memsz = shdrOut.sh_offset - phdrOut.p_offset + shdrOut.sh_size;
}
if (!gelf_update_phdr (eo, i, &phdrOut)) {