aboutsummaryrefslogtreecommitdiff
path: root/elf/dl-tls_init_tp.c
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2021-05-10 10:31:41 +0200
committerFlorian Weimer <fweimer@redhat.com>2021-05-10 10:31:41 +0200
commitd017b0ab5a181dce4145f3a1b3b27e3341abd201 (patch)
treecfe65201d70b7df83848838256d2c7288dcee67b /elf/dl-tls_init_tp.c
parent0df5d8d404fbf6a7802737b0f9d32ab3376cec86 (diff)
downloadglibc-d017b0ab5a181dce4145f3a1b3b27e3341abd201.tar
glibc-d017b0ab5a181dce4145f3a1b3b27e3341abd201.tar.gz
glibc-d017b0ab5a181dce4145f3a1b3b27e3341abd201.tar.bz2
glibc-d017b0ab5a181dce4145f3a1b3b27e3341abd201.zip
elf: Introduce __tls_pre_init_tp
This is an early variant of __tls_init_tp, primarily for initializing thread-related elements of _rtld_global/GL. Some existing initialization code not needed for NPTL is moved into the generic version of this function. Tested-by: Carlos O'Donell <carlos@redhat.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'elf/dl-tls_init_tp.c')
-rw-r--r--elf/dl-tls_init_tp.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/elf/dl-tls_init_tp.c b/elf/dl-tls_init_tp.c
index 728cd84c00..d84adc992c 100644
--- a/elf/dl-tls_init_tp.c
+++ b/elf/dl-tls_init_tp.c
@@ -18,6 +18,35 @@
#include <ldsodefs.h>
+#if defined SHARED && defined _LIBC_REENTRANT \
+ && defined __rtld_lock_default_lock_recursive
+static void
+rtld_lock_default_lock_recursive (void *lock)
+{
+ __rtld_lock_default_lock_recursive (lock);
+}
+
+static void
+rtld_lock_default_unlock_recursive (void *lock)
+{
+ __rtld_lock_default_unlock_recursive (lock);
+}
+#endif
+
+void
+__tls_pre_init_tp (void)
+{
+#if !THREAD_GSCOPE_IN_TCB
+ GL(dl_init_static_tls) = &_dl_nothread_init_static_tls;
+#endif
+
+#if defined SHARED && defined _LIBC_REENTRANT \
+ && defined __rtld_lock_default_lock_recursive
+ GL(dl_rtld_lock_recursive) = rtld_lock_default_lock_recursive;
+ GL(dl_rtld_unlock_recursive) = rtld_lock_default_unlock_recursive;
+#endif
+}
+
void
__tls_init_tp (void)
{