Merge "Initialize main thread TLS before the global stack guard."

This commit is contained in:
Josh Gao 2016-09-15 19:28:56 +00:00 committed by Gerrit Code Review
commit 5622837301
2 changed files with 4 additions and 2 deletions

View File

@ -69,7 +69,9 @@ void __libc_init_main_thread(KernelArgumentBlock& args) {
// The -fstack-protector implementation uses TLS, so make sure that's // The -fstack-protector implementation uses TLS, so make sure that's
// set up before we call any function that might get a stack check inserted. // set up before we call any function that might get a stack check inserted.
// TLS also needs to be set up before errno (and therefore syscalls) can be used.
__set_tls(main_thread.tls); __set_tls(main_thread.tls);
__init_tls(&main_thread);
// Tell the kernel to clear our tid field when we exit, so we're like any other pthread. // Tell the kernel to clear our tid field when we exit, so we're like any other pthread.
// As a side-effect, this tells us our pid (which is the same as the main thread's tid). // As a side-effect, this tells us our pid (which is the same as the main thread's tid).
@ -91,9 +93,9 @@ void __libc_init_main_thread(KernelArgumentBlock& args) {
// before we initialize the TLS. Dynamic executables will initialize their copy of the global // before we initialize the TLS. Dynamic executables will initialize their copy of the global
// stack protector from the one in the main thread's TLS. // stack protector from the one in the main thread's TLS.
__libc_init_global_stack_chk_guard(args); __libc_init_global_stack_chk_guard(args);
__init_thread_stack_guard(&main_thread);
__init_thread(&main_thread); __init_thread(&main_thread);
__init_tls(&main_thread);
// Store a pointer to the kernel argument block in a TLS slot to be // Store a pointer to the kernel argument block in a TLS slot to be
// picked up by the libc constructor. // picked up by the libc constructor.

View File

@ -56,7 +56,6 @@ void __init_tls(pthread_internal_t* thread) {
// Slot 0 must point to itself. The x86 Linux kernel reads the TLS from %fs:0. // Slot 0 must point to itself. The x86 Linux kernel reads the TLS from %fs:0.
thread->tls[TLS_SLOT_SELF] = thread->tls; thread->tls[TLS_SLOT_SELF] = thread->tls;
thread->tls[TLS_SLOT_THREAD_ID] = thread; thread->tls[TLS_SLOT_THREAD_ID] = thread;
__init_thread_stack_guard(thread);
} }
void __init_thread_stack_guard(pthread_internal_t* thread) { void __init_thread_stack_guard(pthread_internal_t* thread) {
@ -182,6 +181,7 @@ static int __allocate_thread(pthread_attr_t* attr, pthread_internal_t** threadp,
thread->mmap_size = mmap_size; thread->mmap_size = mmap_size;
thread->attr = *attr; thread->attr = *attr;
__init_tls(thread); __init_tls(thread);
__init_thread_stack_guard(thread);
*threadp = thread; *threadp = thread;
*child_stack = stack_top; *child_stack = stack_top;