You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1031 lines
39 KiB
1031 lines
39 KiB
1 month ago
|
From ee1ada1bdb8074de6e1bdc956ab19aef7b6a7872 Mon Sep 17 00:00:00 2001
|
||
|
From: Florian Weimer <fweimer@redhat.com>
|
||
|
Date: Thu, 3 Nov 2022 09:39:31 +0100
|
||
|
Subject: elf: Rework exception handling in the dynamic loader [BZ #25486]
|
||
|
|
||
|
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.
|
||
|
|
||
|
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||
|
|
||
|
Conflicts
|
||
|
Rebased due to context changes
|
||
|
|
||
|
diff -rupN a/elf/Makefile b/elf/Makefile
|
||
|
--- a/elf/Makefile 2024-08-29 11:28:38.488322915 -0400
|
||
|
+++ b/elf/Makefile 2024-08-29 11:29:16.773809945 -0400
|
||
|
@@ -34,7 +34,6 @@ routines = \
|
||
|
dl-addr \
|
||
|
dl-addr-obj \
|
||
|
dl-early_allocate \
|
||
|
- dl-error \
|
||
|
dl-iteratephdr \
|
||
|
dl-libc \
|
||
|
dl-origin \
|
||
|
@@ -52,6 +51,7 @@ routines = \
|
||
|
# profiled libraries.
|
||
|
dl-routines = \
|
||
|
dl-call-libc-early-init \
|
||
|
+ dl-catch \
|
||
|
dl-close \
|
||
|
dl-debug \
|
||
|
dl-deps \
|
||
|
@@ -127,7 +127,6 @@ rtld-routines = \
|
||
|
dl-diagnostics-cpu \
|
||
|
dl-diagnostics-kernel \
|
||
|
dl-environ \
|
||
|
- dl-error-minimal \
|
||
|
dl-hwcaps \
|
||
|
dl-hwcaps-subdirs \
|
||
|
dl-hwcaps_split \
|
||
|
diff -rupN a/elf/Versions b/elf/Versions
|
||
|
--- a/elf/Versions 2024-08-29 11:28:36.214234588 -0400
|
||
|
+++ b/elf/Versions 2024-08-29 11:29:16.778810139 -0400
|
||
|
@@ -23,10 +23,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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@@ -69,10 +65,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 -rupN a/elf/dl-catch.c b/elf/dl-catch.c
|
||
|
--- a/elf/dl-catch.c 1969-12-31 19:00:00.000000000 -0500
|
||
|
+++ b/elf/dl-catch.c 2024-08-29 11:29:16.782810295 -0400
|
||
|
@@ -0,0 +1,261 @@
|
||
|
+/* Exception handling in the dynamic linker.
|
||
|
+ 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/>. */
|
||
|
+
|
||
|
+#include <libintl.h>
|
||
|
+#include <setjmp.h>
|
||
|
+#include <stdbool.h>
|
||
|
+#include <stdlib.h>
|
||
|
+#include <string.h>
|
||
|
+#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 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. 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
|
||
|
+
|
||
|
+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);
|
||
|
+}
|
||
|
+
|
||
|
+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
|
||
|
+__attribute__ ((noreturn))
|
||
|
+fatal_error (int errcode, const char *objname, const char *occasion,
|
||
|
+ const char *errstring)
|
||
|
+{
|
||
|
+ char buffer[1024];
|
||
|
+ _dl_fatal_printf ("%s: %s: %s%s%s%s%s\n",
|
||
|
+ RTLD_PROGNAME,
|
||
|
+ occasion ?: N_("error while loading shared libraries"),
|
||
|
+ objname, *objname ? ": " : "",
|
||
|
+ errstring, errcode ? ": " : "",
|
||
|
+ (errcode
|
||
|
+ ? __strerror_r (errcode, buffer, sizeof buffer)
|
||
|
+ : ""));
|
||
|
+}
|
||
|
+
|
||
|
+void
|
||
|
+_dl_signal_exception (int errcode, struct dl_exception *exception,
|
||
|
+ const char *occasion)
|
||
|
+{
|
||
|
+ struct rtld_catch *lcatch = get_catch ();
|
||
|
+ if (lcatch != NULL)
|
||
|
+ {
|
||
|
+ *lcatch->exception = *exception;
|
||
|
+ *lcatch->errcode = errcode;
|
||
|
+
|
||
|
+ /* We do not restore the signal mask because none was saved. */
|
||
|
+ __longjmp (lcatch->env[0].__jmpbuf, 1);
|
||
|
+ }
|
||
|
+ else
|
||
|
+ fatal_error (errcode, exception->objname, occasion, exception->errstring);
|
||
|
+}
|
||
|
+rtld_hidden_def (_dl_signal_exception)
|
||
|
+
|
||
|
+void
|
||
|
+_dl_signal_error (int errcode, const char *objname, const char *occation,
|
||
|
+ const char *errstring)
|
||
|
+{
|
||
|
+ struct rtld_catch *lcatch = get_catch ();
|
||
|
+
|
||
|
+ if (! errstring)
|
||
|
+ errstring = N_("DYNAMIC LINKER BUG!!!");
|
||
|
+
|
||
|
+ if (lcatch != NULL)
|
||
|
+ {
|
||
|
+ _dl_exception_create (lcatch->exception, objname, errstring);
|
||
|
+ *lcatch->errcode = errcode;
|
||
|
+
|
||
|
+ /* We do not restore the signal mask because none was saved. */
|
||
|
+ __longjmp (lcatch->env[0].__jmpbuf, 1);
|
||
|
+ }
|
||
|
+ else
|
||
|
+ fatal_error (errcode, objname, occation, errstring);
|
||
|
+}
|
||
|
+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;
|
||
|
+
|
||
|
+void
|
||
|
+_dl_signal_cexception (int errcode, struct dl_exception *exception,
|
||
|
+ const char *occasion)
|
||
|
+{
|
||
|
+ if (__builtin_expect (GLRO(dl_debug_mask)
|
||
|
+ & ~(DL_DEBUG_STATISTICS), 0))
|
||
|
+ _dl_debug_printf ("%s: error: %s: %s (%s)\n",
|
||
|
+ exception->objname, occasion,
|
||
|
+ exception->errstring, receiver ? "continued" : "fatal");
|
||
|
+
|
||
|
+ if (receiver)
|
||
|
+ {
|
||
|
+ /* We are inside _dl_receive_error. Call the user supplied
|
||
|
+ handler and resume the work. The receiver will still be
|
||
|
+ installed. */
|
||
|
+ (*receiver) (errcode, exception->objname, exception->errstring);
|
||
|
+ }
|
||
|
+ else
|
||
|
+ _dl_signal_exception (errcode, exception, occasion);
|
||
|
+}
|
||
|
+
|
||
|
+void
|
||
|
+_dl_signal_cerror (int errcode, const char *objname, const char *occation,
|
||
|
+ const char *errstring)
|
||
|
+{
|
||
|
+ if (__builtin_expect (GLRO(dl_debug_mask)
|
||
|
+ & ~(DL_DEBUG_STATISTICS), 0))
|
||
|
+ _dl_debug_printf ("%s: error: %s: %s (%s)\n", objname, occation,
|
||
|
+ errstring, receiver ? "continued" : "fatal");
|
||
|
+
|
||
|
+ if (receiver)
|
||
|
+ {
|
||
|
+ /* We are inside _dl_receive_error. Call the user supplied
|
||
|
+ handler and resume the work. The receiver will still be
|
||
|
+ installed. */
|
||
|
+ (*receiver) (errcode, objname, errstring);
|
||
|
+ }
|
||
|
+ else
|
||
|
+ _dl_signal_error (errcode, objname, occation, errstring);
|
||
|
+}
|
||
|
+
|
||
|
+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,
|
||
|
+ void (*operate) (void *), void *args)
|
||
|
+{
|
||
|
+ /* If exception is NULL, temporarily disable exception handling.
|
||
|
+ Exceptions during operate (args) are fatal. */
|
||
|
+ if (exception == NULL)
|
||
|
+ {
|
||
|
+ struct rtld_catch *old_catch = get_catch ();
|
||
|
+ set_catch (NULL);
|
||
|
+ operate (args);
|
||
|
+ /* If we get here, the operation was successful. */
|
||
|
+ set_catch (old_catch);
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* We need not handle `receiver' since setting a `catch' is handled
|
||
|
+ before it. */
|
||
|
+
|
||
|
+ /* Only this needs to be marked volatile, because it is the only local
|
||
|
+ variable that gets changed between the setjmp invocation and the
|
||
|
+ longjmp call. All others are just set here (before setjmp) and read
|
||
|
+ in _dl_signal_error (before longjmp). */
|
||
|
+ volatile int errcode;
|
||
|
+
|
||
|
+ 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 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);
|
||
|
+ set_catch (old);
|
||
|
+ *exception = (struct dl_exception) { NULL };
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* We get here only if we longjmp'd out of OPERATE.
|
||
|
+ _dl_signal_exception has already stored values into
|
||
|
+ *EXCEPTION. */
|
||
|
+ set_catch (old);
|
||
|
+ return errcode;
|
||
|
+}
|
||
|
+rtld_hidden_def (_dl_catch_exception)
|
||
|
+
|
||
|
+int
|
||
|
+_dl_catch_error (const char **objname, const char **errstring,
|
||
|
+ bool *mallocedp, void (*operate) (void *), void *args)
|
||
|
+{
|
||
|
+ struct dl_exception exception;
|
||
|
+ int errorcode = _dl_catch_exception (&exception, operate, args);
|
||
|
+ *objname = exception.objname;
|
||
|
+ *errstring = exception.errstring;
|
||
|
+ *mallocedp = exception.message_buffer == exception.errstring;
|
||
|
+ return errorcode;
|
||
|
+}
|
||
|
diff -rupN a/elf/dl-error-minimal.c b/elf/dl-error-minimal.c
|
||
|
--- a/elf/dl-error-minimal.c 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/elf/dl-error-minimal.c 1969-12-31 19:00:00.000000000 -0500
|
||
|
@@ -1,23 +0,0 @@
|
||
|
-/* Error handling for runtime dynamic linker, minimal version.
|
||
|
- Copyright (C) 1995-2021 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 -rupN a/elf/dl-error-skeleton.c b/elf/dl-error-skeleton.c
|
||
|
--- a/elf/dl-error-skeleton.c 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/elf/dl-error-skeleton.c 1969-12-31 19:00:00.000000000 -0500
|
||
|
@@ -1,263 +0,0 @@
|
||
|
-/* Template for error handling for runtime dynamic linker.
|
||
|
- Copyright (C) 1995-2021 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/>. */
|
||
|
-
|
||
|
-/* 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>
|
||
|
-#include <stdlib.h>
|
||
|
-#include <string.h>
|
||
|
-#include <unistd.h>
|
||
|
-#include <ldsodefs.h>
|
||
|
-#include <stdio.h>
|
||
|
-
|
||
|
-/* This structure communicates state between _dl_catch_error and
|
||
|
- _dl_signal_error. */
|
||
|
-struct 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;
|
||
|
-#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'.
|
||
|
-
|
||
|
- 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 */
|
||
|
-
|
||
|
-/* Lossage while resolving the program's own symbols is always fatal. */
|
||
|
-static void
|
||
|
-__attribute__ ((noreturn))
|
||
|
-fatal_error (int errcode, const char *objname, const char *occasion,
|
||
|
- const char *errstring)
|
||
|
-{
|
||
|
- char buffer[1024];
|
||
|
- _dl_fatal_printf ("%s: %s: %s%s%s%s%s\n",
|
||
|
- RTLD_PROGNAME,
|
||
|
- occasion ?: N_("error while loading shared libraries"),
|
||
|
- objname, *objname ? ": " : "",
|
||
|
- errstring, errcode ? ": " : "",
|
||
|
- (errcode
|
||
|
- ? __strerror_r (errcode, buffer, sizeof buffer)
|
||
|
- : ""));
|
||
|
-}
|
||
|
-
|
||
|
-void
|
||
|
-_dl_signal_exception (int errcode, struct dl_exception *exception,
|
||
|
- const char *occasion)
|
||
|
-{
|
||
|
- struct catch *lcatch = catch_hook;
|
||
|
- if (lcatch != NULL)
|
||
|
- {
|
||
|
- *lcatch->exception = *exception;
|
||
|
- *lcatch->errcode = errcode;
|
||
|
-
|
||
|
- /* We do not restore the signal mask because none was saved. */
|
||
|
- __longjmp (lcatch->env[0].__jmpbuf, 1);
|
||
|
- }
|
||
|
- else
|
||
|
- fatal_error (errcode, exception->objname, occasion, exception->errstring);
|
||
|
-}
|
||
|
-libc_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;
|
||
|
-
|
||
|
- if (! errstring)
|
||
|
- errstring = N_("DYNAMIC LINKER BUG!!!");
|
||
|
-
|
||
|
- if (lcatch != NULL)
|
||
|
- {
|
||
|
- _dl_exception_create (lcatch->exception, objname, errstring);
|
||
|
- *lcatch->errcode = errcode;
|
||
|
-
|
||
|
- /* We do not restore the signal mask because none was saved. */
|
||
|
- __longjmp (lcatch->env[0].__jmpbuf, 1);
|
||
|
- }
|
||
|
- else
|
||
|
- fatal_error (errcode, objname, occation, errstring);
|
||
|
-}
|
||
|
-libc_hidden_def (_dl_signal_error)
|
||
|
-
|
||
|
-
|
||
|
-#if DL_ERROR_BOOTSTRAP
|
||
|
-void
|
||
|
-_dl_signal_cexception (int errcode, struct dl_exception *exception,
|
||
|
- const char *occasion)
|
||
|
-{
|
||
|
- if (__builtin_expect (GLRO(dl_debug_mask)
|
||
|
- & ~(DL_DEBUG_STATISTICS|DL_DEBUG_PRELINK), 0))
|
||
|
- _dl_debug_printf ("%s: error: %s: %s (%s)\n",
|
||
|
- exception->objname, occasion,
|
||
|
- exception->errstring, receiver ? "continued" : "fatal");
|
||
|
-
|
||
|
- if (receiver)
|
||
|
- {
|
||
|
- /* We are inside _dl_receive_error. Call the user supplied
|
||
|
- handler and resume the work. The receiver will still be
|
||
|
- installed. */
|
||
|
- (*receiver) (errcode, exception->objname, exception->errstring);
|
||
|
- }
|
||
|
- else
|
||
|
- _dl_signal_exception (errcode, exception, occasion);
|
||
|
-}
|
||
|
-
|
||
|
-void
|
||
|
-_dl_signal_cerror (int errcode, const char *objname, const char *occation,
|
||
|
- const char *errstring)
|
||
|
-{
|
||
|
- if (__builtin_expect (GLRO(dl_debug_mask)
|
||
|
- & ~(DL_DEBUG_STATISTICS|DL_DEBUG_PRELINK), 0))
|
||
|
- _dl_debug_printf ("%s: error: %s: %s (%s)\n", objname, occation,
|
||
|
- errstring, receiver ? "continued" : "fatal");
|
||
|
-
|
||
|
- if (receiver)
|
||
|
- {
|
||
|
- /* We are inside _dl_receive_error. Call the user supplied
|
||
|
- handler and resume the work. The receiver will still be
|
||
|
- installed. */
|
||
|
- (*receiver) (errcode, objname, errstring);
|
||
|
- }
|
||
|
- else
|
||
|
- _dl_signal_error (errcode, objname, occation, errstring);
|
||
|
-}
|
||
|
-#endif /* DL_ERROR_BOOTSTRAP */
|
||
|
-
|
||
|
-int
|
||
|
-_dl_catch_exception (struct dl_exception *exception,
|
||
|
- void (*operate) (void *), void *args)
|
||
|
-{
|
||
|
- /* If exception is NULL, temporarily disable exception handling.
|
||
|
- Exceptions during operate (args) are fatal. */
|
||
|
- if (exception == NULL)
|
||
|
- {
|
||
|
- struct catch *const old = catch_hook;
|
||
|
- catch_hook = NULL;
|
||
|
- operate (args);
|
||
|
- /* If we get here, the operation was successful. */
|
||
|
- catch_hook = old;
|
||
|
- return 0;
|
||
|
- }
|
||
|
-
|
||
|
- /* We need not handle `receiver' since setting a `catch' is handled
|
||
|
- before it. */
|
||
|
-
|
||
|
- /* Only this needs to be marked volatile, because it is the only local
|
||
|
- variable that gets changed between the setjmp invocation and the
|
||
|
- longjmp call. All others are just set here (before setjmp) and read
|
||
|
- in _dl_signal_error (before longjmp). */
|
||
|
- volatile int errcode;
|
||
|
-
|
||
|
- struct 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;
|
||
|
-
|
||
|
- /* Do not save the signal mask. */
|
||
|
- if (__builtin_expect (__sigsetjmp (c.env, 0), 0) == 0)
|
||
|
- {
|
||
|
- (*operate) (args);
|
||
|
- catch_hook = old;
|
||
|
- *exception = (struct dl_exception) { NULL };
|
||
|
- return 0;
|
||
|
- }
|
||
|
-
|
||
|
- /* We get here only if we longjmp'd out of OPERATE.
|
||
|
- _dl_signal_exception has already stored values into
|
||
|
- *EXCEPTION. */
|
||
|
- catch_hook = old;
|
||
|
- return errcode;
|
||
|
-}
|
||
|
-libc_hidden_def (_dl_catch_exception)
|
||
|
-
|
||
|
-int
|
||
|
-_dl_catch_error (const char **objname, const char **errstring,
|
||
|
- bool *mallocedp, void (*operate) (void *), void *args)
|
||
|
-{
|
||
|
- struct dl_exception exception;
|
||
|
- int errorcode = _dl_catch_exception (&exception, operate, args);
|
||
|
- *objname = exception.objname;
|
||
|
- *errstring = exception.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 -rupN a/elf/dl-error.c b/elf/dl-error.c
|
||
|
--- a/elf/dl-error.c 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/elf/dl-error.c 1969-12-31 19:00:00.000000000 -0500
|
||
|
@@ -1,27 +0,0 @@
|
||
|
-/* Error handling for runtime dynamic linker, full version.
|
||
|
- Copyright (C) 1995-2021 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 -rupN a/elf/rtld.c b/elf/rtld.c
|
||
|
--- a/elf/rtld.c 2024-08-29 11:28:38.569326061 -0400
|
||
|
+++ b/elf/rtld.c 2024-08-29 11:29:16.798810916 -0400
|
||
|
@@ -377,7 +377,7 @@ struct rtld_global_ro _rtld_global_ro at
|
||
|
._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,
|
||
|
#ifdef HAVE_DL_DISCOVER_OSVERSION
|
||
|
diff -rupN a/nptl/descr.h b/nptl/descr.h
|
||
|
--- a/nptl/descr.h 2024-08-29 11:28:37.858298444 -0400
|
||
|
+++ b/nptl/descr.h 2024-08-29 11:29:16.801811033 -0400
|
||
|
@@ -396,6 +396,9 @@ struct pthread
|
||
|
masked.) */
|
||
|
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 -rupN a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||
|
--- a/sysdeps/generic/ldsodefs.h 2024-08-29 11:28:38.571326139 -0400
|
||
|
+++ b/sysdeps/generic/ldsodefs.h 2024-08-29 11:29:16.805811188 -0400
|
||
|
@@ -897,13 +897,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
|
||
|
@@ -955,11 +955,7 @@ extern void _dl_receive_error (receiver_
|
||
|
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,
|
||
|
@@ -968,7 +964,7 @@ extern __typeof__ (_dl_catch_error) _rtl
|
||
|
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 -rupN a/sysdeps/generic/localplt.data b/sysdeps/generic/localplt.data
|
||
|
--- a/sysdeps/generic/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/generic/localplt.data 2024-08-29 11:29:16.806811227 -0400
|
||
|
@@ -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 -rupN a/sysdeps/mach/hurd/i386/localplt.data b/sysdeps/mach/hurd/i386/localplt.data
|
||
|
--- a/sysdeps/mach/hurd/i386/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/mach/hurd/i386/localplt.data 2024-08-29 11:29:16.808811305 -0400
|
||
|
@@ -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 -rupN a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h
|
||
|
--- a/sysdeps/mach/hurd/i386/tls.h 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/mach/hurd/i386/tls.h 2024-08-29 11:29:16.810811382 -0400
|
||
|
@@ -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;
|
||
|
#endif
|
||
|
|
||
|
diff -rupN a/sysdeps/unix/sysv/linux/aarch64/localplt.data b/sysdeps/unix/sysv/linux/aarch64/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/aarch64/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/aarch64/localplt.data 2024-08-29 11:29:16.810811382 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/alpha/localplt.data b/sysdeps/unix/sysv/linux/alpha/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/alpha/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/alpha/localplt.data 2024-08-29 11:29:16.810811382 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/arc/localplt.data b/sysdeps/unix/sysv/linux/arc/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/arc/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/arc/localplt.data 2024-08-29 11:29:16.814811538 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/arm/localplt.data b/sysdeps/unix/sysv/linux/arm/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/arm/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/arm/localplt.data 2024-08-29 11:29:16.814811538 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/csky/localplt.data b/sysdeps/unix/sysv/linux/csky/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/csky/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/csky/localplt.data 2024-08-29 11:29:16.814811538 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/hppa/localplt.data b/sysdeps/unix/sysv/linux/hppa/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/hppa/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/hppa/localplt.data 2024-08-29 11:29:16.814811538 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/i386/localplt.data b/sysdeps/unix/sysv/linux/i386/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/i386/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/i386/localplt.data 2024-08-29 11:29:16.816811615 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/ia64/localplt.data b/sysdeps/unix/sysv/linux/ia64/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/ia64/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/ia64/localplt.data 2024-08-29 11:29:16.816811615 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/localplt.data 2024-08-29 11:29:16.819811732 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/localplt.data 2024-08-29 11:29:16.820811771 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/microblaze/localplt.data b/sysdeps/unix/sysv/linux/microblaze/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/microblaze/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/microblaze/localplt.data 2024-08-29 11:29:16.822811848 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/nios2/localplt.data b/sysdeps/unix/sysv/linux/nios2/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/nios2/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/nios2/localplt.data 2024-08-29 11:29:16.825811965 -0400
|
||
|
@@ -27,8 +27,3 @@ libc.so: __eqdf2
|
||
|
libc.so: __extendsfdf2
|
||
|
libc.so: __floatundidf ?
|
||
|
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 -rupN a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data 2024-08-29 11:29:16.829812120 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data 2024-08-29 11:29:16.831812198 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data 2024-08-29 11:29:16.833812276 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/riscv/localplt.data b/sysdeps/unix/sysv/linux/riscv/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/riscv/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/riscv/localplt.data 2024-08-29 11:29:16.835812353 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/s390/localplt.data b/sysdeps/unix/sysv/linux/s390/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/s390/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/s390/localplt.data 2024-08-29 11:29:16.837812431 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/sh/localplt.data b/sysdeps/unix/sysv/linux/sh/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/sh/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/sh/localplt.data 2024-08-29 11:29:16.838812470 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data 2024-08-29 11:29:16.840812547 -0400
|
||
|
@@ -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 -rupN a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data
|
||
|
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data 2024-08-29 11:29:16.844812703 -0400
|
||
|
@@ -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 -rupN a/sysdeps/x86_64/localplt.data b/sysdeps/x86_64/localplt.data
|
||
|
--- a/sysdeps/x86_64/localplt.data 2021-08-01 21:33:43.000000000 -0400
|
||
|
+++ b/sysdeps/x86_64/localplt.data 2024-08-29 11:29:16.847812819 -0400
|
||
|
@@ -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
|