glibc/elf/neededtest.c
Ulrich Drepper 8699e7b1da Update.
* elf/dl-close.c: Decrement opencount for all dependencies which can
	be removed even if the object is not yet unloaded.
	* elf/dl-deps.c (_dl_map_object_deps): If dependency is already in
	the list decrement opencount of all dependencies.
	* elf/dl-load.c (_dl_map_object_from_fd): Increment object of object
	and all dependencies.
	(_dl_map_object): Likewise.
	* elf/dl-lookup.c (add_dependency): Likewise.

	* elf/loadtest.c: Add debug when with more output.
2000-10-21 06:02:49 +00:00

106 lines
2.3 KiB
C

#include <dlfcn.h>
#include <libintl.h>
#include <link.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int
check_loaded_objects (const char **loaded)
{
struct link_map *lm;
int n;
int *found = NULL;
int errors = 0;
for (n = 0; loaded[n]; n++)
/* NOTHING */;
if (n)
{
found = (int *) alloca (sizeof (int) * n);
memset (found, 0, sizeof (int) * n);
}
printf(" Name\n");
printf(" --------------------------------------------------------\n");
for (lm = _r_debug.r_map; lm; lm = lm->l_next)
{
if (lm->l_name && lm->l_name[0])
printf(" %s, count = %d\n", lm->l_name, (int) lm->l_opencount);
if (lm->l_type == lt_loaded && lm->l_name)
{
int match = 0;
for (n = 0; loaded[n] != NULL; n++)
{
if (strcmp (basename (loaded[n]), basename (lm->l_name)) == 0)
{
found[n] = 1;
match = 1;
break;
}
}
if (match == 0)
{
++errors;
printf ("ERRORS: %s is not unloaded\n", lm->l_name);
}
}
}
for (n = 0; loaded[n] != NULL; n++)
{
if (found[n] == 0)
{
++errors;
printf ("ERRORS: %s is not loaded\n", loaded[n]);
}
}
return errors;
}
int
main (void)
{
void *obj2;
void *obj3;
const char *loaded[] = { NULL, NULL, NULL, NULL };
int errors = 0;
printf ("\nThis is what is in memory now:\n");
errors += check_loaded_objects (loaded);
printf( "Loading shared object neededobj3.so\n");
obj3 = dlopen( "neededobj3.so", RTLD_LAZY);
if (obj3 == NULL)
{
printf ("%s\n", dlerror ());
exit (1);
}
printf ("And this is what is now in memory\n");
loaded[0] = "neededobj1.so";
loaded[1] = "neededobj2.so";
loaded[2] = "neededobj3.so";
errors += check_loaded_objects (loaded);
printf ("Now loading shared object neededobj2.so\n");
obj2 = dlopen ("neededobj2.so", RTLD_LAZY);
if (obj2 == NULL)
{
printf ("%s\n", dlerror ());
exit (1);
}
printf ("Again, this is what is in memory\n");
errors += check_loaded_objects (loaded);
printf ("Closing neededobj2.so\n");
dlclose (obj2);
errors += check_loaded_objects (loaded);
printf ("Closing neededobj3.so\n");
dlclose (obj3);
loaded[0] = NULL;
errors += check_loaded_objects (loaded);
if (errors != 0)
printf ("%d errors found\n", errors);
return errors;
}