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
This commit is contained in:
David Given 2013-05-09 15:54:23 +01:00
parent 99d7f513f2
commit b9b808e01a
5 changed files with 30 additions and 9 deletions

View file

@ -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

View file

@ -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,
}

View file

@ -69,6 +69,6 @@ name cv
from .out
to .exe
program {EM}/bin/aelflod
args 4 1 < >
args -m4 -b < >
outfile linux68k.exe
end

View file

@ -76,6 +76,6 @@ name cv
from .out
to .exe
program {EM}/bin/aelflod
args 20 1 < >
args -m20 -b < >
outfile linuxppc.exe
end

View file

@ -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] <inputfile> <outputfile>\n",
fprintf(stderr, "%s: Syntax: aelflod [-a<number>] [-b] [-h] [-l]\n\t[-m<number>] <inputfile> <outputfile>\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 */