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