Unix.Glue.Mod 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. (* ETH Oberon, Copyright 2000 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
  2. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
  3. MODULE Glue; (** AUTHOR "G.F."; PURPOSE "Interface to the dynamic linker of Unix" *)
  4. IMPORT S := SYSTEM, Trace;
  5. TYPE
  6. PtrElemDesc* = RECORD a: ANY END; (* used by BootLinker only *)
  7. (* has same type descriptor as element of ARRAY OF POINTER TO ... *)
  8. CONST
  9. AddrSize = SIZEOF( ADDRESS );
  10. VAR
  11. (* the first variable ("AA...") gets initialized by the bootfile loader *)
  12. AAgetadr : ADDRESS; (* address of procedure dlsym *)
  13. dlsym- : PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS; adr: ADDRESS );
  14. dlopen- : PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
  15. dlclose- : PROCEDURE {C} ( handle: ADDRESS );
  16. cout : PROCEDURE {C} ( c: CHAR ); (* output to Unix stdout *)
  17. debug- : SET; (* value of environment variable AOSDEBUG *)
  18. stackBottom- : ADDRESS; (* of main thread *)
  19. PROCEDURE Char ( c: CHAR );
  20. BEGIN
  21. cout( c )
  22. END Char;
  23. PROCEDURE Initialize*;
  24. VAR i: LONGINT;
  25. BEGIN
  26. S.MOVE( ADDRESSOF( AAgetadr ), ADDRESSOF( dlsym ), AddrSize );
  27. dlsym( 0, ADDRESSOF( "dlopen" ), ADDRESSOF( dlopen ) );
  28. dlsym( 0, ADDRESSOF( "dlclose" ), ADDRESSOF( dlclose ) );
  29. dlsym( 0, ADDRESSOF( "debug" ), ADDRESSOF( debug ) );
  30. dlsym( 0, ADDRESSOF( "cout" ), ADDRESSOF( cout ) );
  31. stackBottom := ADDRESSOF( i ) + 2*AddrSize;
  32. Trace.Char := Char;
  33. END Initialize;
  34. END Glue.