浏览代码

Module loading works with Linux32G

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6914 8c9fc860-2736-0410-a75d-ab315db34111
felixf 9 年之前
父节点
当前提交
97c2623cc4

+ 4 - 3
source/Generic.Linux.I386.Glue.Mod

@@ -204,7 +204,7 @@ SystemTools.FreeDownTo FoxIntermediateBackend ~
 SystemTools.DoCommands
 SystemTools.DoCommands
 	Compiler.Compile -p=Linux32G
 	Compiler.Compile -p=Linux32G
 		Runtime.Mod Trace.Mod Generic.Linux.I386.Glue.Mod Generic.Linux.I386.Unix.Mod Generic.Unix.I386.Machine.Mod Heaps.Mod  Generic.Modules.Mod 
 		Runtime.Mod Trace.Mod Generic.Linux.I386.Glue.Mod Generic.Linux.I386.Unix.Mod Generic.Unix.I386.Machine.Mod Heaps.Mod  Generic.Modules.Mod 
-		Generic.Unix.Objects.Mod
+		Generic.Unix.Objects.Mod 
 		Unix.Kernel.Mod KernelLog.Mod Plugins.Mod Streams.Mod 
 		Unix.Kernel.Mod KernelLog.Mod Plugins.Mod Streams.Mod 
 		Pipes.Mod Commands.Mod I386.Reals.Mod Generic.Reflection.Mod TrapWriters.Mod CRC.Mod SystemVersion.Mod 
 		Pipes.Mod Commands.Mod I386.Reals.Mod Generic.Reflection.Mod TrapWriters.Mod CRC.Mod SystemVersion.Mod 
 		Unix.StdIO.Mod Generic.Unix.Traps.Mod Locks.Mod Unix.Clock.Mod Disks.Mod Files.Mod Dates.Mod Strings.Mod 
 		Unix.StdIO.Mod Generic.Unix.Traps.Mod Locks.Mod Unix.Clock.Mod Disks.Mod Files.Mod Dates.Mod Strings.Mod 
@@ -214,8 +214,9 @@ SystemTools.DoCommands
 		TestLinux.Mod  ~
 		TestLinux.Mod  ~
 
 
 	StaticLinker.Link --fileFormat=Raw --fileName=simple_elf --extension=.GofU --displacement=08048000H
 	StaticLinker.Link --fileFormat=Raw --fileName=simple_elf --extension=.GofU --displacement=08048000H
-		Runtime Trace Glue Unix Machine Heaps Modules Objects Kernel KernelLog Test 
-Streams Commands StdIO TrapWriters Traps FIles UnixFiles Clock Dates Reals Strings Diagnostics 
+		Runtime Trace Glue Unix Machine Heaps Modules Objects Kernel KernelLog 
+Streams Commands StdIO TrapWriters Traps 
+Files UnixFiles Clock Dates Reals Strings Diagnostics 
 BitSets StringPool ObjectFile GenericLinker Reflection  GenericLoader  BootConsole 
 BitSets StringPool ObjectFile GenericLinker Reflection  GenericLoader  BootConsole 
  ~
  ~
 ~
 ~

+ 48 - 12
source/Generic.Linux.I386.Unix.Mod

@@ -432,9 +432,9 @@ VAR
 	mkdir-		: PROCEDURE {C} ( name: ADDRESS;  mode: SET ): LONGINT;
 	mkdir-		: PROCEDURE {C} ( name: ADDRESS;  mode: SET ): LONGINT;
 	rmdir-			: PROCEDURE {C} ( path: ADDRESS ): LONGINT;
 	rmdir-			: PROCEDURE {C} ( path: ADDRESS ): LONGINT;
 
 
-	stat-			: PROCEDURE {C} ( name: ADDRESS;  VAR buf: Status ): LONGINT;
-	lstat-			: PROCEDURE {C} ( name: ADDRESS;  VAR buf: Status ): LONGINT;
-	fstat-			: PROCEDURE {C} ( fd: LONGINT;  VAR buf: Status ): LONGINT;
+	xstat-			: PROCEDURE {C} ( ver: LONGINT; name: ADDRESS;  VAR buf: Status ): LONGINT;
+	lxstat-			: PROCEDURE {C} ( ver: LONGINT; name: ADDRESS;  VAR buf: Status ): LONGINT;
+	fxstat-			: PROCEDURE {C} ( ver: LONGINT; fd: LONGINT;  VAR buf: Status ): LONGINT;
 
 
 	getpid-		: PROCEDURE {C} ( ): LONGINT;
 	getpid-		: PROCEDURE {C} ( ): LONGINT;
 	getuid-		: PROCEDURE {C} ( ): LONGINT;
 	getuid-		: PROCEDURE {C} ( ): LONGINT;
