Unix.Glue.Mod 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. (* Return current frame pointer *)
  62. PROCEDURE -CurrentBP (): ADDRESS;
  63. CODE
  64. #IF I386 THEN
  65. MOV EAX, EBP
  66. #ELSIF AMD64 THEN
  67. MOV RAX, RBP
  68. #ELSE
  69. unimplemented
  70. #END
  71. END CurrentBP;
  72. PROCEDURE {INITIAL, NOPAF} Init0;
  73. CONST CR = 0DX; NL = 0AX;
  74. BEGIN
  75. baseAdr := ADDRESSOF( Header );
  76. endAdr := ADDRESSOF( last );
  77. Trace.Init;
  78. Trace.Char := Char;
  79. stackBottom := CurrentBP()+SIZEOF(ADDRESS);
  80. END Init0;
  81. END Glue.
  82. Building the SolarisA2 Generic elf binary:
  83. Compiler.Compile -p=Unix32
  84. I386.Builtins.Mod Trace.Mod
  85. Unix.Glue.Mod Solaris.I386.Unix.Mod Unix.I386.Machine.Mod
  86. Heaps.Mod Modules.Mod Solaris.Objects.Mod Unix.Kernel.Mod
  87. KernelLog.Mod Streams.Mod Pipes.Mod Commands.Mod TrapWriters.Mod Reflection.Mod
  88. Unix.StdIO.Mod Unix.Traps.Mod UTF8Strings.Mod Files.Mod Unix.UnixFiles.Mod
  89. RelativeFileSystem.Mod StringPool.Mod BitSets.Mod ObjectFile.Mod
  90. I386.Reals.Mod Unix.Clock.Mod Dates.Mod Strings.Mod Diagnostics.Mod
  91. GenericLinker.Mod Loader.Mod Unix.BootConsole.Mod
  92. UnixBinary.Mod
  93. ~
  94. Linker.Link -p=Solaris32
  95. Builtins Trace Glue
  96. Unix Machine Heaps Modules Objects Kernel KernelLog
  97. Streams Pipes Commands StdIO TrapWriters Traps
  98. Files UnixFiles Clock Dates Reals Strings Diagnostics
  99. BitSets StringPool GenericLinker Reflection Loader
  100. BootConsole
  101. ~
  102. Build 'A2Core' by joining OberonLoader (C) and oberon.bin (Oberon).
  103. UnixBinary.Build oberon.bin -> A2Core ~