• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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