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