Unix.Glue.Mod 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. #IF I386 THEN
  20. DB 'Oberon32G.binary' ; ID (24 byte)
  21. DD 0
  22. DD 0
  23. DD 0 ; size of statially linked binary ( filled in by static linker )
  24. DD 0 ; # relocations ( filled in by static linker )
  25. DD @Init0 ; Loader <-- Oberon (entrypoint)
  26. DD @dlopen ; Loader --> Oberon
  27. DD @dlclose ; Loader --> Oberon
  28. DD @dlsym ; Loader --> Oberon
  29. DD @argc ; Loader --> Oberon
  30. DD @argv ; Loader --> Oberon
  31. DD @environ ; Loader --> Oberon
  32. DD @cout ; Loader --> Oberon
  33. #ELSIF AMD64 THEN
  34. DB 'Oberon64G.binary' ; ID (24 byte)
  35. DD 0
  36. DD 0
  37. DD 0 ; size of statially linked binary ( filled in by static linker )
  38. DD 0 ; # relocations ( filled in by static linker )
  39. DQ @Init0 ; Loader <-- Oberon (entrypoint)
  40. DQ @dlopen ; Loader --> Oberon
  41. DQ @dlclose ; Loader --> Oberon
  42. DQ @dlsym ; Loader --> Oberon
  43. DQ @argc ; Loader --> Oberon
  44. DQ @argv ; Loader --> Oberon
  45. DQ @environ ; Loader --> Oberon
  46. DQ @cout ; Loader --> Oberon
  47. #ELSE
  48. unimplemented
  49. #END
  50. END Header;
  51. PROCEDURE Char ( c: CHAR );
  52. BEGIN
  53. cout( c )
  54. END Char;
  55. PROCEDURE Dlsym*( handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS );
  56. VAR val: ADDRESS;
  57. BEGIN
  58. val := dlsym( handle, ADDRESSOF( name[0] ) );
  59. SYSTEM.PUT( adr, val );
  60. END Dlsym;
  61. PROCEDURE {INITIAL, NOPAF} Init0;
  62. VAR localvar: ADDRESS;
  63. CONST CR = 0DX; NL = 0AX;
  64. BEGIN
  65. baseAdr := ADDRESSOF( Header );
  66. endAdr := ADDRESSOF( last );
  67. Trace.Init;
  68. Trace.Char := Char;
  69. stackBottom := ADDRESSOF( localvar ) + 2*SIZEOF( ADDRESS );
  70. END Init0;
  71. END Glue.
  72. Building the SolarisA2 Generic elf binary:
  73. Compiler.Compile -p=Linux32
  74. I386.Builtins.Mod Trace.Mod
  75. Unix.Glue.Mod Solaris.I386.Unix.Mod Unix.I386.Machine.Mod
  76. Heaps.Mod Modules.Mod Solaris.Objects.Mod Unix.Kernel.Mod
  77. KernelLog.Mod Streams.Mod Pipes.Mod Commands.Mod TrapWriters.Mod Reflection.Mod
  78. Unix.StdIO.Mod Unix.Traps.Mod UTF8Strings.Mod Files.Mod Unix.UnixFiles.Mod
  79. RelativeFileSystem.Mod StringPool.Mod BitSets.Mod ObjectFile.Mod
  80. I386.Reals.Mod Unix.Clock.Mod Dates.Mod Strings.Mod Diagnostics.Mod
  81. GenericLinker.Mod Loader.Mod Unix.BootConsole.Mod
  82. UnixBinary.Mod
  83. ~
  84. Linker.Link -p=Solaris32
  85. Builtins Trace Glue
  86. Unix Machine Heaps Modules Objects Kernel KernelLog
  87. Streams Pipes Commands StdIO TrapWriters Traps
  88. Files UnixFiles Clock Dates Reals Strings Diagnostics
  89. BitSets StringPool GenericLinker Reflection Loader
  90. BootConsole
  91. ~
  92. Build 'A2Core' by joining OberonLoader (C) and oberon.bin (Oberon).
  93. UnixBinary.Build oberon.bin -> A2Core ~