Unix.AMD64.Glue.Mod 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. MODULE Glue; (** AUTHOR "GF"; PURPOSE "Interface to OberonLoader"; *)
  2. IMPORT SYSTEM, Trace;
  3. CONST
  4. debug* = {};
  5. VAR
  6. last-: RECORD END; (* empty variable linked to end of kernel *)
  7. baseAdr*: ADDRESS;
  8. endAdr*: ADDRESS;
  9. dlsym- : PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS ): ADDRESS;
  10. dlopen- : PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
  11. dlclose- : PROCEDURE {C} ( handle: ADDRESS );
  12. cout : PROCEDURE {C} ( ch: CHAR ); (* console output *)
  13. stackBottom- : ADDRESS; (* of main thread *)
  14. argc-: WORD;
  15. argv-: ADDRESS;
  16. environ-: ADDRESS;
  17. PROCEDURE {INITIAL, NOPAF} Header; (* header needed by OberonLoader *)
  18. CODE
  19. DB 'Oberon64G.binary' ; ID (24 byte)
  20. DD 0
  21. DD 0
  22. DD 0 ; size of statially linked binary ( filled in by static linker )
  23. DD 0 ; # relocations ( filled in by static linker )
  24. DQ @Init0 ; Loader <-- Oberon (entrypoint)
  25. DQ @dlopen ; Loader --> Oberon
  26. DQ @dlclose ; Loader --> Oberon
  27. DQ @dlsym ; Loader --> Oberon
  28. DQ @argc ; Loader --> Oberon
  29. DQ @argv ; Loader --> Oberon
  30. DQ @environ ; Loader --> Oberon
  31. DQ @cout ; Loader --> Oberon
  32. END Header;
  33. PROCEDURE Char ( c: CHAR );
  34. BEGIN
  35. cout( c )
  36. END Char;
  37. PROCEDURE Dlsym*( handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS );
  38. VAR val: ADDRESS;
  39. BEGIN
  40. val := dlsym( handle, ADDRESSOF( name[0] ) );
  41. SYSTEM.PUT64( adr, val );
  42. END Dlsym;
  43. PROCEDURE {INITIAL, NOPAF} Init0;
  44. VAR localvar: ADDRESS;
  45. CONST CR = 0DX; NL = 0AX;
  46. BEGIN
  47. baseAdr := ADDRESSOF( Header );
  48. endAdr := ADDRESSOF( last );
  49. Trace.Init;
  50. Trace.Char := Char;
  51. stackBottom := ADDRESSOF( localvar ) + 2*SIZEOF( ADDRESS );
  52. END Init0;
  53. END Glue.
  54. Building the SolarisA2 Generic elf binary:
  55. Compiler.Compile -p=Linux64
  56. I386.Builtins.Mod Trace.Mod
  57. Unix.I386.Glue.Mod Solaris.I386.Unix.Mod Unix.I386.Machine.Mod
  58. Heaps.Mod Modules.Mod Solaris.Objects.Mod Unix.Kernel.Mod
  59. KernelLog.Mod Streams.Mod Pipes.Mod Commands.Mod TrapWriters.Mod Reflection.Mod
  60. Unix.StdIO.Mod Unix.Traps.Mod UTF8Strings.Mod Files.Mod Unix.UnixFiles.Mod
  61. RelativeFileSystem.Mod StringPool.Mod BitSets.Mod ObjectFile.Mod
  62. I386.Reals.Mod Unix.Clock.Mod Dates.Mod Strings.Mod Diagnostics.Mod
  63. GenericLinker.Mod Loader.Mod Unix.BootConsole.Mod
  64. UnixBinary.Mod
  65. ~
  66. Linker.Link -p=Solaris64
  67. Builtins Trace Glue
  68. Unix Machine Heaps Modules Objects Kernel KernelLog
  69. Streams Pipes Commands StdIO TrapWriters Traps
  70. Files UnixFiles Clock Dates Reals Strings Diagnostics
  71. BitSets StringPool GenericLinker Reflection Loader
  72. BootConsole
  73. ~
  74. Build 'A2Core' by joining OberonLoader (C) and oberon.bin (Oberon).
  75. UnixBinary.Build oberon.bin -> A2Core ~