Generic.Linux.I386.Glue.Mod 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. BEGIN
  160. Trace.String("Glue loaded"); Trace.Ln;
  161. END Glue.
  162. SystemTools.FreeDownTo FoxIntermediateBackend ~
  163. SystemTools.DoCommands
  164. Compiler.Compile -p=Linux32G
  165. Runtime.Mod Trace.Mod Generic.Linux.I386.Glue.Mod Generic.Linux.I386.Unix.Mod Generic.Unix.I386.Machine.Mod Heaps.Mod Generic.Modules.Mod
  166. Generic.Unix.Objects.Mod ~
  167. StaticLinker.Link --fileFormat=Raw --fileName=simple_elf --extension=.GofU --displacement=08048000H
  168. Runtime Trace Glue Unix Machine Heaps Modules Objects ~
  169. FSTools.CloseFiles simple_elf ~
  170. ~
  171. # Release.Build --path="../obg/" WinAosNewObjectFile ~
  172. # StaticLinker.Link --fileFormat=PE32 --fileName=A2.exe --extension=GofW --displacement=401000H --path="../obg/"
  173. Runtime Trace Kernel32 Machine Heaps Modules Objects Kernel KernelLog
  174. Streams Commands FIles WinFS Clock Dates Reals Strings Diagnostics
  175. BitSets StringPool ObjectFile GenericLinker Reflection GenericLoader BootConsole ~
  176. FoxGenericObjectFile.Show Machine.GofU ~