Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[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.
  • Loading branch information
Ulrich Drepper committed Mar 3, 2005
1 parent fab0abb commit 2e2b6e2
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 35 deletions.
22 changes: 22 additions & 0 deletions 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
Expand Down
30 changes: 0 additions & 30 deletions elf/dl-close.c
Expand Up @@ -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];
Expand Down
36 changes: 36 additions & 0 deletions elf/tst-global1.c
@@ -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 changes: 41 additions & 0 deletions elf/unload3.c
@@ -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 change: 1 addition & 0 deletions elf/unload3mod1.c
@@ -0,0 +1 @@
int dummy1;
1 change: 1 addition & 0 deletions elf/unload3mod2.c
@@ -0,0 +1 @@
int dummy2;
8 changes: 8 additions & 0 deletions elf/unload3mod3.c
@@ -0,0 +1,8 @@
#include <stdio.h>

int
foo (int x)
{
puts ("foo");
return x * 2;
}
11 changes: 11 additions & 0 deletions elf/unload3mod4.c
@@ -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;
}
13 changes: 8 additions & 5 deletions iconv/iconvconfig.c
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 2e2b6e2

Please sign in to comment.