diff options
| author | Lucas Perlind <perlindluca@gmail.com> | 2023-03-02 18:28:29 +1100 |
|---|---|---|
| committer | Lucas Perlind <perlindluca@gmail.com> | 2023-03-02 19:20:45 +1100 |
| commit | bb72c804fb6256caf074f6e1c9aa1d42c231b4d6 (patch) | |
| tree | e0b8a068bed3796ac9bfac132766a9bb02f2f14f /core/dynlib | |
| parent | 162628000f8e14c18e442d27efcee784b5ab988a (diff) | |
Document core:dynlib
Diffstat (limited to 'core/dynlib')
| -rw-r--r-- | core/dynlib/doc.odin | 7 | ||||
| -rw-r--r-- | core/dynlib/lib.odin | 83 |
2 files changed, 88 insertions, 2 deletions
diff --git a/core/dynlib/doc.odin b/core/dynlib/doc.odin new file mode 100644 index 000000000..812fb02d5 --- /dev/null +++ b/core/dynlib/doc.odin @@ -0,0 +1,7 @@ +/* +Package core:dynlib implements loading of shared libraries/DLLs and their symbols. + +The behaviour of dynamically loaded libraries is specific to the target platform of the program. +For in depth detail on the underlying behaviour please refer to your target platform's documentation. +*/ +package dynlib diff --git a/core/dynlib/lib.odin b/core/dynlib/lib.odin index a6c857ee4..b5cb16e3c 100644 --- a/core/dynlib/lib.odin +++ b/core/dynlib/lib.odin @@ -1,15 +1,94 @@ package dynlib +/* +A handle to a dynamically loaded library. +*/ Library :: distinct rawptr -load_library :: proc(path: string, global_symbols := false) -> (Library, bool) { +/* +Loads a dynamic library from the filesystem. The paramater `global_symbols` makes the symbols in the loaded +library available to resolve references in subsequently loaded libraries. + +The paramater `global_symbols` is only used for the platforms `linux`, `darwin`, `freebsd` and `openbsd`. +On `windows` this paramater is ignored. + +The underlying behaviour is platform specific. +On `linux`, `darwin`, `freebsd` and `openbsd` refer to `dlopen`. +On `windows` refer to `LoadLibraryW`. + +**Implicit Allocators** +`context.temp_allocator` + +Example: + import "core:dynlib" + import "core:fmt" + + load_my_library :: proc() { + LIBRARY_PATH :: "my_library.dll" + library, ok := dynlib.load_library(LIBRARY_PATH) + if ! ok { + return + } + fmt.println("The library %q was successfully loaded", LIBRARY_PATH) + } +*/ +load_library :: proc(path: string, global_symbols := false) -> (library: Library, did_load: bool) { return _load_library(path, global_symbols) } -unload_library :: proc(library: Library) -> bool { +/* +Unloads a dynamic library. + +The underlying behaviour is platform specific. +On `linux`, `darwin`, `freebsd` and `openbsd` refer to `dlclose`. +On `windows` refer to `FreeLibrary`. + +Example: + import "core:dynlib" + import "core:fmt" + + load_then_unload_my_library :: proc() { + LIBRARY_PATH :: "my_library.dll" + library, ok := dynlib.load_library(LIBRARY_PATH) + if ! ok { + return + } + did_unload := dynlib.unload_library(library) + if ! did_unload { + return + } + fmt.println("The library %q was successfully unloaded", LIBRARY_PATH) + } +*/ +unload_library :: proc(library: Library) -> (did_unload: bool) { return _unload_library(library) } +/* +Loads the address of a procedure/variable from a dynamic library. + +The underlying behaviour is platform specific. +On `linux`, `darwin`, `freebsd` and `openbsd` refer to `dlsym`. +On `windows` refer to `GetProcAddress`. + +**Implicit Allocators** +`context.temp_allocator` + +Example: + import "core:dynlib" + import "core:fmt" + + find_a_in_my_library :: proc() { + LIBRARY_PATH :: "my_library.dll" + library, ok := dynlib.load_library(LIBRARY_PATH) + if ! ok { + return + } + + a, found_a := dynlib.symbol_address(library, "a") + if found_a do fmt.printf("The symbol %q was found at the address %v", "a", a) + } +*/ symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found: bool) #optional_ok { return _symbol_address(library, symbol) } |