Linux.AMD64.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', 2, 1, 1, 0
  24. DD 0, 0
  25. DW 02, 62
  26. DD 01
  27. DQ entry + base; program entry point
  28. DQ elfheadersize
  29. DQ 0
  30. DD 0
  31. DW elfheadersize
  32. DW 38H
  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 07
  41. DQ 0
  42. DQ base;
  43. DQ base;
  44. DQ @last - base; segment size (file)
  45. DQ @last - base; segment size (memory)
  46. DQ 1000H; alignment
  47. ; interpreter header
  48. DD 3
  49. DD 4H
  50. DQ interpretername; interpreter name offset
  51. DQ interpretername + base; interpreter name
  52. DQ interpretername + base; interpreter name
  53. DQ interpretername_end - interpretername ; interpreter name length
  54. DQ interpretername_end - interpretername ; interpreter name length
  55. DQ 1H
  56. ; dynamic header
  57. DD 02H
  58. DD 06H
  59. DQ dynamicsection
  60. DQ dynamicsection + base
  61. DQ dynamicsection + base
  62. DQ dynamicsection_end - dynamicsection ; size of dynamic section
  63. DQ dynamicsection_end - dynamicsection ; size of dynamic section
  64. DQ 08H
  65. dynamicsection:
  66. DQ 05H, base + stringtable
  67. DQ 06H, symboltablebegin + base
  68. DQ 07H, dlsymrelocation + base
  69. DQ 08H, dlsymrelocation_end-dlsymrelocation ; size (relocationtable)
  70. DQ 09H, 18H
  71. DQ 0AH, stringtable_end - stringtable; size (stringtable)
  72. DQ 0BH, 18H
  73. DQ 01H, libname - stringtable; position of libname
  74. DQ 0H, 0H ; sentinel
  75. dynamicsection_end:
  76. dlsymrelocation:
  77. DQ @dlsym
  78. DD 01H
  79. DD 01H ; index of the symbol
  80. DQ 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 8
  90. symboltablebegin:
  91. DD 0;
  92. DB 0
  93. DB 0
  94. DW 0
  95. DQ 0
  96. DQ 0
  97. ; dlsym symbol
  98. DD dlsymname - stringtable; position of dlsymname
  99. DB 12H ; info: global + function
  100. DB 0
  101. DW 0
  102. DQ 0
  103. DQ 0
  104. interpretername:
  105. DB '/lib64/ld-linux-x86-64.so.2', 0
  106. interpretername_end:
  107. ALIGN 8
  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, 1
  120. MOV RDI, [RSP + 16]
  121. LEA RSI, [RSP + 8]
  122. MOV RDX, 1
  123. SYSCALL
  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 rsp
  156. argv at rsp+8
  157. 0 at rsp+8+argc*8
  158. env at rsp+8+argc*8+8 = (2+argc)<<3 + rsp*)
  159. CODE{SYSTEM.AMD64}
  160. MOV RAX, [RSP]
  161. MOV argc, RAX
  162. LEA RAX, [RSP+8]
  163. MOV argv, RAX
  164. MOV RAX, [RSP]
  165. ADD RAX, 2
  166. SHL RAX, 3
  167. ADD RAX, RSP
  168. MOV environ, RAX
  169. END;
  170. Init;
  171. END Init0;
  172. END Glue.
  173. SystemTools.FreeDownTo FoxIntermediateBackend ~
  174. SystemTools.DoCommands
  175. Compiler.Compile -p=Linux32
  176. I386.Builtins.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. Builtins 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: WORD;
  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.