aboutsummaryrefslogtreecommitdiff
path: root/core/dynlib/lib_unix.odin
blob: fb0270ea3f57485bf46727c33cf545d0c4abdfa5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//+build linux, darwin, freebsd, openbsd, netbsd
//+private
package dynlib

import "core:os"

_load_library :: proc(path: string, global_symbols := false) -> (Library, bool) {
	flags := os.RTLD_NOW
	if global_symbols {
		flags |= os.RTLD_GLOBAL
	}
	lib := os.dlopen(path, flags)
	return Library(lib), lib != nil
}

_unload_library :: proc(library: Library) -> bool {
	return os.dlclose(rawptr(library))
}

_symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found: bool) {
	ptr = os.dlsym(rawptr(library), symbol)
	found = ptr != nil
	return
}

_last_error :: proc() -> string {
	err := os.dlerror()
	return "unknown" if err == "" else err
}