1 1.1 mrg #include <stdlib.h> 2 1.1 mrg #include <string.h> 3 1.1 mrg #include <dlfcn.h> 4 1.1 mrg #include <assert.h> 5 1.1 mrg 6 1.1 mrg int main(int argc, char* argv[]) 7 1.1 mrg { 8 1.1 mrg #if defined(__FreeBSD__) 9 1.1 mrg // workaround for Bugzilla 14824 10 1.1 mrg void *druntime = dlopen(argv[1], RTLD_LAZY); // load druntime 11 1.1 mrg assert(druntime); 12 1.1 mrg #endif 13 1.1.1.2 mrg #if defined(__DragonFly__) 14 1.1.1.2 mrg // workaround for Bugzilla 14824 15 1.1.1.2 mrg void *druntime = dlopen(argv[1], RTLD_LAZY); // load druntime 16 1.1.1.2 mrg assert(druntime); 17 1.1.1.2 mrg #endif 18 1.1 mrg 19 1.1 mrg const size_t pathlen = strrchr(argv[0], '/') - argv[0] + 1; 20 1.1 mrg char *name = malloc(pathlen + sizeof("plugin1.so")); 21 1.1 mrg memcpy(name, argv[0], pathlen); 22 1.1 mrg memcpy(name+pathlen, "plugin1.so", sizeof("plugin1.so")); 23 1.1 mrg 24 1.1 mrg void* plugin1 = dlopen(name, RTLD_LAZY); 25 1.1 mrg name[pathlen + sizeof("plugin1.so") - 5] = '2'; 26 1.1 mrg void* plugin2 = dlopen(name, RTLD_LAZY); 27 1.1 mrg 28 1.1 mrg int (*plugin1_init)() = dlsym(plugin1, "plugin_init"); 29 1.1 mrg int (*plugin1_term)() = dlsym(plugin1, "plugin_term"); 30 1.1 mrg int (*runTests1)() = dlsym(plugin1, "runTests"); 31 1.1 mrg int (*plugin2_init)() = dlsym(plugin2, "plugin_init"); 32 1.1 mrg int (*plugin2_term)() = dlsym(plugin2, "plugin_term"); 33 1.1 mrg int (*runTests2)() = dlsym(plugin2, "runTests"); 34 1.1 mrg assert(plugin1_init()); 35 1.1 mrg assert(runTests1()); 36 1.1 mrg assert(plugin2_init()); 37 1.1 mrg assert(runTests2()); 38 1.1 mrg 39 1.1 mrg assert(plugin1_term()); 40 1.1 mrg assert(dlclose(plugin1) == 0); 41 1.1 mrg assert(runTests2()); 42 1.1 mrg 43 1.1 mrg name[pathlen + sizeof("plugin1.so") - 5] = '1'; 44 1.1 mrg plugin1 = dlopen(name, RTLD_LAZY); 45 1.1 mrg plugin1_init = dlsym(plugin1, "plugin_init"); 46 1.1 mrg plugin1_term = dlsym(plugin1, "plugin_term"); 47 1.1 mrg runTests1 = dlsym(plugin1, "runTests"); 48 1.1 mrg assert(plugin1_init()); 49 1.1 mrg assert(runTests1()); 50 1.1 mrg assert(runTests2()); 51 1.1 mrg 52 1.1 mrg assert(plugin2_term()); 53 1.1 mrg assert(dlclose(plugin2) == 0); 54 1.1 mrg assert(runTests1()); 55 1.1 mrg 56 1.1 mrg assert(plugin1_term()); 57 1.1 mrg assert(dlclose(plugin1) == 0); 58 1.1 mrg 59 1.1 mrg free(name); 60 1.1 mrg 61 1.1 mrg #if defined(__FreeBSD__) 62 1.1 mrg dlclose(druntime); 63 1.1 mrg #endif 64 1.1.1.2 mrg #if defined(__DragonFly__) 65 1.1.1.2 mrg dlclose(druntime); 66 1.1.1.2 mrg #endif 67 1.1 mrg return EXIT_SUCCESS; 68 1.1 mrg } 69