Generic.Unix.I386.Glue.Mod 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. stackBottom- : ADDRESS; (* of main thread *)
  13. argc-: WORD;
  14. argv-: ADDRESS;
  15. environ-: ADDRESS;
  16. PROCEDURE {INITIAL, NOPAF} Header; (* header needed by OberonLoader *)
  17. CODE
  18. DB 'Oberon32G.binary'
  19. DD 0
  20. DD 0
  21. DD 0 ; size of statially linked binary ( filled in by static linker )
  22. DD 0 ; #relocations if base = 0 ( filled in by static linker )
  23. DD 08070000H ; base ( set 0 by static linker )
  24. DD @Init0 ; Loader <-- Oberon
  25. DD @dlopen ; Loader --> Oberon
  26. DD @dlclose ; Loader --> Oberon
  27. DD @dlsym ; Loader --> Oberon
  28. DD @argc ; Loader --> Oberon
  29. DD @argv ; Loader --> Oberon
  30. DD @environ ; Loader --> Oberon
  31. END Header;
  32. PROCEDURE {NOPAF} putc*( file: ADDRESS; c: CHAR );
  33. CODE
  34. PUSH ECX
  35. MOV EAX, 4
  36. MOV EBX, [ESP + 12]
  37. LEA ECX, [ESP+8]
  38. MOV EDX, 1
  39. INT 80H
  40. POP ECX
  41. JNE fail
  42. MOV EAX, [ESP + 4]
  43. RET
  44. fail:
  45. MOV EAX, -1
  46. RET
  47. END putc;
  48. PROCEDURE Char ( c: CHAR );
  49. BEGIN
  50. putc( 1, c )
  51. END Char;
  52. PROCEDURE Dlsym*( handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS );
  53. VAR val: ADDRESS;
  54. BEGIN
  55. val := dlsym( handle, ADDRESSOF( name[0] ) );
  56. SYSTEM.PUT32( adr, val );
  57. END Dlsym;
  58. PROCEDURE {INITIAL, NOPAF} Init0;
  59. VAR localvar: LONGINT;
  60. BEGIN
  61. baseAdr := ADDRESSOF( Header );
  62. endAdr := ADDRESSOF( last );
  63. Trace.Init;
  64. Trace.Char := Char;
  65. stackBottom := ADDRESSOF( localvar ) + 2*SIZEOF( ADDRESS );
  66. END Init0;
  67. PROCEDURE Initialize*;
  68. BEGIN
  69. (* nothing, only for compatibility *)
  70. END Initialize;
  71. END Glue.
  72. Building the SolarisA2 Generic elf binary:
  73. Compiler.Compile -p=Linux32G
  74. Runtime.Mod Trace.Mod
  75. Generic.Solaris.I386.Glue.Mod Generic.Solaris.I386.Unix.Mod Generic.Unix.I386.Machine.Mod
  76. Heaps.Mod Generic.Modules.Mod Generic.Solaris.Objects.Mod Unix.Kernel.Mod
  77. KernelLog.Mod Streams.Mod Pipes.Mod Commands.Mod TrapWriters.Mod Generic.Reflection.Mod
  78. Unix.StdIO.Mod Generic.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 GenericLoader.Mod Unix.BootConsole.Mod
  82. UnixBinary.Mod
  83. ~
  84. StaticLinker.Link -p=Solaris32G
  85. Runtime 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 GenericLoader
  90. BootConsole
  91. ~
  92. Build 'A2Core' by joining OberonLoader (C) and oberon.bin (Oberon).
  93. UnixBinary.Build oberon.bin -> A2Core ~