diff options
author | Andreas Schwab <schwab@redhat.com> | 2009-07-23 18:35:00 +0200 |
---|---|---|
committer | Andreas Schwab <schwab@redhat.com> | 2009-07-23 18:35:00 +0200 |
commit | cae1d96323ba59248eaa9eedcffb6fac7e35a8cc (patch) | |
tree | d24a2c26ec9c0d70d0a52c0a35de786058854984 | |
parent | d4192d9bce9e44adb2da4f2141713df9b335052f (diff) | |
parent | 9b6bf8a30292288c9536efb72d80020f189bf9a6 (diff) |
Merge commit 'origin/master' into fedora/master
Conflicts:
ChangeLog
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | NEWS | 23 | ||||
-rw-r--r-- | elf/dl-lookup.c | 18 | ||||
-rw-r--r-- | elf/tst-unique1.c | 42 | ||||
-rw-r--r-- | sysdeps/generic/ldsodefs.h | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/makecontext.S | 10 |
6 files changed, 95 insertions, 17 deletions
@@ -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). @@ -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. @@ -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 diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index fd0d624430..18f728812e 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -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; @@ -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; } @@ -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; @@ -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); @@ -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); diff --git a/elf/tst-unique1.c b/elf/tst-unique1.c index 9b7996cd96..46d41d9ff4 100644 --- a/elf/tst-unique1.c +++ b/elf/tst-unique1.c @@ -1,6 +1,7 @@ #include <config.h> #include <dlfcn.h> #include <stdio.h> +#include <sys/mman.h> static int do_test (void) @@ -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 () diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 30f9d23091..e18e60f73f 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -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; diff --git a/sysdeps/unix/sysv/linux/i386/makecontext.S b/sysdeps/unix/sysv/linux/i386/makecontext.S index ad2340555a..5b98e64db2 100644 --- a/sysdeps/unix/sysv/linux/i386/makecontext.S +++ b/sysdeps/unix/sysv/linux/i386/makecontext.S @@ -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. @@ -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 |