(root)/
glibc-2.38/
elf/
unload5.c
       1  #include <dlfcn.h>
       2  #include <stdio.h>
       3  
       4  int
       5  main (void)
       6  {
       7    void *g = dlopen ("unload3mod1.so", RTLD_GLOBAL | RTLD_NOW);
       8    void *h = dlopen ("unload3mod2.so", RTLD_GLOBAL | RTLD_NOW);
       9    if (g == NULL || h == NULL)
      10      {
      11        printf ("dlopen unload3mod{1,2}.so failed: %p %p\n", g, h);
      12        return 1;
      13      }
      14    dlopen ("unload3mod4.so", RTLD_GLOBAL | RTLD_NOW);
      15    dlclose (h);
      16    dlclose (g);
      17  
      18    g = dlopen ("unload3mod3.so", RTLD_GLOBAL | RTLD_NOW);
      19    h = dlopen ("unload3mod4.so", RTLD_GLOBAL | RTLD_NOW);
      20    if (g == NULL || h == NULL)
      21      {
      22        printf ("dlopen unload3mod{3,4}.so failed: %p %p\n", g, h);
      23        return 1;
      24      }
      25  
      26    int (*fn) (int);
      27    fn = dlsym (h, "bar");
      28    if (fn == NULL)
      29      {
      30        puts ("dlsym failed");
      31        return 1;
      32      }
      33  
      34    int val = fn (16);
      35    if (val != 24)
      36      {
      37        printf ("bar returned %d != 24\n", val);
      38        return 1;
      39      }
      40  
      41    return 0;
      42  }