@@ -470,7 +470,7 @@ VAR
 	kill-			: PROCEDURE {C} ( pid, sig: LONGINT ): LONGINT;
 	kill-			: PROCEDURE {C} ( pid, sig: LONGINT ): LONGINT;
 	exit-			: PROCEDURE {C} ( status: LONGINT );
 	exit-			: PROCEDURE {C} ( status: LONGINT );
 	perror-		: PROCEDURE {C} ( msg: ADDRESS );
 	perror-		: PROCEDURE {C} ( msg: ADDRESS );
-	errno-			: PROCEDURE {C} ( ): LONGINT;
+	errnum			: ADDRESS; (* PROCEDURE {C} ( ): LONGINT;*)
 
 
 
 
 	libc-: LONGINT;
 	libc-: LONGINT;
@@ -798,7 +798,7 @@ VAR
 		IF val = 0 THEN
 		IF val = 0 THEN
 			Trace.String( "Unix.Dlsym:  entry '" );  Trace.String( sym );  Trace.String( "' not found" );
 			Trace.String( "Unix.Dlsym:  entry '" );  Trace.String( sym );  Trace.String( "' not found" );
 			Trace.Ln;
 			Trace.Ln;
-			LOOP END;
+			exit(0);
 		ELSE
 		ELSE
 			Trace.String( "Unix.Dlsym found " );  Trace.String( sym ); 
 			Trace.String( "Unix.Dlsym found " );  Trace.String( sym ); 
 			Trace.Ln
 			Trace.Ln
@@ -933,6 +933,39 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 
 
 	END InstallHandler;
 	END InstallHandler;
 	
 	
+	PROCEDURE fstat*  ( fd: LONGINT;  VAR buf: Status ): LONGINT;
+	VAR res: LONGINT;
+	BEGIN
+		(* 
+						dev-		: DevT;
+				unused1-	: LONGINT;
+				ino-		: LONGINT;
+				mode-	: LONGINT;
+				nlink-		: LONGINT;
+				uid-		: LONGINT;
+				gid-		: LONGINT;
+				rdev-		: DevT;
+				unused2-	: LONGINT;
+				size-		: LONGINT;
+				blksize-	: LONGINT;
+				blocks-	: LONGINT;
+				atime-	: Timeval;
+				mtime-	: Timeval;
+				ctime-	: Timeval;
+				unused-	: ARRAY 2 OF LONGINT;
+		*)
+			TRACE(fd);
+		res := fxstat(3, fd, buf);
+		TRACE(res, buf.ino, buf.rdev, buf.size);
+		RETURN res;
+	END fstat;
+
+	PROCEDURE stat*  ( fd: LONGINT;  VAR buf: Status ): LONGINT;
+	BEGIN
+		RETURN xstat(3, fd, buf);
+	END stat;
+
+	
 	
 	
 	PROCEDURE InitSignalHandler;
 	PROCEDURE InitSignalHandler;
 	VAR i: LONGINT;
 	VAR i: LONGINT;
@@ -942,6 +975,11 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		END;
 		END;
 	END InitSignalHandler;
 	END InitSignalHandler;
 	
 	
+	PROCEDURE errno*(): LONGINT;
+	BEGIN
+		RETURN S.GET32(errnum);
+	END errno;
+	
 	
 	
 	PROCEDURE Init;
 	PROCEDURE Init;
 	VAR test: ADDRESS; 
 	VAR test: ADDRESS; 
@@ -964,6 +1002,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		libc := Dlopen( libcname, 2 );
 		libc := Dlopen( libcname, 2 );
 		libp := Dlopen( libpthreadname, 2); 
 		libp := Dlopen( libpthreadname, 2); 
 		
 		
+		Dlsym( libc, "exit",		ADDRESSOF( exit ) );
 
 
 		Dlsym( libc, "pthread_mutex_init", ADDRESSOF(pthread_mutex_init));
 		Dlsym( libc, "pthread_mutex_init", ADDRESSOF(pthread_mutex_init));
 		Dlsym( libc, "pthread_mutex_destroy", ADDRESSOF(pthread_mutex_destroy));
 		Dlsym( libc, "pthread_mutex_destroy", ADDRESSOF(pthread_mutex_destroy));
