2005-03-03 Ulrich Drepper <drepper@redhat.com>

* elf/dl-close.c (_dl_close): Don't try to set up new searchpath if the
	loader is closed.  Fixes unload3.
	* elf/tst-global1.c: New file.
	* elf/Makefile (tests): Add tst-global1.
	* elf/testobj2.c (p): New function.

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

	* elf/Makefile: Add rules to build and run unload3 test.
	* elf/unload3.c: New test.
	* elf/unload3mod1.c: New file.
	* elf/unload3mod2.c: New file.
	* elf/unload3mod3.c: New file.
	* elf/unload3mod4.c: New file.
This commit is contained in:
Jakub Jelinek 2005-03-03 16:22:52 +00:00
parent e5145be467
commit 79c750b2d7
10 changed files with 138 additions and 33 deletions

View File

@ -1,3 +1,20 @@
2005-03-03 Ulrich Drepper <drepper@redhat.com>
* elf/dl-close.c (_dl_close): Don't try to set up new searchpath if the
loader is closed. Fixes unload3.
* elf/tst-global1.c: New file.
* elf/Makefile (tests): Add tst-global1.
* elf/testobj2.c (p): New function.
2005-03-03 Jakub Jelinek <jakub@redhat.com>
* elf/Makefile: Add rules to build and run unload3 test.
* elf/unload3.c: New test.
* elf/unload3mod1.c: New file.
* elf/unload3mod2.c: New file.
* elf/unload3mod3.c: New file.
* elf/unload3mod4.c: New file.
2005-02-23 Ulrich Drepper <drepper@redhat.com>
[BZ #719]

View File

@ -83,7 +83,8 @@ distribute := rtld-Rules \
tst-array2dep.c tst-piemod1.c \
tst-execstack-mod.c tst-dlmodcount.c \
check-textrel.c dl-sysdep.h test-dlopenrpathmod.c \
tst-deep1mod1.c tst-deep1mod2.c tst-deep1mod3.c
tst-deep1mod1.c tst-deep1mod2.c tst-deep1mod3.c \
unload3mod1.c unload3mod2.c unload3mod3.c unload3mod4.c
CFLAGS-dl-runtime.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-dl-lookup.c = -fexceptions -fasynchronous-unwind-tables
@ -154,7 +155,8 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
circleload1 tst-tls3 tst-tls4 tst-tls5 tst-tls6 tst-tls7 tst-tls8 \
tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-align \
tst-align2 $(tests-execstack-$(have-z-execstack)) tst-dlmodcount \
tst-dlopenrpath tst-deep1 tst-dlmopen1 tst-dlmopen2 tst-dlmopen3
tst-dlopenrpath tst-deep1 tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \
unload3 tst-global1
# reldep9
test-srcs = tst-pathopt
tests-vis-yes = vismain
@ -189,7 +191,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
tst-alignmod tst-alignmod2 \
$(modules-execstack-$(have-z-execstack)) \
tst-dlopenrpathmod tst-deep1mod1 tst-deep1mod2 tst-deep1mod3 \
tst-dlmopen1mod
tst-dlmopen1mod \
unload3mod1 unload3mod2 unload3mod3 unload3mod4
ifeq (yes,$(have-initfini-array))
modules-names += tst-array2dep
endif
@ -421,6 +424,9 @@ $(objpfx)reldep8mod3.so: $(objpfx)reldep8mod1.so $(objpfx)reldep8mod2.so
$(objpfx)nodel2mod3.so: $(objpfx)nodel2mod1.so $(objpfx)nodel2mod2.so
$(objpfx)reldep9mod2.so: $(objpfx)reldep9mod1.so
$(objpfx)reldep9mod3.so: $(objpfx)reldep9mod1.so $(objpfx)reldep9mod2.so
$(objpfx)unload3mod1.so: $(objpfx)unload3mod3.so
$(objpfx)unload3mod2.so: $(objpfx)unload3mod3.so
$(objpfx)unload3mod3.so: $(objpfx)unload3mod4.so
LDFLAGS-tst-tlsmod5.so = -nostdlib
LDFLAGS-tst-tlsmod6.so = -nostdlib
@ -460,6 +466,7 @@ circlemod3.so-no-z-defs = yes
circlemod3a.so-no-z-defs = yes
reldep8mod2.so-no-z-defs = yes
reldep9mod1.so-no-z-defs = yes
unload3mod4.so-no-z-defs = yes
# filtmod1.so has a special rule
$(filter-out $(objpfx)filtmod1.so, $(test-modules)): $(objpfx)%.so: $(objpfx)%.os
@ -676,6 +683,10 @@ $(objpfx)tst-align: $(libdl)
$(objpfx)tst-align.out: $(objpfx)tst-alignmod.so
$(objpfx)tst-align2: $(objpfx)tst-alignmod2.so
$(objpfx)unload3: $(libdl)
$(objpfx)unload3.out: $(objpfx)unload3mod1.so $(objpfx)unload3mod2.so \
$(objpfx)unload3mod3.so $(objpfx)unload3mod4.so
ifdef libdl
$(objpfx)tst-tls9-static: $(common-objpfx)dlfcn/libdl.a
$(objpfx)tst-tls9-static.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so
@ -779,3 +790,6 @@ $(objpfx)tst-dlmopen2.out: $(objpfx)tst-dlmopen1mod.so
$(objpfx)tst-dlmopen3: $(libdl)
$(objpfx)tst-dlmopen3.out: $(objpfx)tst-dlmopen1mod.so
$(objpfx)tst-global1: $(libdl)
$(objpfx)tst-global1.out: $(objpfx)testobj6.so $(objpfx)testobj2.so

View File

@ -327,36 +327,6 @@ _dl_close (void *_map)
}
assert (found);
}
else if (new_opencount[i] != 0 && imap->l_type == lt_loaded
&& imap->l_searchlist.r_list == NULL
&& imap->l_initfini != NULL)
{
/* The object is still used. But the object we are
unloading right now is responsible for loading it. If
the current object does not have it's own scope yet we
have to create one. This has to be done before running
the finalizers.
To do this count the number of dependencies. */
unsigned int cnt;
for (cnt = 1; imap->l_initfini[cnt] != NULL; ++cnt)
if (imap->l_initfini[cnt]->l_idx >= i
&& imap->l_initfini[cnt]->l_idx < nopencount)
++new_opencount[imap->l_initfini[cnt]->l_idx];
else
++imap->l_initfini[cnt]->l_opencount;
/* We simply reuse the l_initfini list. */
imap->l_searchlist.r_list = &imap->l_initfini[cnt + 1];
imap->l_searchlist.r_nlist = cnt;
for (cnt = 0; imap->l_scope[cnt] != NULL; ++cnt)
if (imap->l_scope[cnt] == &map->l_searchlist)
{
imap->l_scope[cnt] = &imap->l_searchlist;
break;
}
}
/* Store the new l_opencount value. */
imap->l_opencount = new_opencount[i];

