about summary refs log tree commit diff
path: root/elf/unload.c
diff options
context:
space:
mode:
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;
 }