Generic.Solaris.I386.Glue.Mod 6.8 KB

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