This is the mail archive of the libc-alpha@sourceware.org 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]

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


On Wed, Mar 20, 2013 at 3:44 PM, Roland McGrath <roland@hack.frob.com> wrote:
> 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.
>
>
> Thanks,
> Roland
>
>
> 2013-03-20  Roland McGrath  <roland@hack.frob.com>
>
>         * 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.
>
> nptl/
> 2013-03-20  Roland McGrath  <roland@hack.frob.com>
>
>         * 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)
> +#endif
> +    __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.  */
> +attribute_hidden
>  void
>  __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)
> +#endif
> +    __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

Since __call_tls_dtors  is marked as hidden in libc.so,
how can libpthread.so use it?

-- 
H.J.


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