#include #include #include #include #include #include #include int main (void) { void *a; void *b; void *c; void *d; char *wd; char *base; char *buf; mtrace (); /* Change to the binary directory. */ if (chdir (OBJDIR) != 0) { printf ("cannot change to `%s': %m", OBJDIR); exit (EXIT_FAILURE); } wd = getcwd (NULL, 0); base = basename (wd); buf = alloca (strlen (wd) + strlen (base) + 5 + sizeof "testobj1.so"); printf ("loading `%s'\n", "./testobj1.so"); a = dlopen ("./testobj1.so", RTLD_NOW); if (a == NULL) { printf ("cannot load `./testobj1.so': %s\n", dlerror ()); exit (EXIT_FAILURE); } stpcpy (stpcpy (stpcpy (buf, "../"), base), "/testobj1.so"); printf ("loading `%s'\n", buf); b = dlopen (buf, RTLD_NOW); if (b == NULL) { printf ("cannot load `%s': %s\n", buf, dlerror ()); exit (EXIT_FAILURE); } stpcpy (stpcpy (buf, wd), "/testobj1.so"); printf ("loading `%s'\n", buf); c = dlopen (buf, RTLD_NOW); if (c == NULL) { printf ("cannot load `%s': %s\n", buf, dlerror ()); exit (EXIT_FAILURE); } stpcpy (stpcpy (stpcpy (stpcpy (buf, wd), "/../"), base), "/testobj1.so"); printf ("loading `%s'\n", buf); d = dlopen (buf, RTLD_NOW); if (d == NULL) { printf ("cannot load `%s': %s\n", buf, dlerror ()); exit (EXIT_FAILURE); } if (a != b || b != c || c != d) { puts ("shared object loaded more than once"); exit (EXIT_FAILURE); } if (dlclose (a) != 0) { puts ("closing `a' failed"); exit (EXIT_FAILURE); } if (dlclose (b) != 0) { puts ("closing `a' failed"); exit (EXIT_FAILURE); } if (dlclose (c) != 0) { puts ("closing `a' failed"); exit (EXIT_FAILURE); } if (dlclose (d) != 0) { puts ("closing `a' failed"); exit (EXIT_FAILURE); } free (wd); return 0; } extern int foo (int a); int foo (int a) { return a; }