| 1 | module dl |
| 2 | |
| 3 | pub const version = 1 |
| 4 | |
| 5 | pub const dl_ext = get_shared_library_extension() |
| 6 | |
| 7 | pub const rtld_next = voidptr(-1) |
| 8 | |
| 9 | // get_shared_library_extension returns the platform dependent shared library extension |
| 10 | // i.e. .dll on windows, .so on most unixes, .dylib on macos. |
| 11 | @[inline] |
| 12 | pub fn get_shared_library_extension() string { |
| 13 | return $if windows { |
| 14 | '.dll' |
| 15 | } $else $if macos { |
| 16 | '.dylib' |
| 17 | } $else { |
| 18 | '.so' |
| 19 | } |
| 20 | } |
| 21 | |
| 22 | // get_libname returns a library name with the operating system specific extension for |
| 23 | // shared libraries. |
| 24 | @[inline] |
| 25 | pub fn get_libname(libname string) string { |
| 26 | return '${libname}${dl_ext}' |
| 27 | } |
| 28 | |
| 29 | // open_opt tries to load a given dynamic shared object. |
| 30 | pub fn open_opt(filename string, flags int) !voidptr { |
| 31 | shared_object_handle := open(filename, flags) |
| 32 | if shared_object_handle == 0 { |
| 33 | e := dlerror() |
| 34 | return error(e) |
| 35 | } |
| 36 | return shared_object_handle |
| 37 | } |
| 38 | |
| 39 | // sym_opt returns the address of a symbol in a given shared object, if found. |
| 40 | // Unlike sym, sym_opt returns an option. |
| 41 | pub fn sym_opt(shared_object_handle voidptr, symbol string) !voidptr { |
| 42 | sym_handle := sym(shared_object_handle, symbol) |
| 43 | if sym_handle == 0 { |
| 44 | e := dlerror() |
| 45 | return error(e) |
| 46 | } |
| 47 | return sym_handle |
| 48 | } |
| 49 | |