glibc/elf/unload.c

66 lines
1.3 KiB
C
Raw Normal View History

Update. 2000-08-26 Ulrich Drepper <drepper@redhat.com> * elf/Makefile (distribute): Add unloadmod.c, reldepmod1.c, reldepmod2.c, reldepmod3.c, and reldepmod4.c. (tests): Add unload, reldep, reldep2, and reldep3. (modules-names): Add unloadmod, reldepmod1, reldepmod2, reldepmod3, and reldepmod4. Add rules to build and run unload, reldep, reldep2, and reldep3. * elf/dl-lookup.c (_dl_lookup_symbol): Add new parameter explicit. Don't create relocation dependency if it is nonzero. (_dl_lookup_symbol_skip): Remove relocation dependency stuff. This can never happen here. (_dl_lookup_versioned_symbol): Add new parameter explicit. Don't create relocation dependency if it is nonzero. (_dl_lookup_versioned_symbol_skip): Remove relocation dependency stuff. This can never happen here. * sysdeps/generic/ldsodefs.h: Change prototypes. * elf/dl-reloc.c (RESOLVE_MAP): Pass 0 in explicit parameter to _dl_lookup_up and _dl_lookup_versioned_symbol. (RESOLV): Likewise. * elf/dl-runtime.c (fixup): Likewise. (profile_fixup): Likewise. * elf/dl-libc.c (do_dlsym): Pass 1 in explicit parameter to _dl_lookup_symbol. * elf/dl-symbol.c (_dl_symbol_value): Likewise. * elf/rtld.c (dl_main): Likewise. * elf/dl-sym.c (_dl_sym): Pass 1 in explicit parameter to _dl_lookup_symbol if handle is not RTLD_DEFAULT. Always compute and pass down the caller map. (_dl_vsym): Likewise. * elf/reldep.c: New file. * elf/reldep2.c: New file. * elf/reldep3.c: New file. * elf/reldepmod1.c: New file. * elf/reldepmod2.c: New file. * elf/reldepmod3.c: New file. * elf/reldepmod4.c: New file. * elf/unload.c: New file. * elf/unloadmod.c: New file. * elf/do-lookup.h: Remove unused undef_name parameter. * elf/dl-lookup.c: Adjust callers.
2000-08-27 07:41:19 +08:00
/* 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 <mcheck.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
void *next;
} strct;
int
main (void)
{
void *sohandle;
strct *testdat;
int ret;
int result = 0;
mtrace ();
sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL);
if (sohandle == NULL)
{
printf ("first dlopen failed: %s\n", dlerror ());
exit (1);
}
testdat = dlsym (sohandle, "testdat");
testdat->next = (void *) -1;
ret = dlclose (sohandle);
if (ret != 0)
{
puts ("first dlclose failed");
result = 1;
}
sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL);
if (sohandle == NULL)
{
printf ("second dlopen failed: %s\n", dlerror ());
exit (1);
}
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;
}
return result;
}