(root)/
gcc-13.2.0/
libphobos/
testsuite/
libphobos.shared/
loadDR.c
       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 (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  }