|  | #include <dlfcn.h> | 
|  | #include <stdio.h> | 
|  | #include <malloc.h> | 
|  |  | 
|  | int | 
|  | main (void) | 
|  | { | 
|  | #ifdef M_PERTURB | 
|  | mallopt (M_PERTURB, 0xaa); | 
|  | #endif | 
|  |  | 
|  | void *h; | 
|  | int (*fn) (int); | 
|  | h = dlopen ("unload4mod1.so", RTLD_LAZY); | 
|  | if (h == NULL) | 
|  | { | 
|  | puts ("1st dlopen failed"); | 
|  | return 1; | 
|  | } | 
|  | fn = dlsym (h, "foo"); | 
|  | if (fn == NULL) | 
|  | { | 
|  | puts ("dlsym failed"); | 
|  | return 1; | 
|  | } | 
|  | int n = fn (10); | 
|  | if (n != 28) | 
|  | { | 
|  | printf ("foo (10) returned %d != 28\n", n); | 
|  | return 1; | 
|  | } | 
|  | dlclose (h); | 
|  | h = dlopen ("unload4mod3.so", RTLD_LAZY); | 
|  | fn = dlsym (h, "mod3fn2"); | 
|  | if (fn == NULL) | 
|  | { | 
|  | puts ("second dlsym failed"); | 
|  | return 1; | 
|  | } | 
|  | n = fn (10); | 
|  | if (n != 22) | 
|  | { | 
|  | printf ("mod3fn2 (10) returned %d != 22\n", n); | 
|  | return 1; | 
|  | } | 
|  | dlclose (h); | 
|  | return 0; | 
|  | } |