#include <dlfcn.h> #include <stdio.h> int main (void) { void *g = dlopen ("unload3mod1.so", RTLD_GLOBAL | RTLD_NOW); void *h = dlopen ("unload3mod2.so", RTLD_GLOBAL | RTLD_NOW); if (g == NULL || h == NULL) { printf ("dlopen unload3mod{1,2}.so failed: %p %p\n", g, h); return 1; } dlopen ("unload3mod4.so", RTLD_GLOBAL | RTLD_NOW); dlclose (h); dlclose (g); g = dlopen ("unload3mod3.so", RTLD_GLOBAL | RTLD_NOW); h = dlopen ("unload3mod4.so", RTLD_GLOBAL | RTLD_NOW); if (g == NULL || h == NULL) { printf ("dlopen unload3mod{3,4}.so failed: %p %p\n", g, h); return 1; } int (*fn) (int); fn = dlsym (h, "bar"); if (fn == NULL) { puts ("dlsym failed"); return 1; } int val = fn (16); if (val != 24) { printf ("bar returned %d != 24\n", val); return 1; } return 0; }