Linux.I386.Glue.Mod 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. (* Minimal ELF header for self contained linux Oberon programs *)
  2. (* Copyright (c) Felix Friedrich, ETH Zürich *)
  3. MODULE Glue;
  4. IMPORT SYSTEM, Trace;
  5. CONST
  6. base* = 08048000H;
  7. debug* = {};
  8. VAR
  9. last-: RECORD END; (* empty variable linked to end of kernel *)
  10. baseAdr*: ADDRESS;
  11. endAdr*: ADDRESS;
  12. dlsym- : PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS): ADDRESS;
  13. dlopen- : PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
  14. dlclose- : PROCEDURE {C} ( handle: ADDRESS );
  15. exit- : PROCEDURE {C} (status: LONGINT);
  16. stackBottom- : ADDRESS; (* of main thread *)
  17. argc-: WORD;
  18. argv-: ADDRESS;
  19. environ-: ADDRESS;
  20. PROCEDURE {INITIAL, NOPAF} EntryPoint;
  21. CODE
  22. ; ELF header
  23. DB 07FH, 'ELF', 1, 1, 1, 0
  24. DD 0, 0
  25. DW 02, 03
  26. DD 01
  27. DD entry + base; program entry point
  28. DD elfheadersize
  29. DD 0
  30. DD 0
  31. DW elfheadersize
  32. DW 20H
  33. DW 3 ; #program header table entries
  34. DW 0
  35. DW 0
  36. DW 0
  37. elfheadersize:
  38. ; program header
  39. DD 1
  40. DD 0
  41. DD base;
  42. DD base;
  43. DD @last - base; segment size (file)
  44. DD @last - base; segment size (memory)
  45. DD 07
  46. DD 1000H; alignment
  47. ; interpreter header
  48. DD 3
  49. DD interpretername; interpreter name offset
  50. DD interpretername + base; interpreter name
  51. DD interpretername + base; interpreter name
  52. DD interpretername_end - interpretername ; interpreter name length
  53. DD interpretername_end - interpretername ; interpreter name length
  54. DD 4H
  55. DD 1H
  56. ; dynamic header
  57. DD 02H
  58. DD dynamicsection
  59. DD dynamicsection + base
  60. DD dynamicsection + base
  61. DD dynamicsection_end - dynamicsection ; size of dynamic section
  62. DD dynamicsection_end - dynamicsection ; size of dynamic section
  63. DD 06H
  64. DD 04H
  65. dynamicsection:
  66. DD 05H, base + stringtable
  67. DD 06H, symboltablebegin + base
  68. DD 07H, dlsymrelocation + base
  69. DD 08H, dlsymrelocation_end-dlsymrelocation ; size (relocationtable)
  70. DD 09H, 0CH
  71. DD 0AH, stringtable_end - stringtable; size (stringtable)
  72. DD 0BH, 10H
  73. DD 01H, libname - stringtable; position of libname
  74. DD 0H, 0H ; sentinel
  75. dynamicsection_end:
  76. dlsymrelocation:
  77. DD @dlsym
  78. DB 01H
  79. DB 01H, 00H, 00H; index of the symbol
  80. DD 0H
  81. dlsymrelocation_end:
  82. stringtable:
  83. DB 0H ; sentinel
  84. libname:
  85. DB 'libdl.so.2', 0
  86. dlsymname:
  87. DB 'dlsym', 0
  88. stringtable_end:
  89. ALIGN 4
  90. symboltablebegin:
  91. DD 0;
  92. DD 0
  93. DD 0
  94. DB 0
  95. DB 0
  96. DW 0
  97. ; dlsym symbol
  98. DD dlsymname - stringtable; position of dlsymname
  99. DD 0
  100. DD 0
  101. DB 12H ; info: global + function
  102. DB 0
  103. DW 0
  104. interpretername:
  105. DB '/lib/ld-linux.so.2', 0
  106. interpretername_end:
  107. ALIGN 4
  108. entry:
  109. END EntryPoint;
  110. (*
  111. PROCEDURE {FINAL} ExitPoint;
  112. BEGIN
  113. Trace.String("exiting"); Trace.Ln;
  114. exit(0);
  115. END ExitPoint;
  116. *)
  117. PROCEDURE {NOPAF} putc*(file: ADDRESS; c: CHAR);
  118. CODE
  119. MOV EAX, 4
  120. MOV EBX, [ESP + 8]
  121. LEA ECX, [ESP + 4]
  122. MOV EDX, 1
  123. INT 80H
  124. RET
  125. END putc;
  126. PROCEDURE Dlsym*(handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS);
  127. VAR val: ADDRESS;
  128. BEGIN
  129. val := dlsym(handle, ADDRESS OF name[0]);
  130. SYSTEM.PUT(adr, val);
  131. END Dlsym;
  132. PROCEDURE Char(c: CHAR);
  133. BEGIN
  134. putc(1, c);
  135. END Char;
  136. PROCEDURE Init;
  137. VAR i: ADDRESS;
  138. BEGIN
  139. baseAdr := ADDRESS OF EntryPoint;
  140. endAdr := ADDRESS OF last;
  141. Trace.Init;
  142. Trace.Char := Char;
  143. stackBottom := ADDRESSOF( i ) + 2*SIZEOF(ADDRESS);
  144. ASSERT(dlsym # NIL);
  145. Dlsym(0,"dlopen", ADDRESS OF dlopen);
  146. ASSERT(dlopen # NIL);
  147. Dlsym( 0, "dlclose", ADDRESS OF dlclose);
  148. ASSERT(dlclose # NIL);
  149. Dlsym(0,"exit", ADDRESS OF exit);
  150. ASSERT(exit # NIL);
  151. END Init;
  152. PROCEDURE {INITIAL,NOPAF} Init0;
  153. BEGIN
  154. (*initial stack layout:
  155. argc at esp
  156. argv at esp+4
  157. 0 at esp+4+argc*4
  158. env at esp+4+argc*4+4 = (2+argc)<<2 + esp*)
  159. CODE{SYSTEM.i386}
  160. MOV EAX, [ESP]
  161. MOV argc, EAX
  162. LEA EAX, [ESP+4]
  163. MOV argv, EAX
  164. MOV EAX, [ESP]
  165. ADD EAX, 2
  166. SHL EAX, 2
  167. ADD EAX, ESP
  168. MOV environ, EAX
  169. END;
  170. Init;
  171. END Init0;
  172. END Glue.
  173. SystemTools.FreeDownTo FoxIntermediateBackend ~
  174. SystemTools.DoCommands
  175. Compiler.Compile -p=Linux32
  176. Runtime.Mod Trace.Mod Linux.I386.Glue.Mod Linux.I386.Unix.Mod Unix.I386.Machine.Mod Heaps.Mod Modules.Mod
  177. Unix.Objects.Mod
  178. Unix.Kernel.Mod KernelLog.Mod Plugins.Mod Streams.Mod
  179. Pipes.Mod Commands.Mod I386.Reals.Mod Reflection.Mod TrapWriters.Mod CRC.Mod SystemVersion.Mod
  180. Unix.StdIO.Mod Unix.Traps.Mod Locks.Mod Unix.Clock.Mod Disks.Mod Files.Mod Dates.Mod Strings.Mod
  181. UTF8Strings.Mod FileTrapWriter.Mod Caches.Mod DiskVolumes.Mod OldDiskVolumes.Mod RAMVolumes.Mod
  182. DiskFS.Mod OldDiskFS.Mod OberonFS.Mod FATVolumes.Mod FATFiles.Mod ISO9660Volumes.Mod
  183. ISO9660Files.Mod Unix.UnixFiles.Mod RelativeFileSystem.Mod BitSets.Mod StringPool.Mod DIagnostics.Mod
  184. ObjectFile.Mod GenericLinker.Mod Loader.Mod Unix.BootConsole.Mod
  185. ~
  186. Linker.Link --fileFormat=Raw --fileName=simple_elf --extension=.GofU --displacement=08048000H
  187. Runtime Trace Glue Unix Machine Heaps Modules Objects Kernel KernelLog
  188. Streams Commands StdIO TrapWriters Traps
  189. Files UnixFiles Clock Dates Reals Strings Diagnostics
  190. BitSets StringPool ObjectFile GenericLinker Reflection Loader
  191. BootConsole
  192. ~
  193. FSTools.CloseFiles simple_elf ~
  194. ~
  195. MODULE Test;
  196. IMPORT StdIO, Commands, Streams, Modules;
  197. PROCEDURE Execute(context: Commands.Context);
  198. VAR str, msg: ARRAY 256 OF CHAR; res: LONGINT;
  199. BEGIN
  200. IF ~context.arg.GetString(str) THEN RETURN END;
  201. IF ~context.arg.GetString(str) THEN
  202. context.out.String("no command"); context.out.Ln;
  203. RETURN
  204. END;
  205. Commands.Activate(str, context, {Commands.Wait}, res, msg);
  206. END Execute;
  207. BEGIN
  208. Execute(StdIO.env);
  209. Modules.Shutdown(1);
  210. END Test.