summaryrefslogtreecommitdiff
path: root/elf/unload.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-10-23 22:58:40 +0000
committerUlrich Drepper <drepper@redhat.com>2000-10-23 22:58:40 +0000
commit9807e5408bf1d7f879216f0000c1f220beb89d93 (patch)
tree81f1eae57ddb0e46faeab5608ac95801d2c9ad41 /elf/unload.c
parentf92338be6ead8e01060343e9a678ddccf2b5a139 (diff)
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.c34
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;
}