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));
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;
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)) {