glibc/elf/unload.c
Ulrich Drepper 20fe49b93a * include/link.h (struct link_map): Remove l_opencount. Add l_removed.
Change type of l_idx to int.
	* elf/dl-close.c: Basically rewrite.  Do not use l_opencount to
	determine whether a DSO has to be unloaded.  Instead compute this
	in this function.
	* elf/dl-deps.c: No need to manipulate l_opencount anymore.
	* elf/dl-lookup.c: Likewise.
	* elf/rtld.c: Likewise
	* elf/dl-open.c: Likewise.  Use l_init_called to determine whether
	object was just loaded.
	* elf/dl-fini.c: Bump l_direct_opencount instead of l_opencount.
	* elf/dl-load.c (_dl_map_object_from_fd): Do not recognize DSO which
	is about to be unloaded as a match.
	(_dl_map_object): Likewise.
	* elf/do-lookup.h (do_lookup_x): Do not look into DSO which is about
	to be unloaded.
	* elf/circleload1.c: Don't use l_opencount anymore.
	* elf/neededtest.c: Likewise.
	* elf/neededtest2.c: Likewise.
	* elf/neededtest3.c: Likewise.
	* elf/neededtest4.c: Likewise.
	* elf/unload.c: Likewise.
	* elf/unload2.c: Likewise.
	* elf/loadtest.c: Likewise.

	* elf/rtld.c: Preloading errors are now never fatal.

2005-03-08  Jakub Jelinek  <jakub@redhat.com>

	* elf/Makefile: Add rules to build and run unload5 test.
	* elf/unload5.c: New file.

2005-03-08  Jakub Jelinek  <jakub@redhat.com>

	* elf/Makefile: Add rules to build and run unload4 test.
	* elf/unload4.c: New file.
	* elf/unload4mod1.c: New file.
	* elf/unload4mod2.c: New file.
	* elf/unload4mod3.c: New file.
	* elf/unload4mod4.c: New file.
2005-03-18 11:11:42 +00:00

90 lines
1.9 KiB
C

/* Test for unloading (really unmapping) of objects. By Franz Sirl.
This test does not have to passed in all dlopen() et.al. implementation
since it is not required the unloading actually happens. But we
require it for glibc. */
#include <dlfcn.h>
#include <link.h>
#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>
#define OUT \
for (map = _r_debug.r_map; map != NULL; map = map->l_next) \
if (map->l_type == lt_loaded) \
printf ("name = \"%s\", direct_opencount = %d\n", \
map->l_name, (int) map->l_direct_opencount); \
fflush (stdout)
typedef struct
{
void *next;
} strct;
int
main (void)
{
void *sohandle;
strct *testdat;
int ret;
int result = 0;
struct link_map *map;
mtrace ();
puts ("\nBefore");
OUT;
sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL);
if (sohandle == NULL)
{
printf ("*** first dlopen failed: %s\n", dlerror ());
exit (1);
}
puts ("\nAfter loading unloadmod.so");
OUT;
testdat = dlsym (sohandle, "testdat");
testdat->next = (void *) -1;
ret = dlclose (sohandle);
if (ret != 0)
{
puts ("*** first dlclose failed");
result = 1;
}
puts ("\nAfter closing unloadmod.so");
OUT;
sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL);
if (sohandle == NULL)
{
printf ("*** second dlopen failed: %s\n", dlerror ());
exit (1);
}
puts ("\nAfter loading unloadmod.so the second time");
OUT;
testdat = dlsym (sohandle, "testdat");
if (testdat->next == (void *) -1)
{
puts ("*** testdat->next == (void *) -1");
result = 1;
}
ret = dlclose (sohandle);
if (ret != 0)
{
puts ("*** second dlclose failed");
result = 1;
}
puts ("\nAfter closing unloadmod.so again");
OUT;
return result;
}