summaryrefslogtreecommitdiff
path: root/nptl/nptl-init.c
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2021-03-16 18:05:39 +0100
committerFlorian Weimer <fweimer@redhat.com>2021-03-18 23:06:12 +0100
commit4535f0d9fde4973355a550bf8e7a3fcbcc3810f3 (patch)
treec863139e33f868362d0aa3d84fba6207b4e2dde6 /nptl/nptl-init.c
parent0e49770ff2292f43d16169df5aaccce22046f3ff (diff)
downloadglibc-4535f0d9fde4973355a550bf8e7a3fcbcc3810f3.tar.gz
nptl: Move part of TCB initialization from libpthread to __tls_init_tp
This initalization should only happen once for the main thread's TCB. At present, auditors can achieve this by not linking against libpthread. If libpthread becomes part of libc, doing this initialization in libc would happen for every audit namespace, or too late (if it happens from the main libc only). That's why moving this code into ld.so seems the right thing to do, right after the TCB initialization. For !__ASSUME_SET_ROBUST_LIST ports, this also moves the symbol __set_robust_list_avail into ld.so, as __nptl_set_robust_list_avail. It also turned into a proper boolean flag. Inline the __pthread_initialize_pids function because it seems no longer useful as a separate function.
Diffstat (limited to 'nptl/nptl-init.c')
-rw-r--r--nptl/nptl-init.c36
1 files changed, 2 insertions, 34 deletions
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index de64e34783..5913bf7272 100644
--- a/nptl/nptl-init.c
+++ b/nptl/nptl-init.c
@@ -36,7 +36,6 @@
#include <futex-internal.h>
#include <kernel-features.h>
#include <libc-pointer-arith.h>
-#include <pthread-pids.h>
#include <pthread_mutex_conf.h>
#ifndef TLS_MULTIPLE_THREADS_IN_TCB
@@ -48,15 +47,6 @@ int *__libc_multiple_threads_ptr attribute_hidden;
size_t __static_tls_size;
size_t __static_tls_align_m1;
-#ifndef __ASSUME_SET_ROBUST_LIST
-/* Negative if we do not have the system call and we can use it. */
-int __set_robust_list_avail;
-# define set_robust_list_not_avail() \
- __set_robust_list_avail = -1
-#else
-# define set_robust_list_not_avail() do { } while (0)
-#endif
-
/* Version of the library, used in libthread_db to detect mismatches. */
static const char nptl_version[] __attribute_used__ = VERSION;
@@ -194,31 +184,9 @@ static bool __nptl_initial_report_events __attribute_used__;
void
__pthread_initialize_minimal_internal (void)
{
- /* Minimal initialization of the thread descriptor. */
+ /* Partial initialization of the TCB already happened in TLS_INIT_TP
+ and __tls_init_tp. */
struct pthread *pd = THREAD_SELF;
- __pthread_initialize_pids (pd);
- THREAD_SETMEM (pd, specific[0], &pd->specific_1stblock[0]);
- THREAD_SETMEM (pd, user_stack, true);
-
- /* Initialize the robust mutex data. */
- {
-#if __PTHREAD_MUTEX_HAVE_PREV
- pd->robust_prev = &pd->robust_head;
-#endif
- pd->robust_head.list = &pd->robust_head;
- pd->robust_head.futex_offset = (offsetof (pthread_mutex_t, __data.__lock)
- - offsetof (pthread_mutex_t,
- __data.__list.__next));
- int res = INTERNAL_SYSCALL_CALL (set_robust_list, &pd->robust_head,
- sizeof (struct robust_list_head));
- if (INTERNAL_SYSCALL_ERROR_P (res))
- set_robust_list_not_avail ();
- }
-
- /* Set initial thread's stack block from 0 up to __libc_stack_end.
- It will be bigger than it actually is, but for unwind.c/pt-longjmp.c
- purposes this is good enough. */
- THREAD_SETMEM (pd, stackblock_size, (size_t) __libc_stack_end);
/* Before initializing GL (dl_stack_user), the debugger could not
find us and had to set __nptl_initial_report_events. Propagate