Selaa lähdekoodia

fix static binaries linked with pthread and compiled with ssp

Move TLS initialization for static builds up to the calling
function as suggested by Daniel Fahlgren.

Reported-By: Daniel Fahlgren <daniel@fahlgren.se>
Waldemar Brodkorb 8 vuotta sitten
vanhempi
commit
13a6cfff31
2 muutettua tiedostoa jossa 12 lisäystä ja 18 poistoa
  1. 12 0
      libc/misc/internals/__uClibc_main.c
  2. 0 18
      libpthread/nptl/init.c

+ 12 - 0
libc/misc/internals/__uClibc_main.c

@@ -32,6 +32,7 @@
 #include <pthread-functions.h>
 #include <not-cancel.h>
 #include <atomic.h>
+#include <tls.h>
 #endif
 #ifdef __UCLIBC_HAS_THREADS__
 #include <pthread.h>
@@ -132,6 +133,10 @@ extern void __pthread_initialize_minimal(void);
 #endif
 #endif
 
+#ifndef SHARED
+extern void __libc_setup_tls (size_t tcbsize, size_t tcbalign);
+#endif
+
 /* If __UCLIBC_FORMAT_SHARED_FLAT__, all array initialisation and finalisation
  * is handled by the routines passed to __uClibc_main().  */
 #if defined (__UCLIBC_CTOR_DTOR__) && !defined (__UCLIBC_FORMAT_SHARED_FLAT__)
@@ -243,6 +248,13 @@ void __uClibc_init(void)
     __pagesize = PAGE_SIZE;
 
 #ifdef __UCLIBC_HAS_THREADS__
+
+#if defined (__UCLIBC_HAS_THREADS_NATIVE__) && !defined (SHARED)
+    /* Unlike in the dynamically linked case the dynamic linker has not
+       taken care of initializing the TLS data structures.  */
+    __libc_setup_tls (TLS_TCB_SIZE, TLS_TCB_ALIGN);
+#endif
+
     /* Before we start initializing uClibc we have to call
      * __pthread_initialize_minimal so we can use pthread_locks
      * whenever they are needed.

+ 0 - 18
libpthread/nptl/init.c

@@ -60,15 +60,9 @@ int __have_futex_clock_realtime;
 /* Version of the library, used in libthread_db to detect mismatches.  */
 static const char nptl_version[] __attribute_used__ = VERSION;
 
-
-#ifndef SHARED
-extern void __libc_setup_tls (size_t tcbsize, size_t tcbalign);
-#endif
-
 #ifdef SHARED
 static void nptl_freeres (void);
 
-
 static const struct pthread_functions pthread_functions =
   {
     .ptr_pthread_attr_destroy = __pthread_attr_destroy,
@@ -265,18 +259,6 @@ __pthread_initialize_minimal_internal (void)
     return;
   initialized = 1;
 
-#ifndef SHARED
-  /* Unlike in the dynamically linked case the dynamic linker has not
-     taken care of initializing the TLS data structures.  */
-  __libc_setup_tls (TLS_TCB_SIZE, TLS_TCB_ALIGN);
-
-  /* We must prevent gcc from being clever and move any of the
-     following code ahead of the __libc_setup_tls call.  This function
-     will initialize the thread register which is subsequently
-     used.  */
-  __asm__ __volatile__ ("");
-#endif
-
   /* Minimal initialization of the thread descriptor.  */
   struct pthread *pd = THREAD_SELF;
   INTERNAL_SYSCALL_DECL (err);