3150f6f5e99e49279a6fce8e101e0f51dcd7ead0
[libc-test] / src / general / dlopen.c
1 #include <dlfcn.h>
2 #include "test.h"
3
4 int main()
5 {
6         void *h, *g;
7         int *i, *i2;
8         char *s;
9         void (*f)(void);
10
11         h = dlopen("./dlopen_dso.so", RTLD_LAZY|RTLD_LOCAL);
12         if (!h)
13                 error("dlopen ./dlopen_dso.so failed: %s\n", dlerror());
14         i = dlsym(h, "i");
15         if (!i)
16                 error("dlsym i failed: %s\n", dlerror());
17         if (*i != 1)
18                 error("initialization failed: want i=1 got i=%d\n", *i);
19         f = (void (*)(void))dlsym(h, "f");
20         if (!f)
21                 error("dlsym f failed: %s\n", dlerror());
22         f();
23         if (*i != 2)
24                 error("f call failed: want i=2 got i=%d\n", *i);
25         if (dlclose(h))
26                 error("dlclose failed: %s\n", dlerror());
27
28         g = dlopen(0, RTLD_LAZY|RTLD_LOCAL);
29         if (!g)
30                 error("dlopen 0 failed: %s\n", dlerror());
31         i2 = dlsym(g, "i");
32         s = dlerror();
33         if (i2 || s == 0)
34                 error("dlsym i should have failed\n");
35         if (dlsym(g, "main") == 0)
36                 error("dlsym main failed: %s\n", dlerror());
37
38         h = dlopen("./dlopen_dso.so", RTLD_LAZY|RTLD_GLOBAL);
39         i2 = dlsym(g, "i");
40         if (!i2)
41                 error("dlsym i failed: %s\n", dlerror());
42         if (*i2 != 2)
43                 error("want i2=2, got i2=%d\n", *i2);
44         if (dlclose(g))
45                 error("dlclose failed: %s\n", dlerror());
46         return test_status;
47 }