Linux.I386.ElfHeader.Mod 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. (* Minimal ELF header for self contained linux Oberon programs *)
  2. (* Copyright (c) Felix Friedrich, ETH Zürich *)
  3. (* Extracted in parts from Florian Negele's Eigen Compiler Suite *)
  4. MODULE ElfHeader;
  5. IMPORT SYSTEM, Trace;
  6. VAR
  7. empty-: RECORD END; (* empty variable linked to end of kernel *)
  8. dlsym- : PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS): ADDRESS;
  9. dlopen- : PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
  10. dlclose- : PROCEDURE {C} ( handle: ADDRESS );
  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 @empty - base; segment size (file)
  36. DD @empty - 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 13H ; interpreter name length
  45. DD 13H ; 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 40H ; size of dynamic section
  54. DD 40H ; 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, stringtable-dlsymrelocation ; size (relocationtable)
  62. DD 09H, 0CH
  63. DD 0AH, endstringtable - stringtable; size (stringtable)
  64. DD 0BH, 10H
  65. DD 01H, libname - stringtable; position of libname
  66. DD 0H, 0H ; sentinel
  67. dlsymrelocation:
  68. DD @dlsym
  69. DB 01H
  70. DB 01H, 00H, 00H; index of the symbol
  71. DD 0H
  72. stringtable:
  73. DB 0H ; sentinel
  74. libname:
  75. DB 'libdl.so.2', 0
  76. dlsymname:
  77. DB 'dlsym', 0
  78. endstringtable:
  79. ALIGN 4
  80. symboltablebegin:
  81. DD 0;
  82. DD 0
  83. DD 0
  84. DB 0
  85. DB 0
  86. DW 0
  87. ; dlsym symbol
  88. DD dlsymname - stringtable; position of dlsymname
  89. DD 0
  90. DD 0
  91. DB 12H
  92. DB 0
  93. DW 0
  94. interpretername:
  95. DB '/lib/ld-linux.so.2', 0
  96. ALIGN 4
  97. entry:
  98. END EntryPoint;
  99. PROCEDURE {NOPAF} putc*(file: ADDRESS; c: CHAR);
  100. CODE
  101. PUSH ECX
  102. MOV EAX, 4
  103. MOV EBX, [ESP + 12]
  104. LEA ECX, [ESP+8]
  105. MOV EDX, 1
  106. INT 80H
  107. POP ECX
  108. JNE fail
  109. MOV EAX, [ESP + 4]
  110. RET
  111. fail:
  112. MOV EAX, -1
  113. RET
  114. END putc;
  115. PROCEDURE Dlsym*(handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS);
  116. VAR val: ADDRESS;
  117. BEGIN
  118. val := dlsym(handle, ADDRESS OF name[0]);
  119. SYSTEM.PUT32(adr, val);
  120. END Dlsym;
  121. PROCEDURE Char(c: CHAR);
  122. BEGIN
  123. putc(1, c);
  124. END Char;
  125. PROCEDURE Init;
  126. BEGIN
  127. Trace.Char := Char;
  128. Dlsym(0,"dlopen", ADDRESS OF dlopen);
  129. ASSERT(dlopen # NIL);
  130. Dlsym( 0, "dlclose", ADDRESS OF dlclose);
  131. ASSERT(dlclose # NIL);
  132. END Init;
  133. BEGIN
  134. Init;
  135. Trace.String("ElfHeader loaded");
  136. END ElfHeader.
  137. SystemTools.DoCommands
  138. Compiler.Compile -b=AMD --objectFile=Generic --symbolFile=Textual --objectFileExtension=.GofU --symbolFileExtension=.SymU
  139. Runtime.Mod Trace.Mod Linux.I386.ElfHeader.Mod ~
  140. StaticLinker.Link --fileFormat=Raw --fileName=simple_elf --extension=.GofU --displacement=08048000H
  141. Runtime Trace ElfHeader
  142. ~