2
0
Эх сурвалжийг харах

Generic.Unix.I386.Glue.Mod is needed by OberonLoader

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7424 8c9fc860-2736-0410-a75d-ab315db34111
eth.guenter 7 жил өмнө
parent
commit
bb64d6f027

+ 0 - 298
source/Generic.Solaris.I386.Glue.Mod

@@ -1,298 +0,0 @@
-(* Minimal ELF header for self contained Solaris x86 Oberon programs *)
-(* Copyright (c) Felix Friedrich, ETH Zürich *)
-
-MODULE Glue; 
-
-IMPORT SYSTEM, Trace;
-
-CONST 
-(*	base* = 08050000H;		for true elf core *)
-	base* = 08070000H;	(*  used by A2Loader,  see 'A2Loader.elf  -h' *)
-	debug* = {};
-VAR
-	last-: RECORD END; (* empty variable linked to end of kernel *)
-	
-	baseAdr*: ADDRESS;
-	endAdr*: ADDRESS;
-	
-	dlsym-	: PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS ): ADDRESS;
-	dlopen-	: PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
-	dlclose-	: PROCEDURE {C} ( handle: ADDRESS );
-
-	stackBottom-	: ADDRESS;	(* of main thread *)
-	
-	argc-: WORD; 
-	argv-: ADDRESS;
-	environ-: ADDRESS;
-
-
-(*? the relocation of "dlsym/dlopen" doesn't work	*)
-(*==================
-	
-	PROCEDURE {INITIAL, NOPAF} EntryPoint;
-	CODE
-		; ELF header
-		DB 07FH, 'ELF', 1, 1, 1, 6, 1, 0, 0, 0
-		DD 0
-		DW 02, 03	; executable, I386
-		DD 01
-		DD entry + base	;program entry point
-		DD elfheadersize
-		DD 0
-		DD 0
-		DW elfheadersize
-		DW 20H
-		DW 3 		;program header table entries
-		DW 0
-		DW 0
-		DW 0
-
-	elfheadersize:
-
-		; interpreter header, must precede any loadable segment!! 
-		DD 3
-		DD interpretername; interpreter name offset
-		DD interpretername + base; interpreter name 
-		DD interpretername + base; interpreter name
-		DD interpretername_end - interpretername ; interpreter name length
-		DD interpretername_end - interpretername ; interpreter name length
-		DD 4H
-		DD 1H
-
-		; program header
-		DD 1
-		DD 0
-		DD base; 
-		DD base; 
-		DD @last - base; segment size (file)
-		DD @last - base; segment size (memory)
-		DD 07
-		DD 1000H; alignment
-		
-		; dynamic header
-		DD 02H
-		DD dynamicsection 
-		DD dynamicsection + base
-		DD dynamicsection + base
-		DD dynamicsection_end - dynamicsection ; size of dynamic section
-		DD dynamicsection_end - dynamicsection ; size of dynamic section
-		DD 06H
-		DD 04H
-
-	dynamicsection: 			; manantory in solaris: 0, 4-11, 17-19
-		DD 04H, hashtable + base								;DT_HASH
-		DD 05H, stringtable + base							;DT_STRTAB
-		DD 06H, symboltable + base							;DT_SYMTAB
-		DD 07H, relocationtable + base						;DT_RELA
-		DD 08H, relocationtable_end - relocationtable	;DT_RELASZ, size of relocationtable
-		DD 09H, 0CH													;DT_RELAENT, size of relocation entry
-		DD 0AH, stringtable_end - stringtable				;DT_STRSZ, size of stringtable
-		DD 0BH, 10H													;DT_SYMENT, size of symboltable entry
-		
-		DD 11H, relocationtable + base						;DT_REL
-		DD 12H, relocationtable_end - relocationtable	;DT_RELSZ
-		DD 13H, 0CH													;DT_RELENT
-		
-		DD 01H, libdl - stringtable						;DT_NEEDED, pos. of libdl
-		DD 01H, libc - stringtable						;DT_NEEDED, pos. of libc
-		DD 0H, 0H 	;sentinel
-	dynamicsection_end:		
-		
-	relocationtable:
-		DD @dlsym
-		DB 01H				;relocation type
-		DB 01H, 00H, 00H	;index of the symbol
-		DD 0H
-		DD @dlopen
-		DB 01H				;relocation type
-		DB 01H, 00H, 00H	;index of the symbol
-		DD 0H
-	relocationtable_end:
-
-	stringtable:
-		DB 0H ; sentinel
-	libdl:
-		DB '/lib/libdl.so.1', 0
-	libc:
-		DB '/lib/libc.so.1', 0
-	dlsymname:
-		DB 'dlsym', 0
-	dlopenname:
-		DB 'dlopen', 0
-	stringtable_end:
-		
-		ALIGN 4
-	hashtable:
-		DD 2		; nbucket
-		DD 2		; nchain
-		DD 1		; bucket[0]
-		DD 2		; bucket[1]
-		DD 1		; chain[0]
-		DD 2		; chain[1]
-		
-	symboltable:
-		DD	0
-		DD	0
-		DD	0
-		DB	0
-		DB	0
-		DW 0
-		
-		;dlsym symbol
-		DD dlsymname - stringtable	; st_name, position of dlsymname
-		DD	0									; st_value
-		DD	0									; st_size
-		DB	12H 								; st_info, global + function
-		DB 0									; st_other
-		DW 0									; st_shndx: default
-
-		;dlopen symbol
-		DD dlopenname - stringtable	; st_name, position of dlopenname
-		DD	0									; st_value
-		DD	0									; st_size
-		DB	12H 								; st_info, global + function
-		DB 0									; st_other
-		DW 0									; st_shndx: default
-
-	interpretername:
-		DB '/lib/ld.so.1', 0
-	interpretername_end:
-
-		ALIGN 4
-
-	entry:
-	END EntryPoint;			======*)
-
-
-	PROCEDURE {INITIAL, NOPAF} EntryPoint;		(* header needed by A2Loader *)
-	CODE
-		DB 'Oberon32G.core', 0, 0
-		DD 0
-		DD 0
-		DD 0
-		DD 0
-		DD base
-		DD @Init0
-		DD @dlopen
-		DD @dlclose
-		DD @dlsym
-		DD @argc
-		DD @argv
-		DD @environ
-	END EntryPoint;		
-	
-	PROCEDURE {NOPAF} putc*( file: ADDRESS; c: CHAR );
-	CODE
-		PUSH ECX
-		MOV EAX, 4
-		MOV EBX, [ESP + 12]
-		LEA ECX, [ESP+8]	
-		MOV EDX, 1
-		INT 80H
-		POP ECX
-		JNE fail
-		MOV EAX, [ESP + 4]
-		RET
-		fail:
-		MOV EAX, -1
-		RET
-	END putc;
-	
- 	PROCEDURE Char ( c: CHAR );
-	BEGIN
-		putc( 1, c )
-	END Char;
-
-
- 	PROCEDURE Dlsym*( handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS );
-	VAR val: ADDRESS;
-	BEGIN
-		val := dlsym( handle, ADDRESSOF( name[0] ) );
-		SYSTEM.PUT32( adr, val );	
-	END Dlsym;
-	
-	
-	PROCEDURE Init;
-	VAR i: LONGINT;
-		libdl: ADDRESS;
-	BEGIN
-		baseAdr := ADDRESSOF( EntryPoint );
-		endAdr := ADDRESSOF( last );
-		
-		Trace.Init;
-		Trace.Char := Char;
-		
-		stackBottom := ADDRESSOF( i ) + 2*SIZEOF( ADDRESS );
-
-	(*	Dlsym( 0, "dlopen" , ADDRESSOF ( dlopen ) );	
-		libdl := dlopen( ADDRESSOF( "/lib/libdl.so.1" ), 2 );
-		Dlsym( libdl, "dlclose", ADDRESSOF ( dlclose ) );  
-		libc := dlopen( ADDRESSOF( "/lib/libc.so.1" ), 2 );	
-		Dlsym( libc, "write", ADDRESSOF ( write ) );
-		Dlsym( libc, "exit", ADDRESSOF ( exit ) );	*)
-	END Init;
-	
-	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;
-	
-	PROCEDURE Initialize*;
-	BEGIN
-		(* nothing, only for compatibility *)
-	END Initialize;
-	
-
-END Glue.
-
-
-
-
- Building the SolarisA2 Generic elf binary:
-
-Compiler.Compile -p=Linux32G
-		Runtime.Mod Trace.Mod 
-		Generic.Solaris.I386.Glue.Mod  Generic.Solaris.I386.Unix.Mod  Generic.Unix.I386.Machine.Mod	
-		Heaps.Mod  Generic.Modules.Mod  Generic.Solaris.Objects.Mod  Unix.Kernel.Mod
-		KernelLog.Mod  Streams.Mod  Pipes.Mod  Commands.Mod  TrapWriters.Mod  Generic.Reflection.Mod	
-		Unix.StdIO.Mod  Generic.Unix.Traps.Mod  UTF8Strings.Mod  Files.Mod  Unix.UnixFiles.Mod
-		RelativeFileSystem.Mod  StringPool.Mod  BitSets.Mod  ObjectFile.Mod  
-		I386.Reals.Mod  Unix.Clock.Mod  Dates.Mod  Strings.Mod  Diagnostics.Mod 
-		GenericLinker.Mod  GenericLoader.Mod  Unix.BootConsole.Mod 
-		
-		ElfBinary.Mod 
-		~
-		
-		
-	(* the correct displacement is shown by  'A2Loader.elf  -h'  *)
-StaticLinker.Link 
-	--fileFormat=Raw --fileName=Solaris32G.core --extension=.GofU --displacement=08070000H
-		Runtime Trace Glue 
-		Unix  Machine  Heaps Modules  Objects  Kernel  KernelLog 
-		Streams  Pipes  Commands  StdIO  TrapWriters  Traps 
-		Files  UnixFiles  Clock  Dates  Reals  Strings  Diagnostics 
-		BitSets  StringPool  GenericLinker  Reflection  GenericLoader
-		BootConsole
-		~
-
- 
- Build 'SolarisA2' by concatenating 'A2Loader.elf' (C) and 'Solaris32G.core' (Oberon).	
- 
- ElfBinary.Build  Solaris32G.core -> SolarisA2 ~

+ 125 - 0
source/Generic.Unix.I386.Glue.Mod

@@ -0,0 +1,125 @@
+
+MODULE Glue; (** AUTHOR "GF"; PURPOSE "Interface to OberonLoader"; *)
+
+IMPORT SYSTEM, Trace;
+
+CONST 
+	debug* = {};
+	
+VAR
+	last-: RECORD END; (* empty variable linked to end of kernel *)
+	
+	baseAdr*: ADDRESS;
+	endAdr*: ADDRESS;
+	
+	dlsym-	: PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS ): ADDRESS;
+	dlopen-	: PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
+	dlclose-	: PROCEDURE {C} ( handle: ADDRESS );
+
+	stackBottom-	: ADDRESS;	(* of main thread *)
+	
+	argc-: WORD; 
+	argv-: ADDRESS;
+	environ-: ADDRESS;
+
+
+	PROCEDURE {INITIAL, NOPAF} Header;		(* header needed by OberonLoader *)
+	CODE
+		DB 'Oberon32G.binary'
+		DD 0
+		DD 0
+		DD 0				; size of statially linked binary	( filled in by static linker )
+		DD 0				; #relocations if base = 0	( filled in by static linker )
+		DD 08070000H 	; base 								( set 0 by static linker )
+		DD @Init0		; Loader <-- Oberon 
+		DD @dlopen		; Loader --> Oberon 
+		DD @dlclose		; Loader --> Oberon 
+		DD @dlsym		; Loader --> Oberon 
+		DD @argc			; Loader --> Oberon 
+		DD @argv			; Loader --> Oberon 
+		DD @environ		; Loader --> Oberon 
+	END Header;		
+	
+	PROCEDURE {NOPAF} putc*( file: ADDRESS; c: CHAR );
+	CODE
+		PUSH ECX
+		MOV EAX, 4
+		MOV EBX, [ESP + 12]
+		LEA ECX, [ESP+8]	
+		MOV EDX, 1
+		INT 80H
+		POP ECX
+		JNE fail
+		MOV EAX, [ESP + 4]
+		RET
+		fail:
+		MOV EAX, -1
+		RET
+	END putc;
+	
+ 	PROCEDURE Char ( c: CHAR );
+	BEGIN
+		putc( 1, c )
+	END Char;
+
+
+ 	PROCEDURE Dlsym*( handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS );
+	VAR val: ADDRESS;
+	BEGIN
+		val := dlsym( handle, ADDRESSOF( name[0] ) );
+		SYSTEM.PUT32( adr, val );	
+	END Dlsym;
+	
+	
+	PROCEDURE {INITIAL, NOPAF} Init0;
+	VAR localvar: LONGINT;
+	BEGIN
+		baseAdr := ADDRESSOF( Header );
+		endAdr := ADDRESSOF( last );
+		
+		Trace.Init;
+		Trace.Char := Char;
+		
+		stackBottom := ADDRESSOF( localvar ) + 2*SIZEOF( ADDRESS );
+	END Init0;
+	
+	PROCEDURE Initialize*;
+	BEGIN
+		(* nothing, only for compatibility *)
+	END Initialize;
+	
+
+END Glue.
+
+
+
+
+ Building the SolarisA2 Generic elf binary:
+
+Compiler.Compile -p=Linux32G
+		Runtime.Mod Trace.Mod 
+		Generic.Solaris.I386.Glue.Mod  Generic.Solaris.I386.Unix.Mod  Generic.Unix.I386.Machine.Mod	
+		Heaps.Mod  Generic.Modules.Mod  Generic.Solaris.Objects.Mod  Unix.Kernel.Mod
+		KernelLog.Mod  Streams.Mod  Pipes.Mod  Commands.Mod  TrapWriters.Mod  Generic.Reflection.Mod	
+		Unix.StdIO.Mod  Generic.Unix.Traps.Mod  UTF8Strings.Mod  Files.Mod  Unix.UnixFiles.Mod
+		RelativeFileSystem.Mod  StringPool.Mod  BitSets.Mod  ObjectFile.Mod  
+		I386.Reals.Mod  Unix.Clock.Mod  Dates.Mod  Strings.Mod  Diagnostics.Mod 
+		GenericLinker.Mod  GenericLoader.Mod  Unix.BootConsole.Mod 
+		
+		UnixBinary.Mod 
+		~
+		
+	
+StaticLinker.Link  -p=Solaris32G
+		Runtime Trace Glue 
+		Unix  Machine  Heaps Modules  Objects  Kernel  KernelLog 
+		Streams  Pipes  Commands  StdIO  TrapWriters  Traps 
+		Files  UnixFiles  Clock  Dates  Reals  Strings  Diagnostics 
+		BitSets  StringPool  GenericLinker  Reflection  GenericLoader
+		BootConsole
+		~
+
+ 
+ Build 'A2Core' by joining OberonLoader (C) and oberon.bin (Oberon).	
+ 
+ UnixBinary.Build  oberon.bin -> A2Core ~