View File

@ -23,3 +23,9 @@ preload (int a)
return fp (a) + 10;
return 10;
}
void
p (void)
{
puts ("hello world");
}

36
elf/tst-global1.c Normal file
View File

@ -0,0 +1,36 @@
#include <dlfcn.h>
#include <stdio.h>
int
main (void)
{
void *h1 = dlopen ("$ORIGIN/testobj6.so", RTLD_GLOBAL|RTLD_LAZY);
if (h1 == NULL)
{
puts ("cannot open testobj6");
return 1;
}
void *h2 = dlopen ("$ORIGIN/testobj2.so",
RTLD_GLOBAL|RTLD_DEEPBIND|RTLD_LAZY);
if (h2 == NULL)
{
puts ("cannot open testobj2");
return 1;
}
dlclose (h1);
void (*f) (void) = dlsym (h2, "p");
if (f == NULL)
{
puts ("cannot find p");
return 1;
}
f ();
dlclose (h2);
return 0;
}

41
elf/unload3.c Normal file
View File

@ -0,0 +1,41 @@
#include <dlfcn.h>
#include <stdio.h>
int
main (void)
{
void *g = dlopen ("unload3mod1.so", RTLD_GLOBAL | RTLD_NOW);
void *h = dlopen ("unload3mod2.so", RTLD_GLOBAL | RTLD_NOW);
if (g == NULL || h == NULL)
{
printf ("dlopen unload3mod{1,2}.so failed: %p %p\n", g, h);
return 1;
}
dlclose (h);
dlclose (g);
g = dlopen ("unload3mod3.so", RTLD_GLOBAL | RTLD_NOW);
h = dlopen ("unload3mod4.so", RTLD_GLOBAL | RTLD_NOW);
if (g == NULL || h == NULL)
{
printf ("dlopen unload3mod{3,4}.so failed: %p %p\n", g, h);
return 1;
}
int (*fn) (int);
fn = dlsym (h, "bar");
if (fn == NULL)
{
puts ("dlsym failed");
return 1;
}
int val = fn (16);
if (val != 24)
{
printf ("bar returned %d != 24\n", val);
return 1;
}
return 0;
}

1
elf/unload3mod1.c Normal file
View File

@ -0,0 +1 @@
int dummy1;

1
elf/unload3mod2.c Normal file
View File

@ -0,0 +1 @@
int dummy2;

8
elf/unload3mod3.c Normal file
View File

@ -0,0 +1,8 @@
#include <stdio.h>
int
foo (int x)
{
puts ("foo");
return x * 2;
}

11
elf/unload3mod4.c Normal file
View File

@ -0,0 +1,11 @@
#include <stdio.h>
int
bar (int x)
{
puts ("bar");
fflush (stdout);
x = foo (x - 4);
puts ("bar after foo");
return x;
}