Yet more complicated unloading test.
[kopensolaris-gnu/glibc.git] / 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 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   void *obj4;
70   const char *loaded[] = { NULL, NULL, NULL, NULL, NULL };
71   int errors = 0;
72
73   printf ("\nThis is what is in memory now:\n");
74   errors += check_loaded_objects (loaded);
75
76   printf ("Now loading shared object neededobj2.so\n");
77   obj2 = dlopen ("neededobj2.so", RTLD_LAZY);
78   if (obj2 == NULL)
79     {
80       printf ("%s\n", dlerror ());
81       exit (1);
82     }
83   loaded[0] = "neededobj1.so";
84   loaded[1] = "neededobj2.so";
85   errors += check_loaded_objects (loaded);
86
87   printf( "Loading shared object neededobj3.so\n");
88   obj3 = dlopen( "neededobj3.so", RTLD_LAZY);
89   if (obj3 == NULL)
90     {
91       printf ("%s\n", dlerror ());
92       exit (1);
93     }
94   loaded[2] = "neededobj3.so";
95   errors += check_loaded_objects (loaded);
96
97
98   printf( "Loading shared object neededobj4.so\n");
99   obj4 = dlopen( "neededobj4.so", RTLD_LAZY);
100   if (obj4 == NULL)
101     {
102       printf ("%s\n", dlerror ());
103       exit (1);
104     }
105   loaded[3] = "neededobj4.so";
106   errors += check_loaded_objects (loaded);
107
108   printf ("Closing neededobj2.so\n");
109   dlclose (obj2);
110   errors += check_loaded_objects (loaded);
111
112   printf ("Closing neededobj3.so\n");
113   dlclose (obj3);
114   errors += check_loaded_objects (loaded);
115
116   printf ("Closing neededobj4.so\n");
117   dlclose (obj4);
118   loaded[0] = NULL;
119   loaded[1] = NULL;
120   loaded[2] = NULL;
121   loaded[3] = NULL;
122   errors += check_loaded_objects (loaded);
123
124   if (errors != 0)
125     printf ("%d errors found\n", errors);
126   return errors;
127 }