diff options
Diffstat (limited to 'elf/unload.c')
-rw-r--r-- | elf/unload.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/elf/unload.c b/elf/unload.c index 2789abd5bb..4fd82b7e3a 100644 --- a/elf/unload.c +++ b/elf/unload.c @@ -4,10 +4,18 @@ require it for glibc. */ #include <dlfcn.h> +#include <link.h> #include <mcheck.h> #include <stdio.h> #include <stdlib.h> +#define OUT \ + for (map = _r_debug.r_map; map != NULL; map = map->l_next) \ + if (map->l_type == lt_loaded) \ + printf ("name = \"%s\", opencount = %d\n", \ + map->l_name, (int) map->l_opencount); \ + fflush (stdout) + typedef struct { void *next; @@ -20,46 +28,62 @@ main (void) strct *testdat; int ret; int result = 0; + struct link_map *map; mtrace (); + puts ("\nBefore"); + OUT; + sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL); if (sohandle == NULL) { - printf ("first dlopen failed: %s\n", dlerror ()); + printf ("*** first dlopen failed: %s\n", dlerror ()); exit (1); } + puts ("\nAfter loading unloadmod.so"); + OUT; + testdat = dlsym (sohandle, "testdat"); testdat->next = (void *) -1; ret = dlclose (sohandle); if (ret != 0) { - puts ("first dlclose failed"); + puts ("*** first dlclose failed"); result = 1; } + puts ("\nAfter closing unloadmod.so"); + OUT; + sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL); if (sohandle == NULL) { - printf ("second dlopen failed: %s\n", dlerror ()); + printf ("*** second dlopen failed: %s\n", dlerror ()); exit (1); } + puts ("\nAfter loading unloadmod.so the second time"); + OUT; + testdat = dlsym (sohandle, "testdat"); if (testdat->next == (void *) -1) { - puts ("testdat->next == (void *) -1"); + puts ("*** testdat->next == (void *) -1"); result = 1; } ret = dlclose (sohandle); if (ret != 0) { - puts ("second dlclose failed"); + puts ("*** second dlclose failed"); result = 1; } + puts ("\nAfter closing unloadmod.so again"); + OUT; + return result; } |