| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- (*
- BSD 2-Clause License
- Copyright (c) 2019-2021, 2023, Anton Krotov
- All rights reserved.
- *)
- MODULE API;
- IMPORT SYSTEM;
- CONST
- OS* = "LINUX";
- eol* = 0AX;
- BIT_DEPTH* = (ORD(LSL(1, 31) > 0) + 1) * 32;
- RTLD_LAZY = 1;
- TYPE
- SOFINI = PROCEDURE;
- VAR
- MainParam*, libc*: INTEGER;
- dlopen* : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER;
- dlsym* : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER;
- exit*,
- exit_thread* : PROCEDURE [linux] (code: INTEGER);
- puts : PROCEDURE [linux] (pStr: INTEGER);
- malloc : PROCEDURE [linux] (size: INTEGER): INTEGER;
- free : PROCEDURE [linux] (ptr: INTEGER);
- fini: SOFINI;
- PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
- BEGIN
- puts(lpCaption);
- puts(lpText)
- END DebugMsg;
- PROCEDURE _NEW* (size: INTEGER): INTEGER;
- VAR
- res, ptr, words: INTEGER;
- BEGIN
- res := malloc(size);
- IF res # 0 THEN
- ptr := res;
- words := size DIV SYSTEM.SIZE(INTEGER);
- WHILE words > 0 DO
- SYSTEM.PUT(ptr, 0);
- INC(ptr, SYSTEM.SIZE(INTEGER));
- DEC(words)
- END
- END
- RETURN res
- END _NEW;
- PROCEDURE _DISPOSE* (p: INTEGER): INTEGER;
- BEGIN
- free(p)
- RETURN 0
- END _DISPOSE;
- PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
- VAR
- sym: INTEGER;
- BEGIN
- sym := dlsym(lib, SYSTEM.ADR(name[0]));
- ASSERT(sym # 0);
- SYSTEM.PUT(VarAdr, sym)
- END GetSym;
- PROCEDURE init* (sp, code: INTEGER);
- BEGIN
- fini := NIL;
- SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen);
- SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER), dlsym);
- MainParam := sp;
- libc := dlopen(SYSTEM.SADR("libc.so.6"), RTLD_LAZY);
- GetSym(libc, "exit", SYSTEM.ADR(exit_thread));
- exit := exit_thread;
- GetSym(libc, "puts", SYSTEM.ADR(puts));
- GetSym(libc, "malloc", SYSTEM.ADR(malloc));
- GetSym(libc, "free", SYSTEM.ADR(free));
- END init;
- PROCEDURE dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER;
- RETURN 0
- END dllentry;
- PROCEDURE sofinit*;
- BEGIN
- IF fini # NIL THEN
- fini
- END
- END sofinit;
- PROCEDURE SetFini* (ProcFini: SOFINI);
- BEGIN
- fini := ProcFini
- END SetFini;
- END API.
|