1 #include <dlfcn.h>
2 #include <stdio.h>
3 #include "test.h"
4
5
6 typedef int (* TEST_S_VAR)();
7 typedef int (* TEST_G_VAR)();
8 typedef int (* INSP_S_VAR)();
9 typedef int (* INSP_G_VAR)();
10
11
main(int argc,char * argv[])12 int main(int argc, char *argv[])
13 {
14 char buf[512];
15 void *h = NULL;
16 void *g = NULL;
17 TEST_S_VAR test_s_var = NULL;
18 TEST_G_VAR test_g_var = NULL;
19 INSP_S_VAR insp_s_var = NULL;
20 INSP_G_VAR insp_g_var = NULL;
21
22 int s_var = 0;
23 int g_var = 0;
24
25 if(!t_pathrel(buf, sizeof buf, argv[0], "libdlclose_reset_dso.so")) {
26 t_error("failed to obtain relative path to libdlclose_reset_dso.so\n");
27 return 1;
28 }
29
30 h = dlopen(buf, RTLD_LAZY|RTLD_LOCAL);
31 if(!h)
32 t_error("dlopen %s failed: %s\n", buf, dlerror());
33
34 test_s_var = (TEST_S_VAR)dlsym( h, "test_static_var");
35 if (!test_s_var)
36 t_error("dlsym test_static_var failed: %s\n", dlerror());
37
38 test_g_var = (TEST_G_VAR)dlsym( h, "test_global_var");
39 if (!test_g_var)
40 t_error("dlsyn test_global_var failed: %s\n", dlerror());
41
42 test_s_var();
43 test_g_var();
44
45 if(dlclose( h))
46 t_error("dlclose failed: %s\n", dlerror());
47
48 g = dlopen(buf, RTLD_LAZY|RTLD_LOCAL);
49 if(!g)
50 t_error("dlopen %s failed: %s\n", buf, dlerror());
51
52 insp_s_var = (INSP_S_VAR)dlsym( g, "ret_static");
53 if (!insp_s_var)
54 t_error("dlsym ret_static failed: %s\n", dlerror());
55
56 insp_g_var = (INSP_G_VAR)dlsym( g, "ret_global");
57 if (!insp_g_var)
58 t_error("dlsyn global_var failed: %s\n", dlerror());
59
60 s_var = insp_s_var();
61 g_var = insp_g_var();
62
63 if(s_var != 84)
64 t_error("Static variable reset failed: want s_var=84 got s_var=%d\n", s_var);
65
66 if(g_var != 84)
67 t_error("Global variable reset failed: want g_var=84 got g_var=%d\n", g_var);
68
69 if(dlclose( g))
70 t_error("dlclose failed: %s\n", dlerror());
71
72 }
73