dl: add dynamic load module

pull/4632/head
Sandro Martini 2020-04-28 11:53:55 +02:00 committed by GitHub
parent 7bf8731778
commit 761fb930ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 65 additions and 0 deletions

19
vlib/dl/dl_nix.c.v 100644
View File

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

28
vlib/dl/dl_test.v 100644
View File

@ -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
}

View File

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