|
@@ -2,28 +2,38 @@
|
|
|
#+private
|
|
|
package dynlib
|
|
|
|
|
|
-import "core:os"
|
|
|
+import "base:runtime"
|
|
|
|
|
|
-_load_library :: proc(path: string, global_symbols := false) -> (Library, bool) {
|
|
|
- flags := os.RTLD_NOW
|
|
|
+import "core:strings"
|
|
|
+import "core:sys/posix"
|
|
|
+
|
|
|
+_load_library :: proc(path: string, global_symbols: bool, allocator: runtime.Allocator) -> (Library, bool) {
|
|
|
+ flags := posix.RTLD_Flags{.NOW}
|
|
|
if global_symbols {
|
|
|
- flags |= os.RTLD_GLOBAL
|
|
|
+ flags += {.GLOBAL}
|
|
|
}
|
|
|
- lib := os.dlopen(path, flags)
|
|
|
+
|
|
|
+ cpath := strings.clone_to_cstring(path, allocator)
|
|
|
+ defer delete(cpath, allocator)
|
|
|
+
|
|
|
+ lib := posix.dlopen(cpath, flags)
|
|
|
return Library(lib), lib != nil
|
|
|
}
|
|
|
|
|
|
_unload_library :: proc(library: Library) -> bool {
|
|
|
- return os.dlclose(rawptr(library))
|
|
|
+ return posix.dlclose(posix.Symbol_Table(library)) == 0
|
|
|
}
|
|
|
|
|
|
-_symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found: bool) {
|
|
|
- ptr = os.dlsym(rawptr(library), symbol)
|
|
|
+_symbol_address :: proc(library: Library, symbol: string, allocator: runtime.Allocator) -> (ptr: rawptr, found: bool) {
|
|
|
+ csymbol := strings.clone_to_cstring(symbol, allocator)
|
|
|
+ defer delete(csymbol, allocator)
|
|
|
+
|
|
|
+ ptr = posix.dlsym(posix.Symbol_Table(library), csymbol)
|
|
|
found = ptr != nil
|
|
|
return
|
|
|
}
|
|
|
|
|
|
_last_error :: proc() -> string {
|
|
|
- err := os.dlerror()
|
|
|
+ err := string(posix.dlerror())
|
|
|
return "unknown" if err == "" else err
|
|
|
-}
|
|
|
+}
|