#include #include #include #include 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; }