@@ -1026,11 +1065,9 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "mkdir",	ADDRESSOF( mkdir ) );
 		Dlsym( libc, "mkdir",	ADDRESSOF( mkdir ) );
 		Dlsym( libc, "rmdir",	ADDRESSOF( rmdir ) );
 		Dlsym( libc, "rmdir",	ADDRESSOF( rmdir ) );
 
 
-		(*
-		Dlsym( libc, "stat",		ADDRESSOF( stat ) );
-		Dlsym( libc, "lstat",	ADDRESSOF( lstat ) );
-		Dlsym( libc, "fstat",	ADDRESSOF( fstat ) );
-		*)
+		Dlsym( libc, "__xstat",		ADDRESSOF( xstat ) );
+		Dlsym( libc, "__lxstat",	ADDRESSOF( lxstat ) );
+		Dlsym( libc, "__fxstat",	ADDRESSOF( fxstat ) );
 
 
 		Dlsym( libc, "getpid",	ADDRESSOF( getpid ) );
 		Dlsym( libc, "getpid",	ADDRESSOF( getpid ) );
 		Dlsym( libc, "getuid",	ADDRESSOF( getuid ) );
 		Dlsym( libc, "getuid",	ADDRESSOF( getuid ) );
@@ -1066,9 +1103,8 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "uname",	ADDRESSOF( uname ) );
 		Dlsym( libc, "uname",	ADDRESSOF( uname ) );
 
 
 		Dlsym( libc, "kill",		ADDRESSOF( kill ) );
 		Dlsym( libc, "kill",		ADDRESSOF( kill ) );
-		Dlsym( libc, "exit",		ADDRESSOF( exit ) );
 		Dlsym( libc, "perror",	ADDRESSOF( perror ) );
 		Dlsym( libc, "perror",	ADDRESSOF( perror ) );
-		Dlsym( libc, "errno",	ADDRESSOF( errno ) );
+		Dlsym( libc, "errno",	ADDRESSOF( errnum ) );
 
 
 		getSysinfo;
 		getSysinfo;
 		
 		

+ 2 - 0
source/Generic.Modules.Mod

@@ -438,6 +438,8 @@ BEGIN
 			i:= 0;
 			i:= 0;
 			REPEAT
 			REPEAT
 				GetFileName(name, extension[i], fileName);
 				GetFileName(name, extension[i], fileName);
+				Trace.String(name); Trace.String(":"); Trace.String(extension[i]); Trace.String(":"); Trace.String(fileName); Trace.Ln;
+				TRACE(name, extension[i], fileName);
 				m := loader[i](name, fileName, res, msg);
 				m := loader[i](name, fileName, res, msg);
 				INC(i);
 				INC(i);
 			UNTIL (m # NIL) OR (i=numLoaders);
 			UNTIL (m # NIL) OR (i=numLoaders);

+ 3 - 0
source/Generic.Unix.I386.Machine.Mod

@@ -534,7 +534,10 @@ END GetTimer;
 				UNTIL ch <= ' '
 				UNTIL ch <= ' '
 			END
 			END
 		END;
 		END;
+		IF name = "ObjectFileExtension" THEN val := ".GofU"
+		ELSE
 		val[0] := 0X
 		val[0] := 0X
+		END;
 	END GetConfig;
 	END GetConfig;
 
 
 
 

+ 3 - 2
source/GenericLoader.Mod

@@ -11,7 +11,7 @@ CONST
 	CommandTrapped* = 3904; (* cf module Commands *) 
 	CommandTrapped* = 3904; (* cf module Commands *) 
 	
 	
 	SupportOldObjectFileFormat = FALSE;
 	SupportOldObjectFileFormat = FALSE;
-	TraceLoading = FALSE;
+	TraceLoading = TRUE;
 TYPE
 TYPE
 
 
 	HashEntryIntInt = RECORD
 	HashEntryIntInt = RECORD
@@ -599,8 +599,9 @@ VAR
 		module: Modules.Module; heapBlockAdr,moduleAdr: LONGINT;
 		module: Modules.Module; heapBlockAdr,moduleAdr: LONGINT;
 		Log: Streams.Writer;
 		Log: Streams.Writer;
 	BEGIN
 	BEGIN
+		TRACE(name, fileName);
 		file := Files.Old(fileName);
 		file := Files.Old(fileName);
-
+		TRACE(file);
 		IF file # NIL THEN
 		IF file # NIL THEN
 			IF TraceLoading THEN Trace.String("loading"); Trace.String(fileName); Trace.Ln END;
 			IF TraceLoading THEN Trace.String("loading"); Trace.String(fileName); Trace.Ln END;
 			res := Ok; msg[0] := 0X;
 			res := Ok; msg[0] := 0X;