Generic.Solaris.I386.Glue.Mod 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. (* Minimal ELF header for self contained Solaris x86 Oberon programs *)
  2. (* Copyright (c) Felix Friedrich, ETH Zürich *)
  3. MODULE Glue;
  4. IMPORT SYSTEM, Trace;
  5. CONST
  6. (* base* = 08050000H; for true elf core *)
  7. base* = 08070000H; (* used by A2Loader, see 'A2Loader.elf -h' *)
  8. debug* = {};
  9. VAR
  10. last-: RECORD END; (* empty variable linked to end of kernel *)
  11. baseAdr*: ADDRESS;
  12. endAdr*: ADDRESS;
  13. dlsym- : PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS ): ADDRESS;
  14. dlopen- : PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
  15. dlclose- : PROCEDURE {C} ( handle: ADDRESS );
  16. stackBottom- : ADDRESS; (* of main thread *)
  17. argc-: WORD;
  18. argv-: ADDRESS;
  19. environ-: ADDRESS;
  20. (*? the relocation of "dlsym/dlopen" doesn't work *)
  21. (*==================
  22. PROCEDURE {INITIAL, NOPAF} EntryPoint;
  23. CODE
  24. ; ELF header
  25. DB 07FH, 'ELF', 1, 1, 1, 6, 1, 0, 0, 0
  26. DD 0
  27. DW 02, 03 ; executable, I386
  28. DD 01
  29. DD entry + base ;program entry point
  30. DD elfheadersize
  31. DD 0
  32. DD 0
  33. DW elfheadersize
  34. DW 20H
  35. DW 3 ;program header table entries
  36. DW 0
  37. DW 0
  38. DW 0
  39. elfheadersize:
  40. ; interpreter header, must precede any loadable segment!!
  41. DD 3
  42. DD interpretername; interpreter name offset
  43. DD interpretername + base; interpreter name
  44. DD interpretername + base; interpreter name
  45. DD interpretername_end - interpretername ; interpreter name length
  46. DD interpretername_end - interpretername ; interpreter name length
  47. DD 4H
  48. DD 1H
  49. ; program header
  50. DD 1
  51. DD 0
  52. DD base;
  53. DD base;
  54. DD @last - base; segment size (file)
  55. DD @last - base; segment size (memory)
  56. DD 07
  57. DD 1000H; alignment
  58. ; dynamic header
  59. DD 02H
  60. DD dynamicsection
  61. DD dynamicsection + base
  62. DD dynamicsection + base
  63. DD dynamicsection_end - dynamicsection ; size of dynamic section
  64. DD dynamicsection_end - dynamicsection ; size of dynamic section
  65. DD 06H
  66. DD 04H
  67. dynamicsection: ; manantory in solaris: 0, 4-11, 17-19
  68. DD 04H, hashtable + base ;DT_HASH
  69. DD 05H, stringtable + base ;DT_STRTAB
  70. DD 06H, symboltable + base ;DT_SYMTAB
  71. DD 07H, relocationtable + base ;DT_RELA
  72. DD 08H, relocationtable_end - relocationtable ;DT_RELASZ, size of relocationtable
  73. DD 09H, 0CH ;DT_RELAENT, size of relocation entry
  74. DD 0AH, stringtable_end - stringtable ;DT_STRSZ, size of stringtable
  75. DD 0BH, 10H ;DT_SYMENT, size of symboltable entry
  76. DD 11H, relocationtable + base ;DT_REL
  77. DD 12H, relocationtable_end - relocationtable ;DT_RELSZ
  78. DD 13H, 0CH ;DT_RELENT
  79. DD 01H, libdl - stringtable ;DT_NEEDED, pos. of libdl
  80. DD 01H, libc - stringtable ;DT_NEEDED, pos. of libc
  81. DD 0H, 0H ;sentinel
  82. dynamicsection_end:
  83. relocationtable:
  84. DD @dlsym
  85. DB 01H ;relocation type
  86. DB 01H, 00H, 00H ;index of the symbol
  87. DD 0H
  88. DD @dlopen
  89. DB 01H ;relocation type
  90. DB 01H, 00H, 00H ;index of the symbol
  91. DD 0H
  92. relocationtable_end:
  93. stringtable:
  94. DB 0H ; sentinel
  95. libdl:
  96. DB '/lib/libdl.so.1', 0
  97. libc:
  98. DB '/lib/libc.so.1', 0
  99. dlsymname:
  100. DB 'dlsym', 0
  101. dlopenname:
  102. DB 'dlopen', 0
  103. stringtable_end:
  104. ALIGN 4
  105. hashtable:
  106. DD 2 ; nbucket
  107. DD 2 ; nchain
  108. DD 1 ; bucket[0]
  109. DD 2 ; bucket[1]
  110. DD 1 ; chain[0]
  111. DD 2 ; chain[1]
  112. symboltable:
  113. DD 0
  114. DD 0
  115. DD 0
  116. DB 0
  117. DB 0
  118. DW 0
  119. ;dlsym symbol
  120. DD dlsymname - stringtable ; st_name, position of dlsymname
  121. DD 0 ; st_value
  122. DD 0 ; st_size
  123. DB 12H ; st_info, global + function
  124. DB 0 ; st_other
  125. DW 0 ; st_shndx: default
  126. ;dlopen symbol
  127. DD dlopenname - stringtable ; st_name, position of dlopenname
  128. DD 0 ; st_value
  129. DD 0 ; st_size
  130. DB 12H ; st_info, global + function
  131. DB 0 ; st_other
  132. DW 0 ; st_shndx: default
  133. interpretername:
  134. DB '/lib/ld.so.1', 0
  135. interpretername_end:
  136. ALIGN 4
  137. entry:
  138. END EntryPoint; ======*)
  139. PROCEDURE {INITIAL, NOPAF} EntryPoint; (* header needed by A2Loader *)
  140. CODE
  141. DB 'Oberon32G.core', 0, 0
  142. DD 0
  143. DD 0
  144. DD 0
  145. DD 0
  146. DD base
  147. DD @Init0
  148. DD @dlopen
  149. DD @dlclose
  150. DD @dlsym
  151. DD @argc
  152. DD @argv
  153. DD @environ
  154. END EntryPoint;
  155. PROCEDURE {NOPAF} putc*( file: ADDRESS; c: CHAR );
  156. CODE
  157. PUSH ECX
  158. MOV EAX, 4
  159. MOV EBX, [ESP + 12]
  160. LEA ECX, [ESP+8]
  161. MOV EDX, 1
  162. INT 80H
  163. POP ECX
  164. JNE fail
  165. MOV EAX, [ESP + 4]
  166. RET
  167. fail:
  168. MOV EAX, -1
  169. RET
  170. END putc;
  171. PROCEDURE Char ( c: CHAR );
  172. BEGIN
  173. putc( 1, c )
  174. END Char;
  175. PROCEDURE Dlsym*( handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS );
  176. VAR val: ADDRESS;
  177. BEGIN
  178. val := dlsym( handle, ADDRESSOF( name[0] ) );
  179. SYSTEM.PUT32( adr, val );
  180. END Dlsym;
  181. PROCEDURE Init;
  182. VAR i: LONGINT;
  183. libdl: ADDRESS;
  184. BEGIN
  185. baseAdr := ADDRESSOF( EntryPoint );
  186. endAdr := ADDRESSOF( last );
  187. Trace.Init;
  188. Trace.Char := Char;
  189. stackBottom := ADDRESSOF( i ) + 2*SIZEOF( ADDRESS );
  190. (* Dlsym( 0, "dlopen" , ADDRESSOF ( dlopen ) );
  191. libdl := dlopen( ADDRESSOF( "/lib/libdl.so.1" ), 2 );
  192. Dlsym( libdl, "dlclose", ADDRESSOF ( dlclose ) );
  193. libc := dlopen( ADDRESSOF( "/lib/libc.so.1" ), 2 );
  194. Dlsym( libc, "write", ADDRESSOF ( write ) );
  195. Dlsym( libc, "exit", ADDRESSOF ( exit ) ); *)
  196. END Init;
  197. PROCEDURE {INITIAL, NOPAF} Init0;
  198. BEGIN
  199. (* (*initial stack layout:
  200. argc at esp
  201. argv at esp+4
  202. 0 at esp+4+argc*4
  203. env at esp+4+argc*4+4 = (2+argc)<<2 + esp
  204. *)
  205. CODE{SYSTEM.i386}
  206. MOV EAX, [ESP]
  207. MOV argc, EAX
  208. LEA EAX, [ESP+4]
  209. MOV argv, EAX
  210. MOV EAX, [ESP]
  211. ADD EAX, 2
  212. SHL EAX, 2
  213. ADD EAX, ESP
  214. MOV environ, EAX
  215. END; *)
  216. Init;
  217. END Init0;
  218. PROCEDURE Initialize*;
  219. BEGIN
  220. (* nothing, only for compatibility *)
  221. END Initialize;
  222. END Glue.
  223. Building the SolarisA2 Generic elf binary:
  224. Compiler.Compile -p=Linux32G
  225. Runtime.Mod Trace.Mod
  226. Generic.Solaris.I386.Glue.Mod Generic.Solaris.I386.Unix.Mod Generic.Unix.I386.Machine.Mod
  227. Heaps.Mod Generic.Modules.Mod Generic.Solaris.Objects.Mod Unix.Kernel.Mod
  228. KernelLog.Mod Streams.Mod Pipes.Mod Commands.Mod TrapWriters.Mod Generic.Reflection.Mod
  229. Unix.StdIO.Mod Generic.Unix.Traps.Mod UTF8Strings.Mod Files.Mod Unix.UnixFiles.Mod
  230. RelativeFileSystem.Mod StringPool.Mod BitSets.Mod ObjectFile.Mod
  231. I386.Reals.Mod Unix.Clock.Mod Dates.Mod Strings.Mod Diagnostics.Mod
  232. GenericLinker.Mod GenericLoader.Mod Unix.BootConsole.Mod
  233. ElfBinary.Mod
  234. ~
  235. (* the correct displacement is shown by 'A2Loader.elf -h' *)
  236. StaticLinker.Link
  237. --fileFormat=Raw --fileName=Solaris32G.core --extension=.GofU --displacement=08070000H
  238. Runtime Trace Glue
  239. Unix Machine Heaps Modules Objects Kernel KernelLog
  240. Streams Pipes Commands StdIO TrapWriters Traps
  241. Files UnixFiles Clock Dates Reals Strings Diagnostics
  242. BitSets StringPool GenericLinker Reflection GenericLoader
  243. BootConsole
  244. ~
  245. Build 'SolarisA2' by concatenating 'A2Loader.elf' (C) and 'Solaris32G.core' (Oberon).
  246. ElfBinary.Build Solaris32G.core -> SolarisA2 ~