Browse Source

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

David Given 11 years ago
parent
commit
b9b808e01a
5 changed files with 30 additions and 9 deletions
  1. 3 1
      plat/linux386/descr
  2. 2 0
      plat/linux386/pmfile
  3. 1 1
      plat/linux68k/descr
  4. 1 1
      plat/linuxppc/descr
  5. 23 6
      util/amisc/aelflod.c

+ 3 - 1
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

+ 2 - 0
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,
 }

+ 1 - 1
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

+ 1 - 1
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

+ 23 - 6
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 */