Sfoglia il codice sorgente

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 anni fa
parent
commit
13a6cfff31
2 ha cambiato i file con 12 aggiunte e 18 eliminazioni
  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);