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