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