core/dynlib

dynlib

Types

1

Constants

2

Procedures

9

initialize_symbols

initialize_symbols :: proc(symbol_table: ^T, library_path: string, symbol_prefix: untyped string = "", handle_field_name: untyped string = "__handle") -> (count: int, ok: bool)Source

Scans 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.

See doc.odin for an example.

load_library

load_library :: proc(path: string, global_symbols: untyped boolean = false, allocator = context.temp_allocator) -> (library: Library, did_load: bool)Source

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 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)Source

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. 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)Source

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 {
		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)
}

Reference search

Find anything

Documentation preferences

Settings

System theme variants

Used only while Theme is set to System.