1 #include <dlfcn.h>
2 #include <errno.h>
3 #include <mcheck.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8
9 int
main(void)10 main (void)
11 {
12 void *a;
13 void *b;
14 void *c;
15 void *d;
16 char *wd;
17 char *base;
18 char *buf;
19
20 mtrace ();
21
22 /* Change to the binary directory. */
23 if (chdir (OBJDIR) != 0)
24 {
25 printf ("cannot change to `%s': %m", OBJDIR);
26 exit (EXIT_FAILURE);
27 }
28
29 wd = getcwd (NULL, 0);
30 base = basename (wd);
31 buf = alloca (strlen (wd) + strlen (base) + 5 + sizeof "testobj1.so");
32
33 printf ("loading `%s'\n", "./testobj1.so");
34 a = dlopen ("./testobj1.so", RTLD_NOW);
35 if (a == NULL)
36 {
37 printf ("cannot load `./testobj1.so': %s\n", dlerror ());
38 exit (EXIT_FAILURE);
39 }
40
41 stpcpy (stpcpy (stpcpy (buf, "../"), base), "/testobj1.so");
42 printf ("loading `%s'\n", buf);
43 b = dlopen (buf, RTLD_NOW);
44 if (b == NULL)
45 {
46 printf ("cannot load `%s': %s\n", buf, dlerror ());
47 exit (EXIT_FAILURE);
48 }
49
50 stpcpy (stpcpy (buf, wd), "/testobj1.so");
51 printf ("loading `%s'\n", buf);
52 c = dlopen (buf, RTLD_NOW);
53 if (c == NULL)
54 {
55 printf ("cannot load `%s': %s\n", buf, dlerror ());
56 exit (EXIT_FAILURE);
57 }
58
59 stpcpy (stpcpy (stpcpy (stpcpy (buf, wd), "/../"), base), "/testobj1.so");
60 printf ("loading `%s'\n", buf);
61 d = dlopen (buf, RTLD_NOW);
62 if (d == NULL)
63 {
64 printf ("cannot load `%s': %s\n", buf, dlerror ());
65 exit (EXIT_FAILURE);
66 }
67
68 if (a != b || b != c || c != d)
69 {
70 puts ("shared object loaded more than once");
71 exit (EXIT_FAILURE);
72 }
73
74 if (dlclose (a) != 0)
75 {
76 puts ("closing `a' failed");
77 exit (EXIT_FAILURE);
78 }
79 if (dlclose (b) != 0)
80 {
81 puts ("closing `a' failed");
82 exit (EXIT_FAILURE);
83 }
84 if (dlclose (c) != 0)
85 {
86 puts ("closing `a' failed");
87 exit (EXIT_FAILURE);
88 }
89 if (dlclose (d) != 0)
90 {
91 puts ("closing `a' failed");
92 exit (EXIT_FAILURE);
93 }
94
95 free (wd);
96
97 return 0;
98 }
99
100 extern int foo (int a);
101 int
foo(int a)102 foo (int a)
103 {
104 return a;
105 }
106