public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Siddhesh Poyarekar <siddhesh@gotplt.org>
To: Florian Weimer <fweimer@redhat.com>, libc-alpha@sourceware.org
Subject: Re: [PATCH v6] elf: Rework exception handling in the dynamic loader [BZ #25486]
Date: Wed, 2 Nov 2022 08:33:24 -0400	[thread overview]
Message-ID: <418034c6-112d-2127-d2f9-7594fa787c3e@gotplt.org> (raw)
In-Reply-To: <878rl1pb0x.fsf@oldenburg.str.redhat.com>



On 2022-10-27 10:59, Florian Weimer via Libc-alpha wrote:
> The old exception handling implementation used function interposition
> to replace the dynamic loader implementation (no TLS support) with the
> libc implementation (TLS support).  This results in problems if the
> link order between the dynamic loader and libc is reversed (bug 25486).
> 
> The new implementation moves the entire implementation of the
> exception handling functions back into the dynamic loader, using
> THREAD_GETMEM and THREAD_SETMEM for thread-local data support.
> These depends on Hurd support for these macros, added in commit
> b65a82e4e757c1e6cb7073916 ("hurd: Add THREAD_GET/SETMEM/_NC").
> 
> One small obstacle is that the exception handling facilities are used
> before the TCB has been set up, so a check is needed if the TCB is
> available.  If not, a regular global variable is used to store the
> exception handling information.
> 
> Also rename dl-error.c to dl-catch.c, to avoid confusion with the
> dlerror function.
> 
> ---

LGTM.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

> v6: localplt.data adjustments for loongarch and or1k.
> 
>   elf/Makefile                                       |   3 +-
>   elf/Versions                                       |   8 +-
>   elf/{dl-error-skeleton.c => dl-catch.c}            | 154 ++++++++++-----------
>   elf/dl-error-minimal.c                             |  23 ---
>   elf/dl-error.c                                     |  27 ----
>   elf/rtld.c                                         |   2 +-
>   nptl/descr.h                                       |   3 +
>   sysdeps/generic/ldsodefs.h                         |  12 +-
>   sysdeps/generic/localplt.data                      |   5 -
>   sysdeps/mach/hurd/i386/localplt.data               |   5 -
>   sysdeps/mach/hurd/i386/tls.h                       |   3 +
>   sysdeps/unix/sysv/linux/aarch64/localplt.data      |   5 -
>   sysdeps/unix/sysv/linux/alpha/localplt.data        |   5 -
>   sysdeps/unix/sysv/linux/arc/localplt.data          |   5 -
>   sysdeps/unix/sysv/linux/arm/localplt.data          |   5 -
>   sysdeps/unix/sysv/linux/csky/localplt.data         |   5 -
>   sysdeps/unix/sysv/linux/hppa/localplt.data         |   5 -
>   sysdeps/unix/sysv/linux/i386/localplt.data         |   5 -
>   sysdeps/unix/sysv/linux/ia64/localplt.data         |   5 -
>   sysdeps/unix/sysv/linux/loongarch/localplt.data    |   5 -
>   .../unix/sysv/linux/m68k/coldfire/localplt.data    |   5 -
>   sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data  |   5 -
>   sysdeps/unix/sysv/linux/microblaze/localplt.data   |   5 -
>   sysdeps/unix/sysv/linux/nios2/localplt.data        |   5 -
>   sysdeps/unix/sysv/linux/or1k/localplt.data         |   5 -
>   .../sysv/linux/powerpc/powerpc32/fpu/localplt.data |   5 -
>   .../linux/powerpc/powerpc32/nofpu/localplt.data    |   5 -
>   .../sysv/linux/powerpc/powerpc64/localplt.data     |   5 -
>   sysdeps/unix/sysv/linux/riscv/localplt.data        |   5 -
>   sysdeps/unix/sysv/linux/s390/localplt.data         |   5 -
>   sysdeps/unix/sysv/linux/sh/localplt.data           |   5 -
>   .../unix/sysv/linux/sparc/sparc32/localplt.data    |   5 -
>   .../unix/sysv/linux/sparc/sparc64/localplt.data    |   5 -
>   sysdeps/x86_64/localplt.data                       |   5 -
>   34 files changed, 89 insertions(+), 271 deletions(-)
> 
> diff --git a/elf/Makefile b/elf/Makefile
> index 86c960cf8a..a8dc143c5b 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -34,7 +34,6 @@ routines = \
>     dl-addr \
>     dl-addr-obj \
>     dl-early_allocate \
> -  dl-error \
>     dl-iteratephdr \
>     dl-libc \
>     dl-origin \
> @@ -54,6 +53,7 @@ routines = \
>   dl-routines = \
>     dl-call-libc-early-init \
>     dl-call_fini \
> +  dl-catch \
>     dl-close \
>     dl-debug \
>     dl-debug-symbols \
> @@ -134,7 +134,6 @@ rtld-routines = \
>     dl-diagnostics-cpu \
>     dl-diagnostics-kernel \
>     dl-environ \
> -  dl-error-minimal \
>     dl-hwcaps \
>     dl-hwcaps-subdirs \
>     dl-hwcaps_split \
> diff --git a/elf/Versions b/elf/Versions
> index a9ff278de7..4614acea3e 100644
> --- a/elf/Versions
> +++ b/elf/Versions
> @@ -31,10 +31,6 @@ libc {
>     GLIBC_PRIVATE {
>       # functions used in other libraries
>       __libc_early_init;
> -
> -    # Internal error handling support.  Interposes the functions in ld.so.
> -    _dl_signal_exception; _dl_catch_exception;
> -    _dl_signal_error; _dl_catch_error;
>     }
>   }
>   
> @@ -77,10 +73,8 @@ ld {
>   
>       # Internal error handling support.
>       _dl_exception_create; _dl_exception_create_format; _dl_exception_free;
> -
> -    # Internal error handling support.  Interposed by libc.so.
>       _dl_signal_exception; _dl_catch_exception;
> -    _dl_signal_error; _dl_catch_error;
> +    _dl_signal_error;
>   
>       # Set value of a tunable.
>       __tunable_get_val;
> diff --git a/elf/dl-error-skeleton.c b/elf/dl-catch.c
> similarity index 75%
> rename from elf/dl-error-skeleton.c
> rename to elf/dl-catch.c
> index 8abf437f87..54763dd34e 100644
> --- a/elf/dl-error-skeleton.c
> +++ b/elf/dl-catch.c
> @@ -1,4 +1,4 @@
> -/* Template for error handling for runtime dynamic linker.
> +/* Exception handling in the dynamic linker.
>      Copyright (C) 1995-2022 Free Software Foundation, Inc.
>      This file is part of the GNU C Library.
>   
> @@ -16,16 +16,6 @@
>      License along with the GNU C Library; if not, see
>      <https://www.gnu.org/licenses/>.  */
>   
> -/* The following macro needs to be defined before including this
> -   skeleton file:
> -
> -   DL_ERROR_BOOTSTRAP
> -
> -     If 1, do not use TLS and implement _dl_signal_cerror and
> -     _dl_receive_error.  If 0, TLS is used, and the variants with
> -     error callbacks are not provided.  */
> -
> -
>   #include <libintl.h>
>   #include <setjmp.h>
>   #include <stdbool.h>
> @@ -34,39 +24,54 @@
>   #include <unistd.h>
>   #include <ldsodefs.h>
>   #include <stdio.h>
> +#include <tls.h>
>   
>   /* This structure communicates state between _dl_catch_error and
>      _dl_signal_error.  */
> -struct catch
> +struct rtld_catch
>     {
>       struct dl_exception *exception; /* The exception data is stored there.  */
>       volatile int *errcode;	/* Return value of _dl_signal_error.  */
>       jmp_buf env;		/* longjmp here on error.  */
>     };
>   
> -/* Multiple threads at once can use the `_dl_catch_error' function.  The
> -   calls can come from `_dl_map_object_deps', `_dlerror_run', or from
> -   any of the libc functionality which loads dynamic objects (NSS, iconv).
> -   Therefore we have to be prepared to save the state in thread-local
> -   memory.  */
> -#if !DL_ERROR_BOOTSTRAP
> -static __thread struct catch *catch_hook attribute_tls_model_ie;
> -#else
> -/* The version of this code in ld.so cannot use thread-local variables
> -   and is used during bootstrap only.  */
> -static struct catch *catch_hook;
> +/* Multiple threads at once can use the `_dl_catch_error' function.
> +   The calls can come from `_dl_map_object_deps', `_dlerror_run', or
> +   from any of the libc functionality which loads dynamic objects
> +   (NSS, iconv).  Therefore we have to be prepared to save the state
> +   in thread-local memory.  We use THREAD_GETMEM and THREAD_SETMEM
> +   instead of ELF TLS because ELF TLS is not available in the dynamic
> +   loader.  Additionally, the exception handling mechanism must be
> +   usable before the TCB has been set up, which is why
> +   rtld_catch_notls is used if !__rtld_tls_init_tp_called.  This is
> +   not needed for static builds, where initialization completes before
> +   static dlopen etc. can be called.  */
> +
> +#if IS_IN (rtld)
> +static struct rtld_catch *rtld_catch_notls;
>   #endif
>   
> -#if DL_ERROR_BOOTSTRAP
> -/* This points to a function which is called when an continuable error is
> -   received.  Unlike the handling of `catch' this function may return.
> -   The arguments will be the `errstring' and `objname'.
> +static struct rtld_catch *
> +get_catch (void)
> +{
> +#if IS_IN (rtld)
> +  if (!__rtld_tls_init_tp_called)
> +    return rtld_catch_notls;
> +  else
> +#endif
> +    return THREAD_GETMEM (THREAD_SELF, rtld_catch);
> +}
>   
> -   Since this functionality is not used in normal programs (only in ld.so)
> -   we do not care about multi-threaded programs here.  We keep this as a
> -   global variable.  */
> -static receiver_fct receiver;
> -#endif /* DL_ERROR_BOOTSTRAP */
> +static void
> +set_catch (struct rtld_catch *catch)
> +{
> +#if IS_IN (rtld)
> +  if (!__rtld_tls_init_tp_called)
> +    rtld_catch_notls = catch;
> +  else
> +#endif
> +    THREAD_SETMEM (THREAD_SELF, rtld_catch, catch);
> +}
>   
>   /* Lossage while resolving the program's own symbols is always fatal.  */
>   static void
> @@ -89,7 +94,7 @@ void
>   _dl_signal_exception (int errcode, struct dl_exception *exception,
>   		      const char *occasion)
>   {
> -  struct catch *lcatch = catch_hook;
> +  struct rtld_catch *lcatch = get_catch ();
>     if (lcatch != NULL)
>       {
>         *lcatch->exception = *exception;
> @@ -101,13 +106,13 @@ _dl_signal_exception (int errcode, struct dl_exception *exception,
>     else
>       fatal_error (errcode, exception->objname, occasion, exception->errstring);
>   }
> -libc_hidden_def (_dl_signal_exception)
> +rtld_hidden_def (_dl_signal_exception)
>   
>   void
>   _dl_signal_error (int errcode, const char *objname, const char *occation,
>   		  const char *errstring)
>   {
> -  struct catch *lcatch = catch_hook;
> +  struct rtld_catch *lcatch = get_catch ();
>   
>     if (! errstring)
>       errstring = N_("DYNAMIC LINKER BUG!!!");
> @@ -123,10 +128,18 @@ _dl_signal_error (int errcode, const char *objname, const char *occation,
>     else
>       fatal_error (errcode, objname, occation, errstring);
>   }
> -libc_hidden_def (_dl_signal_error)
> +rtld_hidden_def (_dl_signal_error)
>   
> +#if IS_IN (rtld)
> +/* This points to a function which is called when a continuable error is
> +   received.  Unlike the handling of `catch' this function may return.
> +   The arguments will be the `errstring' and `objname'.
> +
> +   Since this functionality is not used in normal programs (only in ld.so)
> +   we do not care about multi-threaded programs here.  We keep this as a
> +   global variable.  */
> +static receiver_fct receiver;
>   
> -#if DL_ERROR_BOOTSTRAP
>   void
>   _dl_signal_cexception (int errcode, struct dl_exception *exception,
>   		       const char *occasion)
> @@ -167,7 +180,23 @@ _dl_signal_cerror (int errcode, const char *objname, const char *occation,
>     else
>       _dl_signal_error (errcode, objname, occation, errstring);
>   }
> -#endif /* DL_ERROR_BOOTSTRAP */
> +
> +void
> +_dl_receive_error (receiver_fct fct, void (*operate) (void *), void *args)
> +{
> +  struct rtld_catch *old_catch = get_catch ();
> +  receiver_fct old_receiver = receiver;
> +
> +  /* Set the new values.  */
> +  set_catch (NULL);
> +  receiver = fct;
> +
> +  (*operate) (args);
> +
> +  set_catch (old_catch);
> +  receiver = old_receiver;
> +}
> +#endif
>   
>   int
>   _dl_catch_exception (struct dl_exception *exception,
> @@ -177,11 +206,11 @@ _dl_catch_exception (struct dl_exception *exception,
>        Exceptions during operate (args) are fatal.  */
>     if (exception == NULL)
>       {
> -      struct catch *const old = catch_hook;
> -      catch_hook = NULL;
> +      struct rtld_catch *old_catch = get_catch ();
> +      set_catch (NULL);
>         operate (args);
>         /* If we get here, the operation was successful.  */
> -      catch_hook = old;
> +      set_catch (old_catch);
>         return 0;
>       }
>   
> @@ -194,19 +223,19 @@ _dl_catch_exception (struct dl_exception *exception,
>        in _dl_signal_error (before longjmp).  */
>     volatile int errcode;
>   
> -  struct catch c;
> +  struct rtld_catch c;
>     /* Don't use an initializer since we don't need to clear C.env.  */
>     c.exception = exception;
>     c.errcode = &errcode;
>   
> -  struct catch *const old = catch_hook;
> -  catch_hook = &c;
> +  struct rtld_catch *old = get_catch ();
> +  set_catch (&c);
>   
>     /* Do not save the signal mask.  */
>     if (__builtin_expect (__sigsetjmp (c.env, 0), 0) == 0)
>       {
>         (*operate) (args);
> -      catch_hook = old;
> +      set_catch (old);
>         *exception = (struct dl_exception) { NULL };
>         return 0;
>       }
> @@ -214,10 +243,10 @@ _dl_catch_exception (struct dl_exception *exception,
>     /* We get here only if we longjmp'd out of OPERATE.
>        _dl_signal_exception has already stored values into
>        *EXCEPTION.  */
> -  catch_hook = old;
> +  set_catch (old);
>     return errcode;
>   }
> -libc_hidden_def (_dl_catch_exception)
> +rtld_hidden_def (_dl_catch_exception)
>   
>   int
>   _dl_catch_error (const char **objname, const char **errstring,
> @@ -230,34 +259,3 @@ _dl_catch_error (const char **objname, const char **errstring,
>     *mallocedp = exception.message_buffer == exception.errstring;
>     return errorcode;
>   }
> -libc_hidden_def (_dl_catch_error)
> -
> -#if DL_ERROR_BOOTSTRAP
> -void
> -_dl_receive_error (receiver_fct fct, void (*operate) (void *), void *args)
> -{
> -  struct catch *old_catch = catch_hook;
> -  receiver_fct old_receiver = receiver;
> -
> -  /* Set the new values.  */
> -  catch_hook = NULL;
> -  receiver = fct;
> -
> -  (*operate) (args);
> -
> -  catch_hook = old_catch;
> -  receiver = old_receiver;
> -}
> -
> -/* Forwarder used for initializing GLRO (_dl_catch_error).  */
> -int
> -_rtld_catch_error (const char **objname, const char **errstring,
> -		   bool *mallocedp, void (*operate) (void *),
> -		   void *args)
> -{
> -  /* The reference to _dl_catch_error will eventually be relocated to
> -     point to the implementation in libc.so.  */
> -  return _dl_catch_error (objname, errstring, mallocedp, operate, args);
> -}
> -
> -#endif /* DL_ERROR_BOOTSTRAP */
> diff --git a/elf/dl-error-minimal.c b/elf/dl-error-minimal.c
> deleted file mode 100644
> index 9b833b90c0..0000000000
> --- a/elf/dl-error-minimal.c
> +++ /dev/null
> @@ -1,23 +0,0 @@
> -/* Error handling for runtime dynamic linker, minimal version.
> -   Copyright (C) 1995-2022 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -/* This version does lives in ld.so, does not use thread-local data
> -   and supports _dl_signal_cerror and _dl_receive_error.  */
> -
> -#define DL_ERROR_BOOTSTRAP 1
> -#include "dl-error-skeleton.c"
> diff --git a/elf/dl-error.c b/elf/dl-error.c
> deleted file mode 100644
> index 0b7332a84f..0000000000
> --- a/elf/dl-error.c
> +++ /dev/null
> @@ -1,27 +0,0 @@
> -/* Error handling for runtime dynamic linker, full version.
> -   Copyright (C) 1995-2022 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -/* This implementation lives in libc.so because it uses thread-local
> -   data, which is not available in ld.so.  It interposes the version
> -   in dl-error-minimal.c after ld.so bootstrap.
> -
> -   The signal/catch mechanism is used by the audit framework, which
> -   means that even in ld.so, not all errors are fatal.  */
> -
> -#define DL_ERROR_BOOTSTRAP 0
> -#include "dl-error-skeleton.c"
> diff --git a/elf/rtld.c b/elf/rtld.c
> index 221be5c71e..8671594f1f 100644
> --- a/elf/rtld.c
> +++ b/elf/rtld.c
> @@ -370,7 +370,7 @@ struct rtld_global_ro _rtld_global_ro attribute_relro =
>       ._dl_lookup_symbol_x = _dl_lookup_symbol_x,
>       ._dl_open = _dl_open,
>       ._dl_close = _dl_close,
> -    ._dl_catch_error = _rtld_catch_error,
> +    ._dl_catch_error = _dl_catch_error,
>       ._dl_error_free = _dl_error_free,
>       ._dl_tls_get_addr_soft = _dl_tls_get_addr_soft,
>       ._dl_libc_freeres = __rtld_libc_freeres,
> diff --git a/nptl/descr.h b/nptl/descr.h
> index 5cacb286f3..0fa0e48f39 100644
> --- a/nptl/descr.h
> +++ b/nptl/descr.h
> @@ -390,6 +390,9 @@ struct pthread
>        masked.)  */
>     internal_sigset_t sigmask;
>   
> +  /* Used by the exception handling implementation in the dynamic loader.  */
> +  struct rtld_catch *rtld_catch;
> +
>     /* Indicates whether is a C11 thread created by thrd_creat.  */
>     bool c11;
>   
> diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
> index 2747f88d0e..9dae72b1ed 100644
> --- a/sysdeps/generic/ldsodefs.h
> +++ b/sysdeps/generic/ldsodefs.h
> @@ -848,13 +848,13 @@ rtld_hidden_proto (_dl_exception_free)
>   void _dl_signal_exception (int errcode, struct dl_exception *,
>   			   const char *occasion)
>     __attribute__ ((__noreturn__));
> -libc_hidden_proto (_dl_signal_exception)
> +rtld_hidden_proto (_dl_signal_exception)
>   
>   /* Like _dl_signal_exception, but creates the exception first.  */
>   extern void _dl_signal_error (int errcode, const char *object,
>   			      const char *occasion, const char *errstring)
>        __attribute__ ((__noreturn__));
> -libc_hidden_proto (_dl_signal_error)
> +rtld_hidden_proto (_dl_signal_error)
>   
>   /* Like _dl_signal_exception, but may return when called in the
>      context of _dl_receive_error.  This is only used during ld.so
> @@ -906,11 +906,7 @@ extern void _dl_receive_error (receiver_fct fct, void (*operate) (void *),
>      the returned string is allocated using the libc's malloc.  */
>   extern int _dl_catch_error (const char **objname, const char **errstring,
>   			    bool *mallocedp, void (*operate) (void *),
> -			    void *args);
> -libc_hidden_proto (_dl_catch_error)
> -
> -/* Used for initializing GLRO (_dl_catch_error).  */
> -extern __typeof__ (_dl_catch_error) _rtld_catch_error attribute_hidden;
> +			    void *args) attribute_hidden;
>   
>   /* Call OPERATE (ARGS).  If no error occurs, set *EXCEPTION to zero.
>      Otherwise, store a copy of the raised exception in *EXCEPTION,
> @@ -919,7 +915,7 @@ extern __typeof__ (_dl_catch_error) _rtld_catch_error attribute_hidden;
>      disabled (so that exceptions are fatal).  */
>   int _dl_catch_exception (struct dl_exception *exception,
>   			 void (*operate) (void *), void *args);
> -libc_hidden_proto (_dl_catch_exception)
> +rtld_hidden_proto (_dl_catch_exception)
>   
>   /* Open the shared object NAME and map in its segments.
>      LOADER's DT_RPATH is used in searching for NAME.
> diff --git a/sysdeps/generic/localplt.data b/sysdeps/generic/localplt.data
> index 9b4f35786a..afa03b0de1 100644
> --- a/sysdeps/generic/localplt.data
> +++ b/sysdeps/generic/localplt.data
> @@ -6,8 +6,3 @@ libc.so: free
>   libc.so: malloc
>   libc.so: realloc
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/mach/hurd/i386/localplt.data b/sysdeps/mach/hurd/i386/localplt.data
> index fdff008abd..c01e4d81e4 100644
> --- a/sysdeps/mach/hurd/i386/localplt.data
> +++ b/sysdeps/mach/hurd/i386/localplt.data
> @@ -8,11 +8,6 @@ libc.so: free + REL R_386_GLOB_DAT
>   libc.so: malloc + REL R_386_GLOB_DAT
>   libc.so: realloc + REL R_386_GLOB_DAT
>   libm.so: matherr + REL R_386_GLOB_DAT
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error + REL R_386_GLOB_DAT
> -ld.so: _dl_catch_error + REL R_386_GLOB_DAT
> -ld.so: _dl_signal_exception + REL R_386_GLOB_DAT
> -ld.so: _dl_catch_exception + REL R_386_GLOB_DAT
>   # The dynamic linker has its own versions of basic functions for initial loading
>   # of shared libraries.  These need to be overriden by libc once loaded.
>   ld.so: __open ?
> diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h
> index 3817b7230d..602bacc0de 100644
> --- a/sysdeps/mach/hurd/i386/tls.h
> +++ b/sysdeps/mach/hurd/i386/tls.h
> @@ -48,6 +48,9 @@ typedef struct
>        compatible with the i386 Linux version.  */
>     mach_port_t reply_port;      /* This thread's reply port.  */
>     struct hurd_sigstate *_hurd_sigstate;
> +
> +  /* Used by the exception handling implementation in the dynamic loader.  */
> +  struct rtld_catch *rtld_catch;
>   } tcbhead_t;
>   
>   /* Return tcbhead_t from a TLS segment descriptor.  */
> diff --git a/sysdeps/unix/sysv/linux/aarch64/localplt.data b/sysdeps/unix/sysv/linux/aarch64/localplt.data
> index 348b3f3793..5d217cc50d 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/localplt.data
> +++ b/sysdeps/unix/sysv/linux/aarch64/localplt.data
> @@ -11,8 +11,3 @@ libm.so: matherr
>   libc.so: __getauxval ?
>   # The dynamic loader needs __tls_get_addr for TLS.
>   ld.so: __tls_get_addr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/alpha/localplt.data b/sysdeps/unix/sysv/linux/alpha/localplt.data
> index 44bf36f4f1..8548e0294b 100644
> --- a/sysdeps/unix/sysv/linux/alpha/localplt.data
> +++ b/sysdeps/unix/sysv/linux/alpha/localplt.data
> @@ -25,8 +25,3 @@ libm.so: matherr + RELA R_ALPHA_GLOB_DAT
>   libm.so: __atan2
>   # The dynamic loader needs __tls_get_addr for TLS.
>   ld.so: __tls_get_addr ?
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error + RELA R_ALPHA_GLOB_DAT
> -ld.so: _dl_catch_error + RELA R_ALPHA_GLOB_DAT
> -ld.so: _dl_signal_exception + RELA R_ALPHA_GLOB_DAT
> -ld.so: _dl_catch_exception + RELA R_ALPHA_GLOB_DAT
> diff --git a/sysdeps/unix/sysv/linux/arc/localplt.data b/sysdeps/unix/sysv/linux/arc/localplt.data
> index ac5332caf7..8a13efc7d0 100644
> --- a/sysdeps/unix/sysv/linux/arc/localplt.data
> +++ b/sysdeps/unix/sysv/linux/arc/localplt.data
> @@ -4,8 +4,3 @@ libc.so: calloc
>   libc.so: free
>   # At -Os, a struct assignment in libgcc-static pulls this in
>   libc.so: memcpy ?
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/arm/localplt.data b/sysdeps/unix/sysv/linux/arm/localplt.data
> index 78896444c6..162c664a01 100644
> --- a/sysdeps/unix/sysv/linux/arm/localplt.data
> +++ b/sysdeps/unix/sysv/linux/arm/localplt.data
> @@ -6,8 +6,3 @@ libc.so: realloc
>   libm.so: matherr
>   # The dynamic loader needs __tls_get_addr for TLS.
>   ld.so: __tls_get_addr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/csky/localplt.data b/sysdeps/unix/sysv/linux/csky/localplt.data
> index 817ab2659a..547b1c1b7f 100644
> --- a/sysdeps/unix/sysv/linux/csky/localplt.data
> +++ b/sysdeps/unix/sysv/linux/csky/localplt.data
> @@ -5,8 +5,3 @@ libc.so: calloc
>   libc.so: free
>   libc.so: malloc
>   libc.so: realloc
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/hppa/localplt.data b/sysdeps/unix/sysv/linux/hppa/localplt.data
> index baf857a750..f8582c08d2 100644
> --- a/sysdeps/unix/sysv/linux/hppa/localplt.data
> +++ b/sysdeps/unix/sysv/linux/hppa/localplt.data
> @@ -9,8 +9,3 @@ libc.so: __sigsetjmp
>   libc.so: _IO_funlockfile
>   libc.so: __errno_location
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/i386/localplt.data b/sysdeps/unix/sysv/linux/i386/localplt.data
> index f9bf7fb410..a998772f04 100644
> --- a/sysdeps/unix/sysv/linux/i386/localplt.data
> +++ b/sysdeps/unix/sysv/linux/i386/localplt.data
> @@ -6,8 +6,3 @@ libc.so: free + REL R_386_GLOB_DAT
>   libc.so: malloc + REL R_386_GLOB_DAT
>   libc.so: realloc + REL R_386_GLOB_DAT
>   libm.so: matherr + REL R_386_GLOB_DAT
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error + REL R_386_GLOB_DAT
> -ld.so: _dl_catch_error + REL R_386_GLOB_DAT
> -ld.so: _dl_signal_exception + REL R_386_GLOB_DAT
> -ld.so: _dl_catch_exception + REL R_386_GLOB_DAT
> diff --git a/sysdeps/unix/sysv/linux/ia64/localplt.data b/sysdeps/unix/sysv/linux/ia64/localplt.data
> index 174fb88128..9673d4b20e 100644
> --- a/sysdeps/unix/sysv/linux/ia64/localplt.data
> +++ b/sysdeps/unix/sysv/linux/ia64/localplt.data
> @@ -5,8 +5,3 @@ libc.so: realloc
>   libm.so: matherr
>   libm.so: matherrf
>   libm.so: matherrl
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/loongarch/localplt.data b/sysdeps/unix/sysv/linux/loongarch/localplt.data
> index 817ab2659a..547b1c1b7f 100644
> --- a/sysdeps/unix/sysv/linux/loongarch/localplt.data
> +++ b/sysdeps/unix/sysv/linux/loongarch/localplt.data
> @@ -5,8 +5,3 @@ libc.so: calloc
>   libc.so: free
>   libc.so: malloc
>   libc.so: realloc
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data
> index 42fa90508c..ea770469b6 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data
> @@ -4,8 +4,3 @@ libc.so: free
>   libc.so: malloc
>   libc.so: realloc
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data
> index 34bd4c1aca..8ffdf3bfb9 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data
> @@ -5,8 +5,3 @@ libc.so: free
>   libc.so: malloc
>   libc.so: realloc
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/microblaze/localplt.data b/sysdeps/unix/sysv/linux/microblaze/localplt.data
> index c3801314c9..7cd3653372 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/localplt.data
> +++ b/sysdeps/unix/sysv/linux/microblaze/localplt.data
> @@ -6,8 +6,3 @@ libc.so: realloc
>   libm.so: matherr
>   # The dynamic loader needs __tls_get_addr for TLS.
>   ld.so: __tls_get_addr ?
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/nios2/localplt.data b/sysdeps/unix/sysv/linux/nios2/localplt.data
> index c9802cc8eb..f502a3f0f6 100644
> --- a/sysdeps/unix/sysv/linux/nios2/localplt.data
> +++ b/sysdeps/unix/sysv/linux/nios2/localplt.data
> @@ -28,8 +28,3 @@ libc.so: __extendsfdf2
>   libc.so: __floatundidf ?
>   libc.so: __floatunsidf ?
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/or1k/localplt.data b/sysdeps/unix/sysv/linux/or1k/localplt.data
> index 04eb9fc8dc..e7704955f1 100644
> --- a/sysdeps/unix/sysv/linux/or1k/localplt.data
> +++ b/sysdeps/unix/sysv/linux/or1k/localplt.data
> @@ -7,8 +7,3 @@ libc.so: malloc
>   libc.so: realloc
>   # Generated by the compiler because there is no trap insn pattern.
>   libc.so: abort ?
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data
> index c0af84eef7..6c1efff68f 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data
> @@ -4,8 +4,3 @@ libc.so: free
>   libc.so: malloc
>   libc.so: realloc
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data
> index 581e54b95c..eca59e1ed6 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data
> @@ -35,8 +35,3 @@ libc.so: realloc
>   libm.so: copysignl ?
>   libm.so: fabsl
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data
> index d69b7ae646..240d998f57 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data
> @@ -3,8 +3,3 @@ libc.so: free
>   libc.so: malloc
>   libc.so: realloc
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/riscv/localplt.data b/sysdeps/unix/sysv/linux/riscv/localplt.data
> index e6d5330d5b..ea887042e0 100644
> --- a/sysdeps/unix/sysv/linux/riscv/localplt.data
> +++ b/sysdeps/unix/sysv/linux/riscv/localplt.data
> @@ -6,8 +6,3 @@ libc.so: free
>   libc.so: malloc
>   libc.so: memset ?
>   libc.so: realloc
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/s390/localplt.data b/sysdeps/unix/sysv/linux/s390/localplt.data
> index c0af84eef7..6c1efff68f 100644
> --- a/sysdeps/unix/sysv/linux/s390/localplt.data
> +++ b/sysdeps/unix/sysv/linux/s390/localplt.data
> @@ -4,8 +4,3 @@ libc.so: free
>   libc.so: malloc
>   libc.so: realloc
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/sh/localplt.data b/sysdeps/unix/sysv/linux/sh/localplt.data
> index 6491b9e37b..3d2e4c1c28 100644
> --- a/sysdeps/unix/sysv/linux/sh/localplt.data
> +++ b/sysdeps/unix/sysv/linux/sh/localplt.data
> @@ -11,8 +11,3 @@ libc.so: __errno_location
>   libm.so: matherr
>   # Generated by the compiler because there is no trap insn pattern.
>   libc.so: abort ?
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data
> index 38309a1393..b5fc6d9c3a 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data
> @@ -18,8 +18,3 @@ libc.so: free
>   libc.so: malloc
>   libc.so: realloc
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data
> index 6a216f3a5a..12520b1586 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data
> @@ -17,8 +17,3 @@ libc.so: free
>   libc.so: malloc
>   libc.so: realloc
>   libm.so: matherr
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error
> -ld.so: _dl_catch_error
> -ld.so: _dl_signal_exception
> -ld.so: _dl_catch_exception
> diff --git a/sysdeps/x86_64/localplt.data b/sysdeps/x86_64/localplt.data
> index d1f2e26612..0d424a5c1f 100644
> --- a/sysdeps/x86_64/localplt.data
> +++ b/sysdeps/x86_64/localplt.data
> @@ -8,8 +8,3 @@ libc.so: free + RELA R_X86_64_GLOB_DAT
>   libc.so: malloc + RELA R_X86_64_GLOB_DAT
>   libc.so: realloc + RELA R_X86_64_GLOB_DAT
>   libm.so: matherr + RELA R_X86_64_GLOB_DAT
> -# The TLS-enabled version of these functions is interposed from libc.so.
> -ld.so: _dl_signal_error + RELA R_X86_64_GLOB_DAT
> -ld.so: _dl_catch_error + RELA R_X86_64_GLOB_DAT
> -ld.so: _dl_signal_exception + RELA R_X86_64_GLOB_DAT
> -ld.so: _dl_catch_exception + RELA R_X86_64_GLOB_DAT
> 
> base-commit: 6f360366f7f76b158a0f4bf20d42f2854ad56264
> 

      reply	other threads:[~2022-11-02 12:33 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-27 14:59 Florian Weimer
2022-11-02 12:33 ` Siddhesh Poyarekar [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=418034c6-112d-2127-d2f9-7594fa787c3e@gotplt.org \
    --to=siddhesh@gotplt.org \
    --cc=fweimer@redhat.com \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).