Skip to content

Commit

Permalink
[BZ #776]
Browse files Browse the repository at this point in the history
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
int dummy1;
1 change: 1 addition & 0 deletions elf/unload3mod2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
int dummy2;
8 changes: 8 additions & 0 deletions elf/unload3mod3.c
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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.