(root)/
glibc-2.38/
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  }