diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-10-23 22:58:40 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-10-23 22:58:40 +0000 |
commit | 9807e5408bf1d7f879216f0000c1f220beb89d93 (patch) | |
tree | 81f1eae57ddb0e46faeab5608ac95801d2c9ad41 /elf/unload.c | |
parent | f92338be6ead8e01060343e9a678ddccf2b5a139 (diff) | |
download | glibc-9807e5408bf1d7f879216f0000c1f220beb89d93.zip glibc-9807e5408bf1d7f879216f0000c1f220beb89d93.tar.gz glibc-9807e5408bf1d7f879216f0000c1f220beb89d93.tar.bz2 |
Update.
* elf/unload.c: Generate more debugging output.
* elf/neededtest.c: Make it more complicated.
* elf/neededtest2.c: New file.
* elf/Makefile: Add rules to build and run neededtest2.
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 2789abd..4fd82b7 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; } |