فهرست منبع

Glue now extracts the environment from the initial stack frame.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7053 8c9fc860-2736-0410-a75d-ab315db34111
skoster 8 سال پیش
والد
کامیت
a6df29842b
2فایلهای تغییر یافته به همراه13 افزوده شده و 1 حذف شده
  1. 11 0
      source/Generic.Linux.I386.Glue.Mod
  2. 2 1
      source/Generic.Linux.I386.Unix.Mod

+ 11 - 0
source/Generic.Linux.I386.Glue.Mod

@@ -24,6 +24,7 @@ VAR
 
 	argc-: WORD; 
 	argv-: ADDRESS;
+	environ-: ADDRESS;
 
 	PROCEDURE {INITIAL, NOPAF} EntryPoint;
 	CODE
@@ -191,11 +192,21 @@ VAR
 	
 	PROCEDURE {INITIAL,NOPAF} Init0;
 	BEGIN
+		(*initial stack layout:
+			argc at esp
+			argv at esp+4
+			0 at esp+4+argc*4
+			env at esp+4+argc*4+4      =   (2+argc)<<2 + esp*)
 		CODE{SYSTEM.i386}
 			MOV EAX, [ESP]
 			MOV argc, EAX
 			LEA EAX, [ESP+4]
 			MOV argv, EAX
+			MOV EAX, [ESP]
+			ADD EAX, 2
+			SHL EAX, 2
+			ADD EAX, ESP
+			MOV environ, EAX
 		END;
 		Init;
 	END Init0;

+ 2 - 1
source/Generic.Linux.I386.Unix.Mod

@@ -413,7 +413,7 @@ VAR
 	resume_done: LONGINT;
 	sasuspend, saresume: Sigaction;
 	
-	argc-: LONGINT;  argv-: ADDRESS;
+	argc-: LONGINT;  argv-: ADDRESS;  environ-: ADDRESS;
 
 	sysinfo-: RECORD
 		sysname-, nodename-, release-, version-, machine-: ARRAY 65 OF CHAR;
@@ -1107,6 +1107,7 @@ static void sighandler( int sig, siginfo_t *scp, void *ucp ) {
 	BEGIN		
 		argc := Glue.argc;
 		argv := Glue.argv;
+		environ := Glue.environ;
 
 		libraryPaths[0] := "/lib/i386-linux-gnu";
 		libraryPaths[1] := "/usr/lib/i386-linux-gnu";