mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 03:33:33 +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>
|
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
|
||||||
|
@ -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
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
|
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user