This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch master updated. glibc-2.24-180-g17af5da
- From: aoliva at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 22 Sep 2016 01:03:35 -0000
- Subject: GNU C Library master sources branch master updated. glibc-2.24-180-g17af5da
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via 17af5da98cd2c9ec958421ae2108f877e0945451 (commit)
from 444eacba82f675d4657ad55da67b355536be90ab (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=17af5da98cd2c9ec958421ae2108f877e0945451
commit 17af5da98cd2c9ec958421ae2108f877e0945451
Author: Alexandre Oliva <aoliva@redhat.com>
Date: Wed Sep 21 22:01:16 2016 -0300
[PR19826] fix non-LE TLS in static programs
An earlier fix for TLS dropped early initialization of DTV entries for
modules using static TLS, leaving it for __tls_get_addr to set them
up. That worked on platforms that require the GD access model to be
relaxed to LE in the main executable, but it caused a regression on
platforms that allow GD in the main executable, particularly in
statically-linked programs: they use a custom __tls_get_addr that does
not update the DTV, which fails when the DTV early initialization is
not performed.
In static programs, __libc_setup_tls performs the DTV initialization
for the main thread, but the DTV of other threads is set up in
_dl_allocate_tls_init, so that's the fix that matters.
Restoring the initialization in the remaining functions modified by
this patch was just for uniformity. It's not clear that it is ever
needed: even on platforms that allow GD in the main executable, the
dynamically-linked version of __tls_get_addr would set up the DTV
entries, even for static TLS modules, while updating the DTV counter.
for ChangeLog
[BZ #19826]
* elf/dl-tls.c (_dl_allocate_tls_init): Restore DTV early
initialization of static TLS entries.
* elf/dl-reloc.c (_dl_nothread_init_static_tls): Likewise.
* nptl/allocatestack.c (init_one_static_tls): Likewise.
diff --git a/ChangeLog b/ChangeLog
index abd6995..0fe5350 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2016-09-21 Alexandre Oliva <aoliva@redhat.com>
+
+ [BZ #19826]
+ * elf/dl-tls.c (_dl_allocate_tls_init): Restore DTV early
+ initialization of static TLS entries.
+ * elf/dl-reloc.c (_dl_nothread_init_static_tls): Likewise.
+ * nptl/allocatestack.c (init_one_static_tls): Likewise.
+
2016-09-22 Samuel Thibault <samuel.thibault@ens-lyon.org>
* hurd/hurdmalloc.c (malloc_fork_prepare): Rename to
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 42bddc1..dcab666 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -137,6 +137,12 @@ _dl_nothread_init_static_tls (struct link_map *map)
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
#endif
+ /* Fill in the DTV slot so that a later LD/GD access will find it. */
+ dtv_t *dtv = THREAD_DTV ();
+ assert (map->l_tls_modid <= dtv[-1].counter);
+ dtv[map->l_tls_modid].pointer.to_free = NULL;
+ dtv[map->l_tls_modid].pointer.val = dest;
+
/* Initialize the memory. */
memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
'\0', map->l_tls_blocksize - map->l_tls_initimage_size);
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index 17567ad..60f4c1d 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -538,6 +538,10 @@ _dl_allocate_tls_init (void *result)
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
#endif
+ /* Set up the DTV entry. The simplified __tls_get_addr that
+ some platforms use in static programs requires it. */
+ dtv[map->l_tls_modid].pointer.val = dest;
+
/* Copy the initialization image and clear the BSS part. */
memset (__mempcpy (dest, map->l_tls_initimage,
map->l_tls_initimage_size), '\0',
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
index 60b34dc..3016a2e 100644
--- a/nptl/allocatestack.c
+++ b/nptl/allocatestack.c
@@ -1207,9 +1207,12 @@ init_one_static_tls (struct pthread *curp, struct link_map *map)
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
# endif
- /* We cannot delay the initialization of the Static TLS area, since
- it can be accessed with LE or IE, but since the DTV is only used
- by GD and LD, we can delay its update to avoid a race. */
+ /* Fill in the DTV slot so that a later LD/GD access will find it. */
+ dtv_t *dtv = GET_DTV (TLS_TPADJ (curp));
+ dtv[map->l_tls_modid].pointer.to_free = NULL;
+ dtv[map->l_tls_modid].pointer.val = dest;
+
+ /* Initialize the memory. */
memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
'\0', map->l_tls_blocksize - map->l_tls_initimage_size);
}
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 8 ++++++++
elf/dl-reloc.c | 6 ++++++
elf/dl-tls.c | 4 ++++
nptl/allocatestack.c | 9 ++++++---
4 files changed, 24 insertions(+), 3 deletions(-)
hooks/post-receive
--
GNU C Library master sources