Also print opencount.
[kopensolaris-gnu/glibc.git] / elf / neededtest.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 static int
9 check_loaded_objects (const char **loaded)
10 {
11   struct link_map *lm;
12   int n;
13   int *found = NULL;
14   int errors = 0;
15
16   for (n = 0; loaded[n]; n++)
17     /* NOTHING */;
18
19   if (n)
20     {
21       found = (int *) alloca (sizeof (int) * n);
22       memset (found, 0, sizeof (int) * n);
23     }
24
25   printf("   Name\n");
26   printf(" --------------------------------------------------------\n");
27   for (lm = _r_debug.r_map; lm; lm = lm->l_next)
28     {
29       if (lm->l_name && lm->l_name[0])
30         printf(" %s, count = %d\n", lm->l_name, (int) lm->l_opencount);
31       if (lm->l_type == lt_loaded && lm->l_name)
32         {
33           int match = 0;
34           for (n = 0; loaded[n] != NULL; n++)
35             {
36               if (strcmp (basename (loaded[n]), basename (lm->l_name)) == 0)
37                 {
38                   found[n] = 1;
39                   match = 1;
40                   break;
41                 }
42             }
43
44           if (match == 0)
45             {
46               ++errors;
47               printf ("ERRORS: %s is not unloaded\n", lm->l_name);
48             }
49         }
50     }
51
52   for (n = 0; loaded[n] != NULL; n++)
53     {
54       if (found[n] == 0)
55         {
56           ++errors;
57           printf ("ERRORS: %s is not loaded\n", loaded[n]);
58         }
59     }
60
61   return errors;
62 }
63
64 int
65 main (void)
66 {
67   void *obj2;
68   void *obj3;
69   const char *loaded[] = { NULL, NULL, NULL, NULL };
70   int errors = 0;
71
72   printf ("\nThis is what is in memory now:\n");
73   errors += check_loaded_objects (loaded);
74   printf( "Loading shared object neededobj3.so\n");
75   obj3 = dlopen( "neededobj3.so", RTLD_LAZY);
76   if (obj3 == NULL)
77     {
78       printf ("%s\n", dlerror ());
79       exit (1);
80     }
81   printf ("And this is what is now in memory\n");
82   loaded[0] = "neededobj1.so";
83   loaded[1] = "neededobj2.so";
84   loaded[2] = "neededobj3.so";
85   errors += check_loaded_objects (loaded);
86   printf ("Now loading shared object neededobj2.so\n");
87   obj2 = dlopen ("neededobj2.so", RTLD_LAZY);
88   if (obj2 == NULL)
89     {
90       printf ("%s\n", dlerror ());
91       exit (1);
92     }
93   printf ("Again, this is what is in memory\n");
94   errors += check_loaded_objects (loaded);
95   printf ("Closing neededobj2.so\n");
96   dlclose (obj2);
97   errors += check_loaded_objects (loaded);
98   printf ("Closing neededobj3.so\n");
99   dlclose (obj3);
100   loaded[0] = NULL;
101   errors += check_loaded_objects (loaded);
102   if (errors != 0)
103     printf ("%d errors found\n", errors);
104   return errors;
105 }