123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- (* Minimal ELF header for self contained linux Oberon programs *)
- (* Copyright (c) Felix Friedrich, ETH Zürich *)
- MODULE Glue;
- IMPORT SYSTEM, Trace;
- CONST
- base = 08048000H;
- debug* = {0};
- VAR
- last-: RECORD END; (* empty variable linked to end of kernel *)
-
- dlsym- : PROCEDURE {C} ( handle: ADDRESS; name: ADDRESS): ADDRESS;
- dlopen- : PROCEDURE {C} ( pathname: ADDRESS; mode: LONGINT ): ADDRESS;
- dlclose- : PROCEDURE {C} ( handle: ADDRESS );
- exit- : PROCEDURE {C} (status: LONGINT);
- PROCEDURE {INITIAL, NOPAF} EntryPoint;
- CODE
- ; ELF header
- DB 07FH, 'ELF', 1, 1, 1, 0
- DD 0, 0
- DW 02, 03
- DD 01
- DD entry + base; program entry point
- DD elfheadersize
- DD 0
- DD 0
- DW elfheadersize
- DW 20H
- DW 3 ; #program header table entries
- DW 0
- DW 0
- DW 0
- elfheadersize:
- ; program header
- DD 1
- DD 0
- DD base;
- DD base;
- DD @last - base; segment size (file)
- DD @last - base; segment size (memory)
- DD 07
- DD 1000H; alignment
-
- ; interpreter header
- DD 3
- DD interpretername; interpreter name offset
- DD interpretername + base; interpreter name
- DD interpretername + base; interpreter name
- DD interpretername_end - interpretername ; interpreter name length
- DD interpretername_end - interpretername ; interpreter name length
- DD 4H
- DD 1H
- ; dynamic header
- DD 02H
- DD dynamicsection
- DD dynamicsection + base
- DD dynamicsection + base
- DD dynamicsection_end - dynamicsection ; size of dynamic section
- DD dynamicsection_end - dynamicsection ; size of dynamic section
- DD 06H
- DD 04H
- dynamicsection:
- DD 05H, base + stringtable
- DD 06H, symboltablebegin + base
- DD 07H, dlsymrelocation + base
- DD 08H, dlsymrelocation_end-dlsymrelocation ; size (relocationtable)
- DD 09H, 0CH
- DD 0AH, stringtable_end - stringtable; size (stringtable)
- DD 0BH, 10H
-
- DD 01H, libname - stringtable; position of libname
- DD 0H, 0H ; sentinel
- dynamicsection_end:
-
- dlsymrelocation:
- DD @dlsym
- DB 01H
- DB 01H, 00H, 00H; index of the symbol
- DD 0H
- dlsymrelocation_end:
- stringtable:
- DB 0H ; sentinel
- libname:
- DB 'libdl.so.2', 0
-
- dlsymname:
- DB 'dlsym', 0
-
-
- stringtable_end:
-
- ALIGN 4
- symboltablebegin:
- DD 0;
- DD 0
- DD 0
- DB 0
- DB 0
- DW 0
-
- ; dlsym symbol
- DD dlsymname - stringtable; position of dlsymname
- DD 0
- DD 0
- DB 12H ; info: global + function
- DB 0
- DW 0
- interpretername:
- DB '/lib/ld-linux.so.2', 0
- interpretername_end:
- ALIGN 4
- entry:
- END EntryPoint;
-
- PROCEDURE {FINAL} ExitPoint;
- BEGIN
- Trace.String("exiting"); Trace.Ln;
- exit(0);
- END ExitPoint;
- PROCEDURE {NOPAF} putc*(file: ADDRESS; c: CHAR);
- CODE
- PUSH ECX
- MOV EAX, 4
- MOV EBX, [ESP + 12]
- LEA ECX, [ESP+8]
- MOV EDX, 1
- INT 80H
- POP ECX
- JNE fail
- MOV EAX, [ESP + 4]
- RET
- fail:
- MOV EAX, -1
- RET
- END putc;
- PROCEDURE Dlsym*(handle: ADDRESS; CONST name: ARRAY OF CHAR; adr: ADDRESS);
- VAR val: ADDRESS;
- BEGIN
- val := dlsym(handle, ADDRESS OF name[0]);
- SYSTEM.PUT32(adr, val);
- END Dlsym;
- PROCEDURE Char(c: CHAR);
- BEGIN
- putc(1, c);
- END Char;
-
- PROCEDURE Init;
- BEGIN
- Trace.Char := Char;
- ASSERT(dlsym # NIL);
- Dlsym(0,"dlopen", ADDRESS OF dlopen);
- ASSERT(dlopen # NIL);
- Dlsym( 0, "dlclose", ADDRESS OF dlclose);
- ASSERT(dlclose # NIL);
- Dlsym(0,"exit", ADDRESS OF exit);
- ASSERT(exit # NIL);
-
- TRACE(ADDRESS OF last);
- TRACE(base);
- TRACE(ADDRESS OF last - base);
- END Init;
-
- BEGIN
- Init;
- Trace.String("Glue loaded"); Trace.Ln;
- END Glue.
- SystemTools.FreeDownTo FoxIntermediateBackend ~
- SystemTools.DoCommands
- Compiler.Compile -b=AMD --objectFile=Generic --newObjectFile --traceModule=Trace --symbolFile=Textual --objectFileExtension=.GofU --symbolFileExtension=.SymU
- 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 ~
- StaticLinker.Link --fileFormat=Raw --fileName=simple_elf --extension=.GofU --displacement=08048000H
- Runtime Trace Glue Unix Machine Heaps Modules ~
- ~
- FSTools.CloseFiles simple_elf ~
- # Release.Build --path="../obg/" Win32G ~
- # StaticLinker.Link --fileFormat=PE32 --fileName=A2.exe --extension=GofW --displacement=401000H --path="../obg/"
- Runtime Trace Kernel32 Machine Heaps Modules Objects Kernel KernelLog
- Streams Commands FIles WinFS Clock Dates Reals Strings Diagnostics
- BitSets StringPool ObjectFile GenericLinker Reflection GenericLoader BootConsole ~
- FoxGenericObjectFile.Show Machine.GofU ~
|