This is the mail archive of the mailing list for the glibc project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH roland/weak-tls-dtors] Avoid unconditional __call_tls_dtors calls in static linking.

The cxa_thread_atexit_impl addition had a few issues that nobody caught in
review.  Let's take more care, folks.

1. libc_hidden_proto et al are not for internal functions.
   You don't need that complexity.  Just declare it hidden and you're done.
   The only reason we have that stuff is for public functions called from
   elsewhere in the library.

2. Rampant inattention to unconditional cruft in static linking.
   This problem has been bad for years and this is a drop in the bucket.
   But we don't need any more drops.  Always think about the static linking
   case, and think very carefully when adding calls to new code that might
   bring in a lot of other references.

If nobody sees any problems with this in a day or three, I'll put it in.


2013-03-20  Roland McGrath  <>

	* include/stdlib.h (__call_tls_dtors): Declare with attribute_hidden.
	Drop libc_hidden_proto.  Declare with __attribute__ ((weak)).
	* stdlib/cxa_thread_atexit_impl.c (__call_tls_dtors): Define with
	attribute_hidden.  Drop libc_hidden_def.
	* stdlib/exit.c (__libc_atexit) [!SHARED]:
	Call __call_tls_dtors only if it's not NULL.

2013-03-20  Roland McGrath  <>

	* pthread_create.c (start_thread) [!SHARED]:
	Call __call_tls_dtors only if it's not NULL.

--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -102,8 +102,7 @@ extern int __cxa_atexit_internal (void (*func) (void *), void *arg, void *d)
 extern int __cxa_thread_atexit_impl (void (*func) (void *), void *arg,
 				     void *d);
-extern void __call_tls_dtors (void);
-libc_hidden_proto (__call_tls_dtors);
+extern void __call_tls_dtors (void) attribute_hidden __attribute__ ((weak));
 extern void __cxa_finalize (void *d);
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -312,7 +312,10 @@ start_thread (void *arg)
   /* Call destructors for the thread_local TLS variables.  */
-  __call_tls_dtors ();
+#ifndef SHARED
+  if (&__call_tls_dtors != NULL)
+    __call_tls_dtors ();
   /* Run the destructor for the thread-local data.  */
   __nptl_deallocate_tsd ();
--- a/stdlib/cxa_thread_atexit_impl.c
+++ b/stdlib/cxa_thread_atexit_impl.c
@@ -76,7 +76,8 @@ __cxa_thread_atexit_impl (dtor_func func, void *obj, void *dso_symbol)
 /* Call the destructors.  This is called either when a thread returns from the
-   initial function or when the process exits via the exit(3) function.  */
+   initial function or when the process exits via the exit function.  */
 __call_tls_dtors (void)
@@ -99,4 +100,3 @@ __call_tls_dtors (void)
       free (cur);
-libc_hidden_def (__call_tls_dtors)
--- a/stdlib/exit.c
+++ b/stdlib/exit.c
@@ -34,7 +34,10 @@ __run_exit_handlers (int status, struct exit_function_list **listp,
 		     bool run_list_atexit)
   /* First, call the TLS destructors.  */
-  __call_tls_dtors ();
+#ifndef SHARED
+  if (&__call_tls_dtors != NULL)
+    __call_tls_dtors ();
   /* We do it this way to handle recursive calls to exit () made by
      the functions registered with `atexit' and `on_exit'. We call

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]