mirror of
git://sourceware.org/git/glibc.git
synced 2025-04-12 14:21:18 +08:00
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:
parent
e5145be467
commit
79c750b2d7
17
ChangeLog
17
ChangeLog
@ -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]
|
||||
|
20
elf/Makefile
20
elf/Makefile
@ -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
|
||||
|
@ -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];
|
||||
|
@ -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
36
elf/tst-global1.c
Normal 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
41
elf/unload3.c
Normal 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
1
elf/unload3mod1.c
Normal file
@ -0,0 +1 @@
|
||||
int dummy1;
|
1
elf/unload3mod2.c
Normal file
1
elf/unload3mod2.c
Normal file
@ -0,0 +1 @@
|
||||
int dummy2;
|
8
elf/unload3mod3.c
Normal file
8
elf/unload3mod3.c
Normal file
@ -0,0 +1,8 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int
|
||||
foo (int x)
|
||||
{
|
||||
puts ("foo");
|
||||
return x * 2;
|
||||
}
|
11
elf/unload3mod4.c
Normal file
11
elf/unload3mod4.c
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user