Skip to content

Commit

Permalink
Merge commit 'origin/master' into fedora/master
Browse files Browse the repository at this point in the history
Conflicts:
	ChangeLog
  • Loading branch information
Andreas Schwab committed Jul 23, 2009
2 parents d4192d9 + 9b6bf8a commit cae1d96
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 17 deletions.
17 changes: 17 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
2009-07-23 Ulrich Drepper <drepper@redhat.com>

* sysdeps/unix/sysv/linux/i386/makecontext.S: Ensure we preserve the
stack alignment in the exit code.

* elf/dl-lookup.c (dl_lookup_x): The hashval for unique symbol can
potentially be zero.

* elf/tst-unique1.c: Extend test to check for unloading DSO with
unique symbol definition.
Patch by Jakub Jelinek.
* elf/dl-lookup.c (do_lookup_x): When entering a new unique symbol,
make sure the object with the definition cannot be unloaded. Adjust
a few types.
* sysdeps/generic/ldsodefs.h (struct rtld_global): The map element in
the unique symbol hash table should not be const.

2009-07-22 Jakub Jelinek <jakub@redhat.com>

* Makeconfig (ASFLAGS): Append $(sysdep-ASFLAGS).
Expand Down
23 changes: 22 additions & 1 deletion NEWS
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
GNU C Library NEWS -- history of user-visible changes. 2009-6-1
GNU C Library NEWS -- history of user-visible changes. 2009-7-21
Copyright (C) 1992-2008, 2009 Free Software Foundation, Inc.
See the end for copying conditions.

Expand All @@ -16,6 +16,27 @@ Version 2.11
* STT_GNU_IFUNC is now supported in static executables.
Implemented by H.J. Lu.

* New optimized string functions for x86-64: strstr, strcasestr, memcmp,
strcspn, strpbrk, strspn, strcpy, stpcpy, strncpy, strcmp, strncmp.
Contributed by H.J. Lu.

strlen, rawmemchr.
Implemented by Ulrich Drepper.

* AVX support in x86-64 auditing support in ld.so.
Implemented by H.J. Lu.

* STB_GNU_UNIQUE support added.
Implemented by Ulrich Drepper.

* Implement second fallback mode for optimized DNS lookup for even more
broken environments. If two requests from the same port are not
handled correctly close the socket and open a new one before sending
the second request. The 'single-request-reopen' option in /etc/resolv.conf
can be used to select this mode right away, instead of rediscovering the
necessity is every process again.
Implemented by Ulrich Drepper.


Version 2.10

Expand Down
18 changes: 12 additions & 6 deletions elf/dl-lookup.c
Original file line number Diff line number Diff line change
Expand Up @@ -312,13 +312,13 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
definition we have to use it. */
void enter (struct unique_sym *table, size_t size,
unsigned int hash, const char *name,
const ElfW(Sym) *sym, const struct link_map *map)
const ElfW(Sym) *sym, struct link_map *map)
{
size_t idx = hash % size;
size_t hash2 = 1 + hash % (size - 2);
while (1)
{
if (table[idx].hashval == 0)
if (table[idx].name == NULL)
{
table[idx].hashval = hash;
table[idx].name = strtab + sym->st_name;
Expand All @@ -331,7 +331,13 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
{
table[idx].sym = sym;
table[idx].map = map;

if (map->l_type == lt_loaded)
/* Make sure we don't unload this object by
setting the appropriate flag. */
map->l_flags_1 |= DF_1_NODELETE;
}

return;
}

Expand Down Expand Up @@ -363,8 +369,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
return 1;
}

if (entries[idx].hashval == 0
&& entries[idx].name == NULL)
if (entries[idx].name == NULL)
break;

idx += hash2;
Expand All @@ -386,7 +391,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
}

for (idx = 0; idx < size; ++idx)
if (entries[idx].hashval != 0)
if (entries[idx].name != NULL)
enter (newentries, newsize, entries[idx].hashval,
entries[idx].name, entries[idx].sym,
entries[idx].map);
Expand All @@ -410,7 +415,8 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
tab->free = free;
}

enter (entries, size, new_hash, strtab + sym->st_name, sym, map);
enter (entries, size, new_hash, strtab + sym->st_name, sym,
(struct link_map *) map);
++tab->n_elements;

__rtld_lock_unlock_recursive (tab->lock);
Expand Down
42 changes: 39 additions & 3 deletions elf/tst-unique1.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <config.h>
#include <dlfcn.h>
#include <stdio.h>
#include <sys/mman.h>

static int
do_test (void)
Expand Down Expand Up @@ -30,10 +31,45 @@ do_test (void)
puts ("cannot locate f in tst-unique1mod2");
return 1;
}
return f2 (f1 ());
#else
return 0;
if (f2 (f1 ()))
{
puts ("f from tst-unique1mod2 failed");
return 1;
}
dlclose (h2);
dlclose (h1);
mmap (NULL, 1024 * 1024 * 16, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
h2 = dlopen ("tst-unique1mod2.so", RTLD_LAZY);
if (h2 == NULL)
{
puts ("cannot load tst-unique1mod2");
return 1;
}
f2 = dlsym (h2, "f");
if (f2 == NULL)
{
puts ("cannot locate f in tst-unique1mod2");
return 1;
}
h1 = dlopen ("tst-unique1mod1.so", RTLD_LAZY);
if (h1 == NULL)
{
puts ("cannot load tst-unique1mod1");
return 1;
}
f1 = dlsym (h1, "f");
if (f1 == NULL)
{
puts ("cannot locate f in tst-unique1mod1");
return 1;
}
if (f2 (f1 ()))
{
puts ("f from tst-unique1mod2 failed");
return 1;
}
#endif
return 0;
}

#define TEST_FUNCTION do_test ()
Expand Down
2 changes: 1 addition & 1 deletion sysdeps/generic/ldsodefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,7 @@ struct rtld_global
uint32_t hashval;
const char *name;
const ElfW(Sym) *sym;
const struct link_map *map;
struct link_map *map;
} *entries;
size_t size;
size_t n_elements;
Expand Down
10 changes: 4 additions & 6 deletions sysdeps/unix/sysv/linux/i386/makecontext.S
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Create new context.
Copyright (C) 2001, 2002, 2005, 2007, 2008 Free Software Foundation, Inc.
Copyright (C) 2001,2002,2005,2007,2008,2009 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
Expand Down Expand Up @@ -105,17 +105,15 @@ L(exitcode):
1: popl %ebx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
#endif
popl %eax /* This is the next context. */
testl %eax, %eax
cmpl $0, (%esp) /* Check the next context. */
je 2f /* If it is zero exit. */

pushl %eax
call JUMPTARGET(__setcontext)
/* If this returns (which can happen if the syscall fails) we'll
exit the program with the return error value (-1). */

2: pushl %eax
call HIDDEN_JUMPTARGET(exit)
movl %eax, (%esp)
2: call HIDDEN_JUMPTARGET(exit)
/* The 'exit' call should never return. In case it does cause
the process to terminate. */
hlt
Expand Down

0 comments on commit cae1d96

Please sign in to comment.