dl: add dynamic load module
parent
7bf8731778
commit
761fb930ce
|
@ -0,0 +1,19 @@
|
|||
module dl
|
||||
|
||||
#include <dlfcn.h>
|
||||
|
||||
fn C.dlopen(filename charptr, flags int) voidptr
|
||||
fn C.dlsym(handle voidptr, symbol charptr) voidptr
|
||||
|
||||
pub const (
|
||||
RTLD_NOW = C.RTLD_NOW
|
||||
DL_EXT = '.so'
|
||||
)
|
||||
|
||||
pub fn open(filename string, flags int) voidptr {
|
||||
return C.dlopen(filename.str, flags)
|
||||
}
|
||||
|
||||
pub fn sym(handle voidptr, symbol string) voidptr {
|
||||
return C.dlsym(handle, symbol.str)
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
import dl
|
||||
|
||||
fn test_dl() {
|
||||
$if linux {
|
||||
run_test_linux()
|
||||
return
|
||||
}
|
||||
$if windows {
|
||||
run_test_windows()
|
||||
return
|
||||
} $else {
|
||||
eprint('currently not implemented on this platform')
|
||||
}
|
||||
}
|
||||
|
||||
fn run_test_linux() {
|
||||
// ensure a not-existing dl won't be loaded
|
||||
h := dl.open('not-existing-dynamic-link-library', dl.RTLD_NOW)
|
||||
// println('handle = $h')
|
||||
assert h == 0
|
||||
}
|
||||
|
||||
fn run_test_windows() {
|
||||
// ensure a not-existing dl won't be loaded
|
||||
h := dl.open('not-existing-dynamic-link-library', dl.RTLD_NOW)
|
||||
// println('handle = $h')
|
||||
assert h == 0
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
module dl
|
||||
|
||||
pub const (
|
||||
RTLD_NOW = 0
|
||||
DL_EXT = '.dll'
|
||||
)
|
||||
|
||||
fn C.LoadLibraryA(libfilename byteptr) voidptr
|
||||
fn C.GetProcAddress(handle voidptr, procname byteptr) voidptr
|
||||
|
||||
pub fn open(filename string, flags int) voidptr {
|
||||
res := C.LoadLibraryA(filename.str)
|
||||
return res
|
||||
}
|
||||
|
||||
pub fn sym(handle voidptr, symbol string) voidptr {
|
||||
return C.GetProcAddress(handle, symbol.str)
|
||||
}
|
Loading…
Reference in New Issue