Bladeren bron

improved elf header (implying some adaptions in assembler)
removed TRMTools from compiler tool (unusable for Linux)


git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6502 8c9fc860-2736-0410-a75d-ab315db34111

felixf 9 jaren geleden
bovenliggende
commit
9a2c020abd
3 gewijzigde bestanden met toevoegingen van 29 en 15 verwijderingen
  1. BIN
      source/Fox.Tool
  2. 2 2
      source/FoxAMD64Assembler.Mod
  3. 27 13
      source/Linux.I386.ElfHeader.Mod

BIN
source/Fox.Tool


+ 2 - 2
source/FoxAMD64Assembler.Mod

@@ -1195,7 +1195,7 @@ TYPE
 						INC (i);
 					END;
 					NextChar
-				UNTIL ~((('A' <= CAP(char)) & (CAP(char) <= 'Z')) OR (('0' <= char) & (char <= '9')));
+				UNTIL ~( ('A' <= CAP(char)) & (CAP(char) <= 'Z') OR ('0' <= char) & (char <= '9') OR (char = '_') );
 				ident[i] := 0X; idents[i] := 0X;
 			END GetIdentifier;
 
@@ -1218,7 +1218,7 @@ TYPE
 				errPos := position- 1;
 
 				CASE char OF
-				'A' .. 'Z', 'a' .. 'z' :
+				'A' .. 'Z', 'a' .. 'z', '_' :
 					GetIdentifier;
 					SkipBlanks;
 					IF char = ':' THEN

+ 27 - 13
source/Linux.I386.ElfHeader.Mod

@@ -6,12 +6,14 @@ MODULE ElfHeader;
 
 IMPORT SYSTEM, Trace;
 
+
 VAR
-	empty-: RECORD END; (* empty variable linked to end of kernel *)
+	last-: RECORD END; (* empty variable linked to end of kernel *)
 
 	dlsym-	: PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS): ADDRESS;
 	dlopen-	: PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
 	dlclose-	: PROCEDURE {C} ( handle: ADDRESS );
+	exit-		: PROCEDURE {C} (status: LONGINT);
 
 	PROCEDURE {INITIAL, NOPAF} EntryPoint;
 	CONST base = 08048000H;
@@ -39,8 +41,8 @@ VAR
 		DD 0
 		DD base; 
 		DD base; 
-		DD @empty - base; segment size (file)
-		DD @empty - base; segment size (memory)
+		DD @last - base; segment size (file)
+		DD @last - base; segment size (memory)
 		DD 07
 		DD 1000H; alignment
 		
@@ -49,8 +51,8 @@ VAR
 		DD interpretername; interpreter name offset
 		DD interpretername + base; interpreter name 
 		DD interpretername + base; interpreter name
-		DD 13H ; interpreter name length
-		DD 13H ; interpreter name length
+		DD interpretername_end - interpretername ; interpreter name length
+		DD interpretername_end - interpretername ; interpreter name length
 		DD 4H
 		DD 1H
 
@@ -59,8 +61,8 @@ VAR
 		DD dynamicsection 
 		DD dynamicsection + base
 		DD dynamicsection + base
-		DD 40H ; size of dynamic section
-		DD 40H ; size of dynamic section
+		DD dynamicsection_end - dynamicsection ; size of dynamic section
+		DD dynamicsection_end - dynamicsection ; size of dynamic section
 		DD 06H
 		DD 04H
 
@@ -68,19 +70,21 @@ VAR
 		DD 05H, base + stringtable
 		DD 06H, symboltablebegin + base
 		DD 07H, dlsymrelocation + base
-		DD 08H, stringtable-dlsymrelocation ; size (relocationtable)
+		DD 08H, dlsymrelocation_end-dlsymrelocation ; size (relocationtable)
 		DD 09H, 0CH
-		DD 0AH, endstringtable - stringtable; size (stringtable)
+		DD 0AH, stringtable_end - stringtable; size (stringtable)
 		DD 0BH, 10H
 		
 		DD 01H, libname - stringtable; position of libname
 		DD 0H, 0H ; sentinel
-
+		dynamicsection_end:		
+		
 	 	dlsymrelocation:
 		DD @dlsym
 		DB 01H
 		DB 01H, 00H, 00H; index of the symbol
 		DD 0H
+		dlsymrelocation_end:
 
 		stringtable:
 		DB 0H ; sentinel
@@ -91,7 +95,8 @@ VAR
 		dlsymname:
 		DB 'dlsym', 0
 		
-		endstringtable:
+		
+		stringtable_end:
 		
 		ALIGN 4
 		symboltablebegin:
@@ -106,12 +111,13 @@ VAR
 		DD dlsymname - stringtable; position of dlsymname
 		DD	0
 		DD	0
-		DB	12H
+		DB	12H ; info: global + function
 		DB 0
 		DW	0
 
 		interpretername:
 		DB '/lib/ld-linux.so.2', 0
+		interpretername_end:
 
 		ALIGN 4
 
@@ -151,15 +157,23 @@ VAR
 	PROCEDURE Init;
 	BEGIN
 		Trace.Char := Char;
+		ASSERT(dlsym # NIL);
 		Dlsym(0,"dlopen", ADDRESS OF dlopen);
 		ASSERT(dlopen # NIL); 
 		Dlsym( 0, "dlclose", ADDRESS OF dlclose);
 		ASSERT(dlclose # NIL); 
+		Dlsym(0,"exit", ADDRESS OF exit);
+		ASSERT(exit # NIL);
 	END Init;
+	
+	PROCEDURE {FINAL} ExitPoint;
+	BEGIN
+		exit(0);
+	END ExitPoint;
 
 BEGIN
 	Init;
-	Trace.String("ElfHeader loaded");
+	Trace.String("ElfHeader loaded"); Trace.Ln;
 END ElfHeader.
 
 SystemTools.DoCommands