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] <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 */