40 lines
1.0 KiB
C
40 lines
1.0 KiB
C
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <dlfcn.h>
|
||
|
#include <assert.h>
|
||
|
|
||
|
int main(int argc, char* argv[])
|
||
|
{
|
||
|
if (argc != 2)
|
||
|
return EXIT_FAILURE;
|
||
|
void *h = dlopen(argv[1], RTLD_LAZY); // load druntime
|
||
|
assert(h != NULL);
|
||
|
|
||
|
int (*rt_init)(void) = dlsym(h, "rt_init");
|
||
|
int (*rt_term)(void) = dlsym(h, "rt_term");
|
||
|
void* (*rt_loadLibrary)(const char*) = dlsym(h, "rt_loadLibrary");
|
||
|
int (*rt_unloadLibrary)(void*) = dlsym(h, "rt_unloadLibrary");
|
||
|
|
||
|
int res = EXIT_FAILURE;
|
||
|
if (!rt_init()) goto Lexit;
|
||
|
|
||
|
const size_t pathlen = strrchr(argv[0], '/') - argv[0] + 1;
|
||
|
char *name = malloc(pathlen + sizeof("lib.so"));
|
||
|
memcpy(name, argv[0], pathlen);
|
||
|
memcpy(name+pathlen, "lib.so", sizeof("lib.so"));
|
||
|
|
||
|
void *dlib = rt_loadLibrary(name);
|
||
|
free(name);
|
||
|
assert(dlib);
|
||
|
|
||
|
int (*runTests)(void) = dlsym(dlib, "runTests");
|
||
|
assert(runTests());
|
||
|
assert(rt_unloadLibrary(dlib));
|
||
|
|
||
|
if (rt_term()) res = EXIT_SUCCESS;
|
||
|
|
||
|
Lexit:
|
||
|
assert(dlclose(h) == 0);
|
||
|
return res;
|
||
|
}
|