#include <dlfcn.h> #include <mcheck.h> #include <stdio.h> #include <stdlib.h> int main (void) { void *h1; void *h2; int (*fp) (void); mtrace (); /* Open the two objects. */ h1 = dlopen ("reldepmod5.so", RTLD_LAZY); if (h1 == NULL) { printf ("cannot open reldepmod5.so: %s\n", dlerror ()); exit (1); } h2 = dlopen ("reldepmod6.so", RTLD_LAZY); if (h2 == NULL) { printf ("cannot open reldepmod6.so: %s\n", dlerror ()); exit (1); } /* Get the address of the variable in reldepmod1.so. */ fp = dlsym (h2, "bar"); if (fp == NULL) { printf ("cannot get address of \"bar\": %s\n", dlerror ()); exit (1); } /* Call the function. */ puts ("calling fp for the first time"); if (fp () != 0) { puts ("function \"call_me\" returned wrong result"); exit (1); } /* Now close the first object. It must still be around since we have an implicit dependency. */ if (dlclose (h1) != 0) { printf ("closing h1 failed: %s\n", dlerror ()); exit (1); } /* Calling the function must still work. */ puts ("calling fp for the second time"); if (fp () != 0) { puts ("function \"call_me\" the second time returned wrong result"); exit (1); } puts ("second call suceeded as well"); /* Close the second object, we are done. */ if (dlclose (h2) != 0) { printf ("closing h2 failed: %s\n", dlerror ()); exit (1); } return 0; }