Linux.I386.ElfHeader.Mod 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. (* Minimal ELF header for self contained linux Oberon programs *)
  2. (* Copyright (c) Felix Friedrich, ETH Zürich *)
  3. MODULE ElfHeader;
  4. IMPORT SYSTEM, Trace;
  5. VAR
  6. last-: RECORD END; (* empty variable linked to end of kernel *)
  7. dlsym- : PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS): ADDRESS;
  8. dlopen- : PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
  9. dlclose- : PROCEDURE {C} ( handle: ADDRESS );
  10. exit- : PROCEDURE {C} (status: LONGINT);
  11. PROCEDURE {INITIAL, NOPAF} EntryPoint;
  12. CONST base = 08048000H;
  13. CODE
  14. ; ELF header
  15. DB 07FH, 'ELF', 1, 1, 1, 0
  16. DD 0, 0
  17. DW 02, 03
  18. DD 01
  19. DD entry + base; program entry point
  20. DD elfheadersize
  21. DD 0
  22. DD 0
  23. DW elfheadersize
  24. DW 20H
  25. DW 3 ; #program header table entries
  26. DW 0
  27. DW 0
  28. DW 0
  29. elfheadersize:
  30. ; program header
  31. DD 1
  32. DD 0
  33. DD base;
  34. DD base;
  35. DD @last - base; segment size (file)
  36. DD @last - base; segment size (memory)
  37. DD 07
  38. DD 1000H; alignment
  39. ; interpreter header
  40. DD 3
  41. DD interpretername; interpreter name offset
  42. DD interpretername + base; interpreter name
  43. DD interpretername + base; interpreter name
  44. DD interpretername_end - interpretername ; interpreter name length
  45. DD interpretername_end - interpretername ; interpreter name length
  46. DD 4H
  47. DD 1H
  48. ; dynamic header
  49. DD 02H
  50. DD dynamicsection
  51. DD dynamicsection + base
  52. DD dynamicsection + base
  53. DD dynamicsection_end - dynamicsection ; size of dynamic section
  54. DD dynamicsection_end - dynamicsection ; size of dynamic section
  55. DD 06H
  56. DD 04H
  57. dynamicsection:
  58. DD 05H, base + stringtable
  59. DD 06H, symboltablebegin + base
  60. DD 07H, dlsymrelocation + base
  61. DD 08H, dlsymrelocation_end-dlsymrelocation ; size (relocationtable)
  62. DD 09H, 0CH
  63. DD 0AH, stringtable_end - stringtable; size (stringtable)
  64. DD 0BH, 10H
  65. DD 01H, libname - stringtable; position of libname
  66. DD 0H, 0H ; sentinel
  67. dynamicsection_end:
  68. dlsymrelocation:
  69. DD @dlsym
  70. DB 01H
  71. DB 01H, 00H, 00H; index of the symbol
  72. DD 0H
  73. dlsymrelocation_end:
  74. stringtable:
  75. DB 0H ; sentinel
  76. libname:
  77. DB 'libdl.so.2', 0
  78. dlsymname:
  79. DB 'dlsym', 0
  80. stringtable_end:
  81. ALIGN 4
  82. symboltablebegin:
  83. DD 0;
  84. DD 0
  85. DD 0
  86. DB 0
  87. DB 0
  88. DW 0
  89. ; dlsym symbol
  90. DD dlsymname - stringtable; position of dlsymname
  91. DD 0
  92. DD 0
  93. DB 12H ; info: global + function
  94. DB 0
  95. DW 0
  96. interpretername:
  97. DB '/lib/ld-linux.so.2', 0
  98. interpretername_end:
  99. ALIGN 4
  100. entry:
  101. END EntryPoint;
  102. PROCEDURE {NOPAF} putc*(file: ADDRESS; c: CHAR);
  103. CODE
  104. PUSH ECX
  105. MOV EAX, 4
  106. MOV EBX, [ESP + 12]
  107. LEA ECX, [ESP+8]
  108. MOV EDX, 1
  109. INT 80H
  110. POP ECX
  111. JNE fail
  112. MOV EAX, [ESP + 4]
  113. RET
  114. fail:
  115. MOV EAX, -1
  116. RET
  117. END putc;
  118. PROCEDURE Dlsym*(handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS);
  119. VAR val: ADDRESS;
  120. BEGIN
  121. val := dlsym(handle, ADDRESS OF name[0]);
  122. SYSTEM.PUT32(adr, val);
  123. END Dlsym;
  124. PROCEDURE Char(c: CHAR);
  125. BEGIN
  126. putc(1, c);
  127. END Char;
  128. PROCEDURE Init;
  129. BEGIN
  130. Trace.Char := Char;
  131. ASSERT(dlsym # NIL);
  132. Dlsym(0,"dlopen", ADDRESS OF dlopen);
  133. ASSERT(dlopen # NIL);
  134. Dlsym( 0, "dlclose", ADDRESS OF dlclose);
  135. ASSERT(dlclose # NIL);
  136. Dlsym(0,"exit", ADDRESS OF exit);
  137. ASSERT(exit # NIL);
  138. END Init;
  139. PROCEDURE {FINAL} ExitPoint;
  140. BEGIN
  141. exit(0);
  142. END ExitPoint;
  143. BEGIN
  144. Init;
  145. Trace.String("ElfHeader loaded"); Trace.Ln;
  146. END ElfHeader.
  147. SystemTools.DoCommands
  148. Compiler.Compile -b=AMD --objectFile=Generic --symbolFile=Textual --objectFileExtension=.GofU --symbolFileExtension=.SymU
  149. Runtime.Mod Trace.Mod Linux.I386.ElfHeader.Mod ~
  150. StaticLinker.Link --fileFormat=Raw --fileName=simple_elf --extension=.GofU --displacement=08048000H
  151. Runtime Trace ElfHeader
  152. ~