2005-03-01  H.J. Lu  <hongjiu.lu@intel.com>
	[BZ #776]
	* iconv/iconvconfig.c: Fix comment for the output file.
	(write_output): Clear padding in header.

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.

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:
Ulrich Drepper 2005-03-03 08:28:23 +00:00
parent fab0abb446
commit 2e2b6e2618
9 changed files with 128 additions and 35 deletions

View File

@ -1,3 +1,25 @@
2005-03-01 H.J. Lu <hongjiu.lu@intel.com>
[BZ #776]
* iconv/iconvconfig.c: Fix comment for the output file.
(write_output): Clear padding in header.
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.
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-21 Alan Modra <amodra@bigpond.net.au> 2005-02-21 Alan Modra <amodra@bigpond.net.au>
* sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't * sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't

View File

@ -351,36 +351,6 @@ _dl_close (void *_map)
} }
assert (found); 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. */ /* Store the new l_opencount value. */
imap->l_opencount = new_opencount[i]; imap->l_opencount = new_opencount[i];

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;
}

View File

@ -985,11 +985,11 @@ next_prime (uint32_t seed)
Offset Length Description Offset Length Description
0000 4 Magic header bytes 0000 4 Magic header bytes
0004 4 Offset of string table (stoff) 0004 2 Offset of string table (stoff)
0008 4 Offset of name hashing table (hoff) 0006 2 Offset of name hashing table (hoff)
000C 4 Hashing table size (hsize) 0008 2 Hashing table size (hsize)
0010 4 Offset of module table (moff) 000A 2 Offset of module table (moff)
0014 4 Offset of other conversion module table (ooff) 000C 2 Offset of other conversion module table (ooff)
stoff ??? String table stoff ??? String table
@ -1178,6 +1178,9 @@ write_output (void)
} }
} }
/* Clear padding. */
memset (&header, 0, sizeof (struct gconvcache_header));
header.magic = GCONVCACHE_MAGIC; header.magic = GCONVCACHE_MAGIC;
iov[0].iov_base = &header; iov[0].iov_base = &header;