Back to index

glibc  2.9
Classes | Defines | Functions
unload.c File Reference
#include <dlfcn.h>
#include <link.h>
#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>

Go to the source code of this file.

Classes

struct  strct

Defines

#define MAPS   ((struct link_map *) _r_debug.r_map)
#define OUT

Functions

int main (void)

Class Documentation

struct strct

Definition at line 21 of file unload.c.

Class Members
void * next

Define Documentation

#define MAPS   ((struct link_map *) _r_debug.r_map)

Definition at line 12 of file unload.c.

#define OUT
Value:
for (map = MAPS; map != NULL; map = map->l_next)                     \
    if (map->l_type == lt_loaded)                                    \
      printf ("name = \"%s\", direct_opencount = %d\n",                     \
             map->l_name, (int) map->l_direct_opencount);                   \
  fflush (stdout)

Definition at line 14 of file unload.c.


Function Documentation

int main ( void  )

Definition at line 27 of file unload.c.

{
   void *sohandle;
   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 ());
       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");
       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 ());
       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");
       result = 1;
     }

   ret = dlclose (sohandle);
   if (ret != 0)
     {
       puts ("*** second dlclose failed");
       result = 1;
     }

   puts ("\nAfter closing unloadmod.so again");
   OUT;

   return result;
}

Here is the call graph for this function: