summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2013-07-02 22:34:51 +0200
committerHelge Deller <deller@gmx.de>2013-07-02 22:34:51 +0200
commit2ff3224e763b3e5c178e1ec9bb23a0fef234cd04 (patch)
tree252f912f77bed2407bdbe7d8dffa71f18bf03dbf
parent55d6734622df6a2e790199eb47a013793257e0ec (diff)
downloadpalo-2ff3224e763b3e5c178e1ec9bb23a0fef234cd04.tar.gz
implement woraround for wrong ELF32 header of iplboot.
-rw-r--r--lib/elf32.c1
-rw-r--r--palo/mkbootable.c4
2 files changed, 4 insertions, 1 deletions
diff --git a/lib/elf32.c b/lib/elf32.c
index c41ab4d..6028da8 100644
--- a/lib/elf32.c
+++ b/lib/elf32.c
@@ -74,6 +74,7 @@ int prepare_ELF32_loadable(int fd, struct loadable *loadable, int *wide)
seg->length = __be32_to_cpu(ep.p_filesz);
seg->mem = start;
/* XXX: it seems the zeros count calculation is wrong, e.g. when building iplboot */
+ /* specifically, the ELF32 value of ep.p_memsz seems way too big */
seg->zeros = __be32_to_cpu(ep.p_memsz) - __be32_to_cpu(ep.p_filesz);
}
diff --git a/palo/mkbootable.c b/palo/mkbootable.c
index f5f8158..b1a31d2 100644
--- a/palo/mkbootable.c
+++ b/palo/mkbootable.c
@@ -81,7 +81,9 @@ fix_bootloader(int out, int bootloader)
error(5, loadable.size);
/* load the boot loader into RAM */
- blimage = (void *)calloc(1, MAXBLSIZE);
+ /* WORKAROUND: since the ELF32 value of p_memsz of the iplelf binary
+ * is wrong, just use 5 times more memory here to avoid a segfault. */
+ blimage = (void *)malloc(5*MAXBLSIZE);
assert(blimage != NULL);
if (!load_loadable(blimage, bootloader, &loadable))
error(13);