Browse Source

Module loading works with Linux32G

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6914 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 năm trước cách đây
mục cha
commit
97c2623cc4

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

@@ -204,7 +204,7 @@ SystemTools.FreeDownTo FoxIntermediateBackend ~
 SystemTools.DoCommands
 	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 
-		Generic.Unix.Objects.Mod
+		Generic.Unix.Objects.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 
 		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  ~
 
 	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 
  ~
 ~

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

@@ -432,9 +432,9 @@ VAR
 	mkdir-		: PROCEDURE {C} ( name: ADDRESS;  mode: SET ): 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;
 	getuid-		: PROCEDURE {C} ( ): LONGINT;
@@ -470,7 +470,7 @@ VAR
 	kill-			: PROCEDURE {C} ( pid, sig: LONGINT ): LONGINT;
 	exit-			: PROCEDURE {C} ( status: LONGINT );
 	perror-		: PROCEDURE {C} ( msg: ADDRESS );
-	errno-			: PROCEDURE {C} ( ): LONGINT;
+	errnum			: ADDRESS; (* PROCEDURE {C} ( ): LONGINT;*)
 
 
 	libc-: LONGINT;
@@ -798,7 +798,7 @@ VAR
 		IF val = 0 THEN
 			Trace.String( "Unix.Dlsym:  entry '" );  Trace.String( sym );  Trace.String( "' not found" );
 			Trace.Ln;
-			LOOP END;
+			exit(0);
 		ELSE
 			Trace.String( "Unix.Dlsym found " );  Trace.String( sym ); 
 			Trace.Ln
@@ -933,6 +933,39 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 
 	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;
 	VAR i: LONGINT;
@@ -942,6 +975,11 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		END;
 	END InitSignalHandler;
 	
+	PROCEDURE errno*(): LONGINT;
+	BEGIN
+		RETURN S.GET32(errnum);
+	END errno;
+	
 	
 	PROCEDURE Init;
 	VAR test: ADDRESS; 
@@ -964,6 +1002,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		libc := Dlopen( libcname, 2 );
 		libp := Dlopen( libpthreadname, 2); 
 		
+		Dlsym( libc, "exit",		ADDRESSOF( exit ) );
 
 		Dlsym( libc, "pthread_mutex_init", ADDRESSOF(pthread_mutex_init));
 		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, "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, "getuid",	ADDRESSOF( getuid ) );
@@ -1066,9 +1103,8 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 		Dlsym( libc, "uname",	ADDRESSOF( uname ) );
 
 		Dlsym( libc, "kill",		ADDRESSOF( kill ) );
-		Dlsym( libc, "exit",		ADDRESSOF( exit ) );
 		Dlsym( libc, "perror",	ADDRESSOF( perror ) );
-		Dlsym( libc, "errno",	ADDRESSOF( errno ) );
+		Dlsym( libc, "errno",	ADDRESSOF( errnum ) );
 
 		getSysinfo;
 		

+ 2 - 0
source/Generic.Modules.Mod

@@ -438,6 +438,8 @@ BEGIN
 			i:= 0;
 			REPEAT
 				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);
 				INC(i);
 			UNTIL (m # NIL) OR (i=numLoaders);

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

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

+ 3 - 2
source/GenericLoader.Mod

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