From b9b808e01a02d875d71b01eefa7fc1c1a18b0c84 Mon Sep 17 00:00:00 2001 From: David Given Date: Thu, 9 May 2013 15:54:23 +0100 Subject: [PATCH] Apply George Koehler's aelflod fix for generating non-EM_386 binaries. Adjust platforms to use it. Fix some bugs in the linux386 platform. --HG-- branch : dtrg-experimental-powerpc --- plat/linux386/descr | 4 +++- plat/linux386/pmfile | 2 ++ plat/linux68k/descr | 2 +- plat/linuxppc/descr | 2 +- util/amisc/aelflod.c | 29 +++++++++++++++++++++++------ 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/plat/linux386/descr b/plat/linux386/descr index 6b7b1a0af..9121df924 100644 --- a/plat/linux386/descr +++ b/plat/linux386/descr @@ -59,7 +59,9 @@ name led (.ocm:{TAIL}={PLATFORMDIR}/liboccam.a) \ (.ocm.b.mod.c.p:{TAIL}={PLATFORMDIR}/libc.a) \ {FLOATS?} \ - (.e:{TAIL}={PLATFORMDIR}/libem.a \ + (.e:{TAIL}={PLATFORMDIR}/liblinux.a \ + {PLATFORMDIR}/libem.a \ + {PLATFORMDIR}/liblinux.a \ {PLATFORMDIR}/libsys.a \ {PLATFORMDIR}/libend.a) linker diff --git a/plat/linux386/pmfile b/plat/linux386/pmfile index 24adc42ef..b7ce18123 100644 --- a/plat/linux386/pmfile +++ b/plat/linux386/pmfile @@ -5,6 +5,7 @@ local d = ROOTDIR.."plat/linux386/" include (d.."libsys/pmfile") +include "plat/linux/liblinux/pmfile" local bootsector = ackfile { file (d.."boot.s"), @@ -41,6 +42,7 @@ platform_linux386 = group { -- Build the PC standalone syscall library. + liblinux, libsys_linux386, bootsector, } diff --git a/plat/linux68k/descr b/plat/linux68k/descr index 4758a48c2..43cdb95de 100644 --- a/plat/linux68k/descr +++ b/plat/linux68k/descr @@ -69,6 +69,6 @@ name cv from .out to .exe program {EM}/bin/aelflod - args 4 1 < > + args -m4 -b < > outfile linux68k.exe end diff --git a/plat/linuxppc/descr b/plat/linuxppc/descr index 64f838e61..06005f660 100644 --- a/plat/linuxppc/descr +++ b/plat/linuxppc/descr @@ -76,6 +76,6 @@ name cv from .out to .exe program {EM}/bin/aelflod - args 20 1 < > + args -m20 -b < > outfile linuxppc.exe end diff --git a/util/amisc/aelflod.c b/util/amisc/aelflod.c index 23701048f..d9a2ed6e0 100644 --- a/util/amisc/aelflod.c +++ b/util/amisc/aelflod.c @@ -32,7 +32,8 @@ /* Global settings. */ int bigendian = 0; -int elfmachine; +int elfabi = 3; /* abi = Linux */ +int elfmachine = 3; /* machine = EM_386 */ /* Header and section table of an ack object file. */ @@ -116,7 +117,7 @@ int follows(struct outsect* pa, struct outsect* pb) { /* return 1 if pa follows pb */ - return (pa->os_base == align(pb->os_base+pb->os_size, pa->os_lign)); + return (pa->os_base >= align(pb->os_base+pb->os_size, pa->os_lign)); } /* Writes a byte. */ @@ -276,11 +277,27 @@ int main(int argc, char* argv[]) { switch (argv[1][1]) { + case 'a': + elfabi = atoi(&argv[1][2]); + break; + + case 'b': + bigendian = 1; + break; + case 'h': - fprintf(stderr, "%s: Syntax: aelflod [-h] \n", + fprintf(stderr, "%s: Syntax: aelflod [-a] [-b] [-h] [-l]\n\t[-m] \n", program); exit(0); - + + case 'l': + bigendian = 0; + break; + + case 'm': + elfmachine = atoi(&argv[1][2]); + break; + default: syntaxerror: fatal("syntax error --- try -h for help"); @@ -382,13 +399,13 @@ int main(int argc, char* argv[]) emit8(1); /* class = ELFCLASS32 */ emit8(bigendian ? 2 : 1); /* endianness */ emit8(1); /* ELF version */ - emit8(3); /* ABI = Linux */ + emit8(elfabi); /* ABI */ emit8(0); /* ABI version */ emit8(0); emit16(0); /* padding... */ emit32(0); /* ...to offset 0x10 */ emit16(2); /* type = ET_EXEC */ - emit16(3); /* machine = EM_386 */ + emit16(elfmachine); /* machine */ emit32(1); /* ELF version again */ emit32(outsect[TEXT].os_base); /* entry point */ emit32(ELF_HEADER_SIZE); /* program header offset */ -- 2.34.1