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