1#include <dlfcn.h>
2#include <stdio.h>
3#include "test.h"
4
5
6typedef int (* TEST_S_VAR)();
7typedef int (* TEST_G_VAR)();
8typedef int (* INSP_S_VAR)();
9typedef int (* INSP_G_VAR)();
10
11
12int 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