(linenum→info "unix/slp.c:2238")

glibc/2.7/elf/neededtest3.c

    1: #include <dlfcn.h>
    2: #include <libintl.h>
    3: #include <link.h>
    4: #include <stdio.h>
    5: #include <stdlib.h>
    6: #include <string.h>
    7: 
    8: #define MAPS ((struct link_map *) _r_debug.r_map)
    9: 
   10: static int
   11: check_loaded_objects (const char **loaded)
   12: {
   13:   struct link_map *lm;
   14:   int n;
   15:   int *found = NULL;
   16:   int errors = 0;
   17: 
   18:   for (n = 0; loaded[n]; n++)
   19:     /* NOTHING */;
   20: 
   21:   if (n)
   22:     {
   23:       found = (int *) alloca (sizeof (int) * n);
   24:       memset (found, 0, sizeof (int) * n);
   25:     }
   26: 
   27:   printf("   Name\n");
   28:   printf(" --------------------------------------------------------\n");
   29:   for (lm = MAPS; lm; lm = lm->l_next)
   30:     {
   31:       if (lm->l_name && lm->l_name[0])
   32:         printf(" %s, count = %d\n", lm->l_name, (int) lm->l_direct_opencount);
   33:       if (lm->l_type == lt_loaded && lm->l_name)
   34:         {
   35:           int match = 0;
   36:           for (n = 0; loaded[n] != NULL; n++)
   37:             {
   38:               if (strcmp (basename (loaded[n]), basename (lm->l_name)) == 0)
   39:                 {
   40:                   found[n] = 1;
   41:                   match = 1;
   42:                   break;
   43:                 }
   44:             }
   45: 
   46:           if (match == 0)
   47:             {
   48:               ++errors;
   49:               printf ("ERRORS: %s is not unloaded\n", lm->l_name);
   50:             }
   51:         }
   52:     }
   53: 
   54:   for (n = 0; loaded[n] != NULL; n++)
   55:     {
   56:       if (found[n] == 0)
   57:         {
   58:           ++errors;
   59:           printf ("ERRORS: %s is not loaded\n", loaded[n]);
   60:         }
   61:     }
   62: 
   63:   return errors;
   64: }
   65: 
   66: int
   67: main (void)
   68: {
   69:   void *obj2;
   70:   void *obj3;
   71:   void *obj4;
   72:   const char *loaded[] = { NULL, NULL, NULL, NULL, NULL };
   73:   int errors = 0;
   74: 
   75:   printf ("\nThis is what is in memory now:\n");
   76:   errors += check_loaded_objects (loaded);
   77: 
   78:   printf ("Now loading shared object neededobj2.so\n");
   79:   obj2 = dlopen ("neededobj2.so", RTLD_LAZY);
   80:   if (obj2 == NULL)
   81:     {
   82:       printf ("%s\n", dlerror ());
   83:       exit (1);
   84:     }
   85:   loaded[0] = "neededobj1.so";
   86:   loaded[1] = "neededobj2.so";
   87:   errors += check_loaded_objects (loaded);
   88: 
   89:   printf( "Loading shared object neededobj3.so\n");
   90:   obj3 = dlopen( "neededobj3.so", RTLD_LAZY);
   91:   if (obj3 == NULL)
   92:     {
   93:       printf ("%s\n", dlerror ());
   94:       exit (1);
   95:     }
   96:   loaded[2] = "neededobj3.so";
   97:   errors += check_loaded_objects (loaded);
   98: 
   99: 
  100:   printf( "Loading shared object neededobj4.so\n");
  101:   obj4 = dlopen( "neededobj4.so", RTLD_LAZY);
  102:   if (obj4 == NULL)
  103:     {
  104:       printf ("%s\n", dlerror ());
  105:       exit (1);
  106:     }
  107:   loaded[3] = "neededobj4.so";
  108:   errors += check_loaded_objects (loaded);
  109: 
  110:   printf ("Closing neededobj2.so\n");
  111:   dlclose (obj2);
  112:   errors += check_loaded_objects (loaded);
  113: 
  114:   printf ("Closing neededobj3.so\n");
  115:   dlclose (obj3);
  116:   errors += check_loaded_objects (loaded);
  117: 
  118:   printf ("Closing neededobj4.so\n");
  119:   dlclose (obj4);
  120:   loaded[0] = NULL;
  121:   loaded[1] = NULL;
  122:   loaded[2] = NULL;
  123:   loaded[3] = NULL;
  124:   errors += check_loaded_objects (loaded);
  125: 
  126:   if (errors != 0)
  127:     printf ("%d errors found\n", errors);
  128:   return errors;
  129: }
Syntax (Markdown)