Libdl.ob07 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2019, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE Libdl;
  7. IMPORT SYSTEM, API;
  8. CONST
  9. LAZY* = 1;
  10. NOW* = 2;
  11. BINDING_MASK* = 3;
  12. NOLOAD* = 4;
  13. LOCAL* = 0;
  14. GLOBAL* = 256;
  15. NODELETE* = 4096;
  16. VAR
  17. _close: PROCEDURE [linux] (handle: INTEGER): INTEGER;
  18. _error: PROCEDURE [linux] (): INTEGER;
  19. PROCEDURE open* (file: ARRAY OF CHAR; mode: INTEGER): INTEGER;
  20. RETURN API.dlopen(SYSTEM.ADR(file[0]), mode)
  21. END open;
  22. PROCEDURE sym* (handle: INTEGER; name: ARRAY OF CHAR): INTEGER;
  23. RETURN API.dlsym(handle, SYSTEM.ADR(name[0]))
  24. END sym;
  25. PROCEDURE close* (handle: INTEGER): INTEGER;
  26. RETURN _close(handle)
  27. END close;
  28. PROCEDURE error* (): INTEGER;
  29. RETURN _error()
  30. END error;
  31. PROCEDURE init;
  32. VAR
  33. lib: INTEGER;
  34. BEGIN
  35. lib := open("libdl.so.2", LAZY);
  36. SYSTEM.PUT(SYSTEM.ADR(_close), sym(lib, "dlclose"));
  37. ASSERT(_close # NIL);
  38. SYSTEM.PUT(SYSTEM.ADR(_error), sym(lib, "dlerror"));
  39. ASSERT(_error # NIL)
  40. END init;
  41. BEGIN
  42. init
  43. END Libdl.