diff --git a/vlib/dl/dl_nix.c.v b/vlib/dl/dl_nix.c.v new file mode 100644 index 0000000000..080fcdd436 --- /dev/null +++ b/vlib/dl/dl_nix.c.v @@ -0,0 +1,19 @@ +module dl + +#include + +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) +} diff --git a/vlib/dl/dl_test.v b/vlib/dl/dl_test.v new file mode 100644 index 0000000000..7451ed81f2 --- /dev/null +++ b/vlib/dl/dl_test.v @@ -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 +} diff --git a/vlib/dl/dl_windows.c.v b/vlib/dl/dl_windows.c.v new file mode 100644 index 0000000000..d602bd1257 --- /dev/null +++ b/vlib/dl/dl_windows.c.v @@ -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) +}