mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 01:33:36 +08:00
[BZ #776]
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:
parent
fab0abb446
commit
2e2b6e2618
22
ChangeLog
22
ChangeLog
@ -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>
|
||||
|
||||
* sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't
|
||||
|
@ -351,36 +351,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];
|
||||
|
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;
|
||||
}
|
@ -985,11 +985,11 @@ next_prime (uint32_t seed)
|
||||
|
||||
Offset Length Description
|
||||
0000 4 Magic header bytes
|
||||
0004 4 Offset of string table (stoff)
|
||||
0008 4 Offset of name hashing table (hoff)
|
||||
000C 4 Hashing table size (hsize)
|
||||
0010 4 Offset of module table (moff)
|
||||
0014 4 Offset of other conversion module table (ooff)
|
||||
0004 2 Offset of string table (stoff)
|
||||
0006 2 Offset of name hashing table (hoff)
|
||||
0008 2 Hashing table size (hsize)
|
||||
000A 2 Offset of module table (moff)
|
||||
000C 2 Offset of other conversion module table (ooff)
|
||||
|
||||
stoff ??? String table
|
||||
|
||||
@ -1178,6 +1178,9 @@ write_output (void)
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear padding. */
|
||||
memset (&header, 0, sizeof (struct gconvcache_header));
|
||||
|
||||
header.magic = GCONVCACHE_MAGIC;
|
||||
|
||||
iov[0].iov_base = &header;
|
||||
|
Loading…
Reference in New Issue
Block a user