From 0122f28eb99351c1b1690d5e2613988452d04583 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 21 Jul 2009 08:32:54 -0700 Subject: [PATCH 1/6] Add 2.11 news items. --- NEWS | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 6990dcc264..6061d42eb2 100644 --- a/NEWS +++ b/NEWS @@ -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 From 802fe9a1ca0577e8eac28c31a8c20497b15e7e69 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 23 Jul 2009 07:07:53 -0700 Subject: [PATCH 2/6] Handle unloading of DSO with a unique symbol definition. --- ChangeLog | 11 ++++++++++ elf/dl-lookup.c | 11 ++++++++-- elf/tst-unique1.c | 42 +++++++++++++++++++++++++++++++++++--- sysdeps/generic/ldsodefs.h | 2 +- 4 files changed, 60 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 006dd5ac60..bea7ba0e2d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-07-23 Ulrich Drepper + + * 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-21 Ulrich Drepper * sysdeps/x86_64/multiarch/strstr.c: Minor cleanups. Remove diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index fd0d624430..bdc84afa56 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -312,7 +312,7 @@ 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); @@ -332,6 +332,12 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, table[idx].sym = sym; table[idx].map = map; } + + if (table[idx].map->l_type == lt_loaded) + /* Make sure we don't unload this object by + artificially increason the open count. */ + ++table[idx].map->l_direct_opencount; + return; } @@ -410,7 +416,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 #include #include +#include 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; From 077e7700b30df967d9000ebe692894fc5d66df80 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 23 Jul 2009 07:36:34 -0700 Subject: [PATCH 3/6] Some more fixes for the unique symbol handling. The hash value can be zero, so we need a different test for empty slots. And unify the way we prevent a DSO from being unloaded. --- ChangeLog | 3 +++ elf/dl-lookup.c | 9 ++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index bea7ba0e2d..5dc5d41433 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2009-07-23 Ulrich Drepper + * 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. diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index bdc84afa56..1333123b0f 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -318,7 +318,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, 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; @@ -336,7 +336,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, if (table[idx].map->l_type == lt_loaded) /* Make sure we don't unload this object by artificially increason the open count. */ - ++table[idx].map->l_direct_opencount; + table[idx].map->l_flags_1 |= DF_1_NODELETE; return; } @@ -369,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; @@ -392,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); From fe4d2935e8d984d1d6c314eec557921f2c851224 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 23 Jul 2009 07:37:48 -0700 Subject: [PATCH 4/6] Fix comment. --- elf/dl-lookup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 1333123b0f..61e8d7f085 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -335,7 +335,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, if (table[idx].map->l_type == lt_loaded) /* Make sure we don't unload this object by - artificially increason the open count. */ + setting the appropriate flag. */ table[idx].map->l_flags_1 |= DF_1_NODELETE; return; From c15b1d20cd31d9c1498a1863a0a65ecfec4f2513 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 23 Jul 2009 07:40:56 -0700 Subject: [PATCH 5/6] Minor optimization of unloading prevention patch. References to unique symbols from copy relocations can only come from executables which cannot be unloaded anyway. Optimize the code to set the unload flag a bit. --- elf/dl-lookup.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 61e8d7f085..18f728812e 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -331,12 +331,12 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, { table[idx].sym = sym; table[idx].map = map; - } - if (table[idx].map->l_type == lt_loaded) - /* Make sure we don't unload this object by - setting the appropriate flag. */ - table[idx].map->l_flags_1 |= DF_1_NODELETE; + 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; } From 9b6bf8a30292288c9536efb72d80020f189bf9a6 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 23 Jul 2009 08:02:07 -0700 Subject: [PATCH 6/6] Preserve stack alignment in i386 makecontext. --- ChangeLog | 3 +++ sysdeps/unix/sysv/linux/i386/makecontext.S | 10 ++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5dc5d41433..31ff6a17d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2009-07-23 Ulrich Drepper + * 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. 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 , 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