Generic.Unix.I386.Glue.Mod 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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 'Oberon32G.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 if base = 0 ( filled in by static linker )
  24. DD 08070000H ; base ( set 0 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. END Header;
  34. PROCEDURE Char ( c: CHAR );
  35. BEGIN
  36. cout( c )
  37. END Char;
  38. PROCEDURE Dlsym*( handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS );
  39. VAR val: ADDRESS;
  40. BEGIN
  41. val := dlsym( handle, ADDRESSOF( name[0] ) );
  42. SYSTEM.PUT32( adr, val );
  43. END Dlsym;
  44. PROCEDURE {INITIAL, NOPAF} Init0;
  45. VAR localvar: LONGINT;
  46. CONST CR = 0DX; NL = 0AX;
  47. BEGIN
  48. baseAdr := ADDRESSOF( Header );
  49. endAdr := ADDRESSOF( last );
  50. Trace.Init;
  51. Trace.Char := Char;
  52. stackBottom := ADDRESSOF( localvar ) + 2*SIZEOF( ADDRESS );
  53. END Init0;
  54. PROCEDURE Initialize*;
  55. BEGIN
  56. (* nothing, only for compatibility *)
  57. END Initialize;
  58. END Glue.
  59. Building the SolarisA2 Generic elf binary:
  60. Compiler.Compile -p=Linux32G
  61. Runtime.Mod Trace.Mod
  62. Generic.Unix.I386.Glue.Mod Generic.Solaris.I386.Unix.Mod Generic.Unix.I386.Machine.Mod
  63. Heaps.Mod Generic.Modules.Mod Generic.Solaris.Objects.Mod Unix.Kernel.Mod
  64. KernelLog.Mod Streams.Mod Pipes.Mod Commands.Mod TrapWriters.Mod Generic.Reflection.Mod
  65. Unix.StdIO.Mod Generic.Unix.Traps.Mod UTF8Strings.Mod Files.Mod Unix.UnixFiles.Mod
  66. RelativeFileSystem.Mod StringPool.Mod BitSets.Mod ObjectFile.Mod
  67. I386.Reals.Mod Unix.Clock.Mod Dates.Mod Strings.Mod Diagnostics.Mod
  68. GenericLinker.Mod GenericLoader.Mod Unix.BootConsole.Mod
  69. UnixBinary.Mod
  70. ~
  71. StaticLinker.Link -p=Solaris32G
  72. Runtime Trace Glue
  73. Unix Machine Heaps Modules Objects Kernel KernelLog
  74. Streams Pipes Commands StdIO TrapWriters Traps
  75. Files UnixFiles Clock Dates Reals Strings Diagnostics
  76. BitSets StringPool GenericLinker Reflection GenericLoader
  77. BootConsole
  78. ~
  79. Build 'A2Core' by joining OberonLoader (C) and oberon.bin (Oberon).
  80. UnixBinary.Build oberon.bin -> A2Core ~