Yet another reference counting test.
[kopensolaris-gnu/glibc.git] / elf / neededtest2.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[2];
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 ("\nLoading shared object neededobj2.so\n");
75   obj2 = dlopen ("neededobj2.so", RTLD_LAZY);
76   if (obj2 == NULL)
77     {
78       printf ("%s\n", dlerror ());
79       exit (1);
80     }
81   loaded[0] = "neededobj1.so";
82   loaded[1] = "neededobj2.so";
83   errors += check_loaded_objects (loaded);
84   printf ("\nLoading shared object neededobj3.so\n");
85   obj3[0] = dlopen( "neededobj3.so", RTLD_LAZY);
86   if (obj3[0] == NULL)
87     {
88       printf ("%s\n", dlerror ());
89       exit (1);
90     }
91   loaded[2] = "neededobj3.so";
92   errors += check_loaded_objects (loaded);
93   printf ("\nNow loading shared object neededobj3.so again\n");
94   obj3[1] = dlopen ("neededobj3.so", RTLD_LAZY);
95   if (obj3[1] == NULL)
96     {
97       printf ("%s\n", dlerror ());
98       exit (1);
99     }
100   errors += check_loaded_objects (loaded);
101   printf ("\nClosing neededobj3.so once\n");
102   dlclose (obj3[0]);
103   errors += check_loaded_objects (loaded);
104   printf ("\nClosing neededobj2.so\n");
105   dlclose (obj2);
106   errors += check_loaded_objects (loaded);
107   printf ("\nClosing neededobj3.so for the second time\n");
108   dlclose (obj3[1]);
109   loaded[0] = NULL;
110   loaded[1] = NULL;
111   loaded[2] = NULL;
112   errors += check_loaded_objects (loaded);
113   if (errors != 0)
114     printf ("%d errors found\n", errors);
115   return errors;
116 }