1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- (* ETH Oberon, Copyright 2000 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
- Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
- MODULE Glue; (** AUTHOR "G.F."; PURPOSE "Interface to the dynamic linker of Unix" *)
- IMPORT S := SYSTEM, Trace;
- TYPE
- PtrElemDesc* = RECORD a: ANY END; (* used by BootLinker only *)
- (* has same type descriptor as element of ARRAY OF POINTER TO ... *)
- CONST
- AddrSize = SIZEOF( ADDRESS );
- VAR
- (* the first variable ("AA...") gets initialized by the bootfile loader *)
- AAgetadr : ADDRESS; (* address of procedure dlsym *)
- dlsym- : PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS; adr: ADDRESS );
- dlopen- : PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
- dlclose- : PROCEDURE {C} ( handle: ADDRESS );
- cout : PROCEDURE {C} ( c: CHAR ); (* output to Unix stdout *)
- debug- : SET; (* value of environment variable AOSDEBUG *)
- stackBottom- : ADDRESS; (* of main thread *)
- PROCEDURE Char ( c: CHAR );
- BEGIN
- cout( c )
- END Char;
- PROCEDURE Initialize*;
- VAR i: LONGINT;
- BEGIN
- S.MOVE( ADDRESSOF( AAgetadr ), ADDRESSOF( dlsym ), AddrSize );
-
- dlsym( 0, ADDRESSOF( "dlopen" ), ADDRESSOF( dlopen ) );
- dlsym( 0, ADDRESSOF( "dlclose" ), ADDRESSOF( dlclose ) );
-
- dlsym( 0, ADDRESSOF( "debug" ), ADDRESSOF( debug ) );
- dlsym( 0, ADDRESSOF( "cout" ), ADDRESSOF( cout ) );
-
- stackBottom := ADDRESSOF( i ) + 2*AddrSize;
-
- Trace.Char := Char;
- END Initialize;
- END Glue.
|