| #include <dlfcn.h> |
| #include <mcheck.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| int |
| main (void) |
| { |
| void *h[2]; |
| int fail; |
| int (*fp) (void); |
| |
| mtrace (); |
| |
| h[0] = dlopen ("ltglobmod1.so", RTLD_LAZY); |
| if (h[0] == NULL) |
| { |
| printf ("%s: cannot open %s: %s", |
| __FUNCTION__, "ltglobmod1.so", dlerror ()); |
| exit (EXIT_FAILURE); |
| } |
| h[1] = dlopen ("ltglobmod2.so", RTLD_LAZY); |
| if (h[1] == NULL) |
| { |
| printf ("%s: cannot open %s: %s", |
| __FUNCTION__, "ltglobmod2.so", dlerror ()); |
| exit (EXIT_FAILURE); |
| } |
| |
| puts ("loaded \"ltglobmod1.so\" without RTLD_GLOBAL"); |
| |
| fp = dlsym (h[1], "foo"); |
| if (fp == NULL) |
| { |
| printf ("cannot get address of `foo': %s", dlerror ()); |
| exit (EXIT_FAILURE); |
| } |
| |
| fail = fp (); |
| |
| puts ("back in main"); |
| |
| dlclose (h[1]); |
| dlclose (h[0]); |
| |
| return fail; |
| } |