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.
121 lines
5.0 KiB
121 lines
5.0 KiB
commit e7ca2a475cf2e7ffc987b8d08e1a40337840b500 |
|
Author: Florian Weimer <fweimer@redhat.com> |
|
Date: Mon May 9 18:15:16 2022 +0200 |
|
|
|
Linux: Implement a useful version of _startup_fatal |
|
|
|
On i386 and ia64, the TCB is not available at this point. |
|
|
|
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> |
|
(cherry picked from commit a2a6bce7d7e52c1c34369a7da62c501cc350bc31) |
|
|
|
diff --git a/sysdeps/unix/sysv/linux/i386/startup.h b/sysdeps/unix/sysv/linux/i386/startup.h |
|
index 192c765361c17ed1..213805d7d2d459be 100644 |
|
--- a/sysdeps/unix/sysv/linux/i386/startup.h |
|
+++ b/sysdeps/unix/sysv/linux/i386/startup.h |
|
@@ -1,5 +1,5 @@ |
|
/* Linux/i386 definitions of functions used by static libc main startup. |
|
- Copyright (C) 2017-2021 Free Software Foundation, Inc. |
|
+ Copyright (C) 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 |
|
@@ -16,22 +16,7 @@ |
|
License along with the GNU C Library; if not, see |
|
<https://www.gnu.org/licenses/>. */ |
|
|
|
-#if BUILD_PIE_DEFAULT |
|
-/* Can't use "call *%gs:SYSINFO_OFFSET" during statup in static PIE. */ |
|
-# define I386_USE_SYSENTER 0 |
|
+/* Can't use "call *%gs:SYSINFO_OFFSET" during startup. */ |
|
+#define I386_USE_SYSENTER 0 |
|
|
|
-# include <sysdep.h> |
|
-# include <abort-instr.h> |
|
- |
|
-__attribute__ ((__noreturn__)) |
|
-static inline void |
|
-_startup_fatal (const char *message __attribute__ ((unused))) |
|
-{ |
|
- /* This is only called very early during startup in static PIE. |
|
- FIXME: How can it be improved? */ |
|
- ABORT_INSTRUCTION; |
|
- __builtin_unreachable (); |
|
-} |
|
-#else |
|
-# include_next <startup.h> |
|
-#endif |
|
+#include_next <startup.h> |
|
diff --git a/sysdeps/unix/sysv/linux/ia64/startup.h b/sysdeps/unix/sysv/linux/ia64/startup.h |
|
new file mode 100644 |
|
index 0000000000000000..77f29f15a2103ed5 |
|
--- /dev/null |
|
+++ b/sysdeps/unix/sysv/linux/ia64/startup.h |
|
@@ -0,0 +1,22 @@ |
|
+/* Linux/ia64 definitions of functions used by static libc main startup. |
|
+ Copyright (C) 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 code is used before the TCB is set up. */ |
|
+#define IA64_USE_NEW_STUB 0 |
|
+ |
|
+#include_next <startup.h> |
|
diff --git a/sysdeps/unix/sysv/linux/startup.h b/sysdeps/unix/sysv/linux/startup.h |
|
new file mode 100644 |
|
index 0000000000000000..39859b404a84798b |
|
--- /dev/null |
|
+++ b/sysdeps/unix/sysv/linux/startup.h |
|
@@ -0,0 +1,39 @@ |
|
+/* Linux definitions of functions used by static libc main startup. |
|
+ Copyright (C) 2017-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/>. */ |
|
+ |
|
+#ifdef SHARED |
|
+# include_next <startup.h> |
|
+#else |
|
+# include <sysdep.h> |
|
+ |
|
+/* Avoid a run-time invocation of strlen. */ |
|
+#define _startup_fatal(message) \ |
|
+ do \ |
|
+ { \ |
|
+ size_t __message_length = __builtin_strlen (message); \ |
|
+ if (! __builtin_constant_p (__message_length)) \ |
|
+ { \ |
|
+ extern void _startup_fatal_not_constant (void); \ |
|
+ _startup_fatal_not_constant (); \ |
|
+ } \ |
|
+ INTERNAL_SYSCALL_CALL (write, STDERR_FILENO, (message), \ |
|
+ __message_length); \ |
|
+ INTERNAL_SYSCALL_CALL (exit_group, 127); \ |
|
+ } \ |
|
+ while (0) |
|
+#endif /* !SHARED */
|
|
|