From 630aa5494c36a0a13bd7a08397d0d29468854cb9 Mon Sep 17 00:00:00 2001 From: norly Date: Fri, 1 Feb 2013 15:50:37 +0000 Subject: [PATCH] Fix stupid copy --- src/copy/section.c | 3 +-- src/copy/segments.c | 18 +++++++----------- 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)) { -- 2.30.2