Linux.I386.ElfHeader.Mod 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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. PROCEDURE {INITIAL, NOPAF} EntryPoint;
  15. CODE
  16. ; ELF header
  17. DB 07FH, 'ELF', 1, 1, 1, 0
  18. DD 0, 0
  19. DW 02, 03
  20. DD 01
  21. DD entry + base; program entry point
  22. DD elfheadersize
  23. DD 0
  24. DD 0
  25. DW elfheadersize
  26. DW 20H
  27. DW 3 ; #program header table entries
  28. DW 0
  29. DW 0
  30. DW 0
  31. elfheadersize:
  32. ; program header
  33. DD 1
  34. DD 0
  35. DD base;
  36. DD base;
  37. DD @last - base; segment size (file)
  38. DD @last - base; segment size (memory)
  39. DD 07
  40. DD 1000H; alignment
  41. ; interpreter header
  42. DD 3
  43. DD interpretername; interpreter name offset
  44. DD interpretername + base; interpreter name
  45. DD interpretername + base; interpreter name
  46. DD interpretername_end - interpretername ; interpreter name length
  47. DD interpretername_end - interpretername ; interpreter name length
  48. DD 4H
  49. DD 1H
  50. ; dynamic header
  51. DD 02H
  52. DD dynamicsection
  53. DD dynamicsection + base
  54. DD dynamicsection + base
  55. DD dynamicsection_end - dynamicsection ; size of dynamic section
  56. DD dynamicsection_end - dynamicsection ; size of dynamic section
  57. DD 06H
  58. DD 04H
  59. dynamicsection:
  60. DD 05H, base + stringtable
  61. DD 06H, symboltablebegin + base
  62. DD 07H, dlsymrelocation + base
  63. DD 08H, dlsymrelocation_end-dlsymrelocation ; size (relocationtable)
  64. DD 09H, 0CH
  65. DD 0AH, stringtable_end - stringtable; size (stringtable)
  66. DD 0BH, 10H
  67. DD 01H, libname - stringtable; position of libname
  68. DD 0H, 0H ; sentinel
  69. dynamicsection_end:
  70. dlsymrelocation:
  71. DD @dlsym
  72. DB 01H
  73. DB 01H, 00H, 00H; index of the symbol
  74. DD 0H
  75. dlsymrelocation_end:
  76. stringtable:
  77. DB 0H ; sentinel
  78. libname:
  79. DB 'libdl.so.2', 0
  80. dlsymname:
  81. DB 'dlsym', 0
  82. stringtable_end:
  83. ALIGN 4
  84. symboltablebegin:
  85. DD 0;
  86. DD 0
  87. DD 0
  88. DB 0
  89. DB 0
  90. DW 0
  91. ; dlsym symbol
  92. DD dlsymname - stringtable; position of dlsymname
  93. DD 0
  94. DD 0
  95. DB 12H ; info: global + function
  96. DB 0
  97. DW 0
  98. interpretername:
  99. DB '/lib/ld-linux.so.2', 0
  100. interpretername_end:
  101. ALIGN 4
  102. entry:
  103. END EntryPoint;
  104. PROCEDURE {FINAL} ExitPoint;
  105. BEGIN
  106. Trace.String("exiting"); Trace.Ln;
  107. exit(0);
  108. END ExitPoint;
  109. PROCEDURE {NOPAF} putc*(file: ADDRESS; c: CHAR);
  110. CODE
  111. PUSH ECX
  112. MOV EAX, 4
  113. MOV EBX, [ESP + 12]
  114. LEA ECX, [ESP+8]
  115. MOV EDX, 1
  116. INT 80H
  117. POP ECX
  118. JNE fail
  119. MOV EAX, [ESP + 4]
  120. RET
  121. fail:
  122. MOV EAX, -1
  123. RET
  124. END putc;
  125. PROCEDURE Dlsym*(handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS);
  126. VAR val: ADDRESS;
  127. BEGIN
  128. val := dlsym(handle, ADDRESS OF name[0]);
  129. SYSTEM.PUT32(adr, val);
  130. END Dlsym;
  131. PROCEDURE Char(c: CHAR);
  132. BEGIN
  133. putc(1, c);
  134. END Char;
  135. PROCEDURE Init;
  136. BEGIN
  137. Trace.Char := Char;
  138. ASSERT(dlsym # NIL);
  139. Dlsym(0,"dlopen", ADDRESS OF dlopen);
  140. ASSERT(dlopen # NIL);
  141. Dlsym( 0, "dlclose", ADDRESS OF dlclose);
  142. ASSERT(dlclose # NIL);
  143. Dlsym(0,"exit", ADDRESS OF exit);
  144. ASSERT(exit # NIL);
  145. TRACE(ADDRESS OF last);
  146. TRACE(base);
  147. TRACE(ADDRESS OF last - base);
  148. END Init;
  149. BEGIN
  150. Init;
  151. Trace.String("Glue loaded"); Trace.Ln;
  152. END Glue.
  153. SystemTools.FreeDownTo FoxIntermediateBackend ~
  154. SystemTools.DoCommands
  155. Compiler.Compile -b=AMD --objectFile=Generic --newObjectFile --traceModule=Trace --symbolFile=Textual --objectFileExtension=.GofU --symbolFileExtension=.SymU
  156. Runtime.Mod Trace.Mod Linux.I386.Glue.Mod Generic.Linux.I386.Unix.Mod Generic.Unix.I386.Machine.Mod Heaps.Mod Generic.Modules.Mod Unix.Objects.Mod ~
  157. StaticLinker.Link --fileFormat=Raw --fileName=simple_elf --extension=.GofU --displacement=08048000H
  158. Runtime Trace Glue Unix Machine Heaps Modules ~
  159. ~
  160. FSTools.CloseFiles simple_elf ~
  161. # Release.Build --path="../obg/" Win32G ~
  162. # StaticLinker.Link --fileFormat=PE32 --fileName=A2.exe --extension=GofW --displacement=401000H --path="../obg/"
  163. Runtime Trace Kernel32 Machine Heaps Modules Objects Kernel KernelLog
  164. Streams Commands FIles WinFS Clock Dates Reals Strings Diagnostics
  165. BitSets StringPool ObjectFile GenericLinker Reflection GenericLoader BootConsole ~
  166. FoxGenericObjectFile.Show Machine.GofU ~