Merge "Initialize main thread TLS before the global stack guard."
This commit is contained in:
commit
5622837301
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue