summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@redhat.com>2009-07-23 18:35:00 +0200
committerAndreas Schwab <schwab@redhat.com>2009-07-23 18:35:00 +0200
commitcae1d96323ba59248eaa9eedcffb6fac7e35a8cc (patch)
treed24a2c26ec9c0d70d0a52c0a35de786058854984
parentd4192d9bce9e44adb2da4f2141713df9b335052f (diff)
parent9b6bf8a30292288c9536efb72d80020f189bf9a6 (diff)
Merge commit 'origin/master' into fedora/master
Conflicts: ChangeLog
-rw-r--r--ChangeLog17
-rw-r--r--NEWS23
-rw-r--r--elf/dl-lookup.c18
-rw-r--r--elf/tst-unique1.c42
-rw-r--r--sysdeps/generic/ldsodefs.h2
-rw-r--r--sysdeps/unix/sysv/linux/i386/makecontext.S10
6 files changed, 95 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 7b450994f7..6f7026debf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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).
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
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