diff options
Diffstat (limited to 'test/dlopen/nodelete.c')
-rw-r--r-- | test/dlopen/nodelete.c | 205 |
1 files changed, 0 insertions, 205 deletions
diff --git a/test/dlopen/nodelete.c b/test/dlopen/nodelete.c deleted file mode 100644 index 07ff96136..000000000 --- a/test/dlopen/nodelete.c +++ /dev/null @@ -1,205 +0,0 @@ -#include <dlfcn.h> -#include <setjmp.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> - - -static sigjmp_buf jmpbuf; - - -int fini_ran; - - -static void -__attribute__ ((noreturn)) -handler (int sig) -{ - siglongjmp (jmpbuf, 1); -} - - -#define TEST_FUNCTION do_test () -static int -do_test (void) -{ - /* We are testing the two possibilities to mark an object as not deletable: - - marked on the linker commandline with `-z nodelete' - - with the RTLD_NODELETE flag at dlopen()-time. - - The test we are performing should be safe. We are loading the objects, - get the address of variables in the respective object, unload the object - and then try to read the variable. If the object is unloaded this - should lead to an segmentation fault. */ - void *p; - struct sigaction sa; - - sa.sa_handler = handler; - sigfillset (&sa.sa_mask); - sa.sa_flags = SA_RESTART; - - if (sigaction (SIGSEGV, &sa, NULL) == -1) - puts ("cannot install signal handler: %m"); - - p = dlopen ("nodelmod1.so", RTLD_LAZY); - if (p == NULL) - { - printf ("failed to load \"nodelmod1.so\": %s\n", dlerror ()); - exit (1); - } - else - { - int *varp; - - varp = dlsym (p, "var1"); - if (varp == NULL) - { - puts ("failed to get address of \"var1\" in \"nodelmod1.so\""); - exit (1); - } - else - { - *varp = 20000720; - - /* Now close the object. */ - fini_ran = 0; - if (dlclose (p) != 0) - { - puts ("failed to close \"nodelmod1.so\""); - exit (1); - } - else if (! sigsetjmp (jmpbuf, 1)) - { - /* Access the variable again. */ - if (*varp != 20000720) - { - puts ("\"var1\" value not correct"); - exit (1); - } - else if (fini_ran != 0) - { - puts ("destructor of \"nodelmod1.so\" ran"); - exit (1); - } - else - puts ("-z nodelete test succeeded"); - } - else - { - /* We caught an segmentation fault. */ - puts ("\"nodelmod1.so\" got deleted!"); - exit (1); - } - } - } - - p = dlopen ("nodelmod2.so", RTLD_LAZY | RTLD_NODELETE); - if (p == NULL) - { - printf ("failed to load \"nodelmod2.so\": %s\n", dlerror ()); - exit (1); - } - else - { - int *varp; - - varp = dlsym (p, "var2"); - if (varp == NULL) - { - puts ("failed to get address of \"var2\" in \"nodelmod2.so\""); - exit (1); - } - else - { - *varp = 42; - - /* Now close the object. */ - fini_ran = 0; - if (dlclose (p) != 0) - { - puts ("failed to close \"nodelmod2.so\""); - exit (1); - } - else if (! sigsetjmp (jmpbuf, 1)) - { - /* Access the variable again. */ - if (*varp != 42) - { - puts ("\"var2\" value not correct"); - exit (1); - } - else if (fini_ran != 0) - { - puts ("destructor of \"nodelmod2.so\" ran"); - exit (1); - } - else - puts ("RTLD_NODELETE test succeeded"); - } - else - { - /* We caught an segmentation fault. */ - puts ("\"nodelmod2.so\" got deleted!"); - exit (1); - } - } - } - - p = dlopen ("nodelmod3.so", RTLD_LAZY); - if (p == NULL) - { - printf ("failed to load \"nodelmod3.so\": %s\n", dlerror ()); - exit (1); - } - else - { - int *(*fctp) (void); - - fctp = dlsym (p, "addr"); - if (fctp == NULL) - { - puts ("failed to get address of \"addr\" in \"nodelmod3.so\""); - exit (1); - } - else - { - int *varp = fctp (); - - *varp = -1; - - /* Now close the object. */ - fini_ran = 0; - if (dlclose (p) != 0) - { - puts ("failed to close \"nodelmod3.so\""); - exit (1); - } - else if (! sigsetjmp (jmpbuf, 1)) - { - /* Access the variable again. */ - if (*varp != -1) - { - puts ("\"var_in_mod4\" value not correct"); - exit (1); - } - else if (fini_ran != 0) - { - puts ("destructor of \"nodelmod4.so\" ran"); - exit (1); - } - else - puts ("-z nodelete in dependency succeeded"); - } - else - { - /* We caught an segmentation fault. */ - puts ("\"nodelmod4.so\" got deleted!"); - exit (1); - } - } - } - - return 0; -} - -#include "../test-skeleton.c" |