1*627f7eb2Smrg #include <stdlib.h>
2*627f7eb2Smrg #include <string.h>
3*627f7eb2Smrg #include <dlfcn.h>
4*627f7eb2Smrg #include <assert.h>
5*627f7eb2Smrg
main(int argc,char * argv[])6*627f7eb2Smrg int main(int argc, char* argv[])
7*627f7eb2Smrg {
8*627f7eb2Smrg if (argc != 2)
9*627f7eb2Smrg return EXIT_FAILURE;
10*627f7eb2Smrg void *h = dlopen(argv[1], RTLD_LAZY); // load druntime
11*627f7eb2Smrg assert(h != NULL);
12*627f7eb2Smrg
13*627f7eb2Smrg int (*rt_init)(void) = dlsym(h, "rt_init");
14*627f7eb2Smrg int (*rt_term)(void) = dlsym(h, "rt_term");
15*627f7eb2Smrg void* (*rt_loadLibrary)(const char*) = dlsym(h, "rt_loadLibrary");
16*627f7eb2Smrg int (*rt_unloadLibrary)(void*) = dlsym(h, "rt_unloadLibrary");
17*627f7eb2Smrg
18*627f7eb2Smrg int res = EXIT_FAILURE;
19*627f7eb2Smrg if (!rt_init()) goto Lexit;
20*627f7eb2Smrg
21*627f7eb2Smrg const size_t pathlen = strrchr(argv[0], '/') - argv[0] + 1;
22*627f7eb2Smrg char *name = malloc(pathlen + sizeof("lib.so"));
23*627f7eb2Smrg memcpy(name, argv[0], pathlen);
24*627f7eb2Smrg memcpy(name+pathlen, "lib.so", sizeof("lib.so"));
25*627f7eb2Smrg
26*627f7eb2Smrg void *dlib = rt_loadLibrary(name);
27*627f7eb2Smrg free(name);
28*627f7eb2Smrg assert(dlib);
29*627f7eb2Smrg
30*627f7eb2Smrg int (*runTests)(void) = dlsym(dlib, "runTests");
31*627f7eb2Smrg assert(runTests());
32*627f7eb2Smrg assert(rt_unloadLibrary(dlib));
33*627f7eb2Smrg
34*627f7eb2Smrg if (rt_term()) res = EXIT_SUCCESS;
35*627f7eb2Smrg
36*627f7eb2Smrg Lexit:
37*627f7eb2Smrg assert(dlclose(h) == 0);
38*627f7eb2Smrg return res;
39*627f7eb2Smrg }
40