Generic.Linux.I386.Glue.Mod 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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* = {0};
  8. VAR
  9. last-: RECORD END; (* empty variable linked to end of kernel *)
  10. dlsym- : PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS): ADDRESS;
  11. dlopen- : PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
  12. dlclose- : PROCEDURE {C} ( handle: ADDRESS );
  13. exit- : PROCEDURE {C} (status: LONGINT);
  14. stackBottom- : ADDRESS; (* of main thread *)
  15. PROCEDURE {INITIAL, NOPAF} EntryPoint;
  16. CODE
  17. ; ELF header
  18. DB 07FH, 'ELF', 1, 1, 1, 0
  19. DD 0, 0
  20. DW 02, 03
  21. DD 01
  22. DD entry + base; program entry point
  23. DD elfheadersize
  24. DD 0
  25. DD 0
  26. DW elfheadersize
  27. DW 20H
  28. DW 3 ; #program header table entries
  29. DW 0
  30. DW 0
  31. DW 0
  32. elfheadersize:
  33. ; program header
  34. DD 1
  35. DD 0
  36. DD base;
  37. DD base;
  38. DD @last - base; segment size (file)
  39. DD @last - base; segment size (memory)
  40. DD 07
  41. DD 1000H; alignment
  42. ; interpreter header
  43. DD 3
  44. DD interpretername; interpreter name offset
  45. DD interpretername + base; interpreter name
  46. DD interpretername + base; interpreter name
  47. DD interpretername_end - interpretername ; interpreter name length
  48. DD interpretername_end - interpretername ; interpreter name length
  49. DD 4H
  50. DD 1H
  51. ; dynamic header
  52. DD 02H
  53. DD dynamicsection
  54. DD dynamicsection + base
  55. DD dynamicsection + base
  56. DD dynamicsection_end - dynamicsection ; size of dynamic section
  57. DD dynamicsection_end - dynamicsection ; size of dynamic section
  58. DD 06H
  59. DD 04H
  60. dynamicsection:
  61. DD 05H, base + stringtable
  62. DD 06H, symboltablebegin + base
  63. DD 07H, dlsymrelocation + base
  64. DD 08H, dlsymrelocation_end-dlsymrelocation ; size (relocationtable)
  65. DD 09H, 0CH
  66. DD 0AH, stringtable_end - stringtable; size (stringtable)
  67. DD 0BH, 10H
  68. DD 01H, libname - stringtable; position of libname
  69. DD 0H, 0H ; sentinel
  70. dynamicsection_end:
  71. dlsymrelocation:
  72. DD @dlsym
  73. DB 01H
  74. DB 01H, 00H, 00H; index of the symbol
  75. DD 0H
  76. dlsymrelocation_end:
  77. stringtable:
  78. DB 0H ; sentinel
  79. libname:
  80. DB 'libdl.so.2', 0
  81. dlsymname:
  82. DB 'dlsym', 0
  83. stringtable_end:
  84. ALIGN 4
  85. symboltablebegin:
  86. DD 0;
  87. DD 0
  88. DD 0
  89. DB 0
  90. DB 0
  91. DW 0
  92. ; dlsym symbol
  93. DD dlsymname - stringtable; position of dlsymname
  94. DD 0
  95. DD 0
  96. DB 12H ; info: global + function
  97. DB 0
  98. DW 0
  99. interpretername:
  100. DB '/lib/ld-linux.so.2', 0
  101. interpretername_end:
  102. ALIGN 4
  103. entry:
  104. END EntryPoint;
  105. (*
  106. PROCEDURE {FINAL} ExitPoint;
  107. BEGIN
  108. Trace.String("exiting"); Trace.Ln;
  109. exit(0);
  110. END ExitPoint;
  111. *)
  112. PROCEDURE {NOPAF} putc*(file: ADDRESS; c: CHAR);
  113. CODE
  114. PUSH ECX
  115. MOV EAX, 4
  116. MOV EBX, [ESP + 12]
  117. LEA ECX, [ESP+8]
  118. MOV EDX, 1
  119. INT 80H
  120. POP ECX
  121. JNE fail
  122. MOV EAX, [ESP + 4]
  123. RET
  124. fail:
  125. MOV EAX, -1
  126. RET
  127. END putc;
  128. PROCEDURE Dlsym*(handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS);
  129. VAR val: ADDRESS;
  130. BEGIN
  131. val := dlsym(handle, ADDRESS OF name[0]);
  132. SYSTEM.PUT32(adr, val);
  133. END Dlsym;
  134. PROCEDURE Char(c: CHAR);
  135. BEGIN
  136. putc(1, c);
  137. END Char;
  138. PROCEDURE Init;
  139. VAR i: LONGINT;
  140. BEGIN
  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. TRACE(ADDRESS OF last);
  152. TRACE(base);
  153. TRACE(ADDRESS OF last - base);
  154. END Init;
  155. PROCEDURE {INITIAL,NOPAF} Init0;
  156. BEGIN
  157. Init;
  158. END Init0;
  159. PROCEDURE Initialize*;
  160. BEGIN
  161. (* nothing, only for compatibility *)
  162. END Initialize;
  163. BEGIN
  164. Trace.String("Glue loaded"); Trace.Ln;
  165. END Glue.
  166. SystemTools.FreeDownTo FoxIntermediateBackend ~
  167. SystemTools.DoCommands
  168. Compiler.Compile -p=Linux32G
  169. Runtime.Mod Trace.Mod Generic.Linux.I386.Glue.Mod Generic.Linux.I386.Unix.Mod Generic.Unix.I386.Machine.Mod Heaps.Mod Generic.Modules.Mod
  170. Generic.Unix.Objects.Mod
  171. Unix.Kernel.Mod KernelLog.Mod Plugins.Mod Streams.Mod
  172. Pipes.Mod Commands.Mod I386.Reals.Mod Generic.Reflection.Mod TrapWriters.Mod CRC.Mod SystemVersion.Mod
  173. Unix.StdIO.Mod Generic.Unix.Traps.Mod Locks.Mod Unix.Clock.Mod Disks.Mod Files.Mod Dates.Mod Strings.Mod
  174. UTF8Strings.Mod FileTrapWriter.Mod Caches.Mod DiskVolumes.Mod OldDiskVolumes.Mod RAMVolumes.Mod
  175. DiskFS.Mod OldDiskFS.Mod OberonFS.Mod FATVolumes.Mod FATFiles.Mod ISO9660Volumes.Mod
  176. ISO9660Files.Mod Unix.UnixFiles.Mod RelativeFileSystem.Mod BitSets.Mod StringPool.Mod DIagnostics.Mod ObjectFile.Mod GenericLinker.Mod GenericLoader.Mod Unix.BootConsole.Mod
  177. TestLinux.Mod ~
  178. StaticLinker.Link --fileFormat=Raw --fileName=simple_elf --extension=.GofU --displacement=08048000H
  179. Runtime Trace Glue Unix Machine Heaps Modules Objects Kernel KernelLog Test
  180. Streams Commands StdIO TrapWriters Traps FIles UnixFiles Clock Dates Reals Strings Diagnostics
  181. BitSets StringPool ObjectFile GenericLinker Reflection GenericLoader BootConsole
  182. ~
  183. ~
  184. FSTools.CloseFiles simple_elf ~
  185. ~
  186. # Release.Build --path="../obg/" WinAosNewObjectFile ~
  187. # StaticLinker.Link --fileFormat=PE32 --fileName=A2.exe --extension=GofW --displacement=401000H --path="../obg/"
  188. Runtime Trace Kernel32 Machine Heaps Modules Objects Kernel KernelLog
  189. Streams Commands FIles WinFS Clock Dates Reals Strings Diagnostics
  190. BitSets StringPool ObjectFile GenericLinker Reflection GenericLoader BootConsole ~
  191. FoxGenericObjectFile.Show Machine.GofU ~