core/dynlib
dynlib
Types
1Constants
2LIBRARY_FILE_EXTENSION
LIBRARY_FILE_EXTENSION :: _LIBRARY_FILE_EXTENSIONSourceThe file extension for dynamic libraries on the target OS.
_LIBRARY_FILE_EXTENSION
_LIBRARY_FILE_EXTENSION :: "so"SourceProcedures
9_last_error
_last_error :: proc() -> (string)Source_load_library
_load_library :: proc(path: string, global_symbols: bool, allocator: runtime.Allocator) -> (bool, Library)Source_symbol_address
_symbol_address :: proc(library: Library, symbol: string, allocator: runtime.Allocator) -> (ptr: rawptr, found: bool)Source_unload_library
_unload_library :: proc(library: Library) -> (bool)Sourceinitialize_symbols
initialize_symbols :: proc(symbol_table: ^T, library_path: string, symbol_prefix: untyped string = "", handle_field_name: untyped string = "__handle") -> (count: int, ok: bool)SourceScans a dynamic library for symbols matching a struct's members, assigning found procedure pointers to the corresponding entry. Optionally takes a symbol prefix added to the struct's member name to construct the symbol looked up in the library. Optionally also takes the struct member to assign the library handle to, __handle by default.
This allows using one struct to hold library handles and symbol pointers for more than 1 dynamic library.
Loading the same library twice unloads the previous incarnation, allowing for straightforward hot reload support.
Returns: -1, false if the library could not be loaded. The number of symbols assigned on success. ok = true if count > 0
See doc.odin for an example.
last_error
last_error :: proc() -> (string)SourceReturns an error message for the last failed procedure call.
load_library
load_library :: proc(path: string, global_symbols: untyped boolean = false, allocator = context.temp_allocator) -> (library: Library, did_load: bool)SourceLoads 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 parameter 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. Also temporarily needs an allocator to convert a string.
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 {
fmt.eprintln(dynlib.last_error())
return
}
fmt.println("The library %q was successfully loaded", LIBRARY_PATH)
}symbol_address
symbol_address :: proc(library: Library, symbol: string, allocator = context.temp_allocator) -> (ptr: rawptr, found: bool)SourceLoads 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. Also temporarily needs an allocator to convert a string.
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 {
fmt.eprintln(dynlib.last_error())
return
}
a, found_a := dynlib.symbol_address(library, "a")
if found_a {
fmt.printf("The symbol %q was found at the address %v", "a", a)
} else {
fmt.eprintln(dynlib.last_error())
}
}unload_library
unload_library :: proc(library: Library) -> (did_unload: bool)SourceUnloads 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 {
fmt.eprintln(dynlib.last_error())
return
}
did_unload := dynlib.unload_library(library)
if ! did_unload {
fmt.eprintln(dynlib.last_error())
return
}
fmt.println("The library %q was successfully unloaded", LIBRARY_PATH)
}