summaryrefslogtreecommitdiff
path: root/tools/include/nolibc/arch-riscv.h
diff options
context:
space:
mode:
authorZhangjin Wu <falcon@tinylab.org>2023-07-15 21:18:54 +0300
committerWilly Tarreau <w@1wt.eu>2023-08-23 05:40:22 +0300
commitbff60150f7c464d80d86f289c056c2ad2afb3c05 (patch)
treedf1827acbd23bf0a92c9d7a08a7b4ee11abaaeed /tools/include/nolibc/arch-riscv.h
parent20233498359a29f7b2ff4e8fbdb0a1a7c8d5744c (diff)
downloadlinux-bff60150f7c464d80d86f289c056c2ad2afb3c05.tar.xz
tools/nolibc: fix up startup failures for -O0 under gcc < 11.1.0
As gcc doc [1] shows: Most optimizations are completely disabled at -O0 or if an -O level is not set on the command line, even if individual optimization flags are specified. Test result [2] shows, gcc>=11.1.0 deviates from the above description, but before gcc 11.1.0, "-O0" still forcely uses frame pointer in the _start function even if the individual optimize("omit-frame-pointer") flag is specified. The frame pointer related operations will change the stack pointer (e.g. In x86_64, an extra "push %rbp" will be inserted at the beginning of _start) and make it differs from the one we expected, as a result, break the whole startup function. To fix up this issue, as suggested by Thomas, the individual "Os" and "omit-frame-pointer" optimize flags are used together on _start function to disable frame pointer completely even if the -O0 is set on the command line. [1]: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html [2]: https://lore.kernel.org/lkml/20230714094723.140603-1-falcon@tinylab.org/ Suggested-by: Thomas Weißschuh <linux@weissschuh.net> Link: https://lore.kernel.org/lkml/34b21ba5-7b59-4b3b-9ed6-ef9a3a5e06f7@t-8ch.de/ Fixes: 7f8548589661 ("tools/nolibc: make compiler and assembler agree on the section around _start") Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
Diffstat (limited to 'tools/include/nolibc/arch-riscv.h')
-rw-r--r--tools/include/nolibc/arch-riscv.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/tools/include/nolibc/arch-riscv.h b/tools/include/nolibc/arch-riscv.h
index 1dd7083c2ac8..322c96f4acdb 100644
--- a/tools/include/nolibc/arch-riscv.h
+++ b/tools/include/nolibc/arch-riscv.h
@@ -180,7 +180,7 @@ char **environ __attribute__((weak));
const unsigned long *_auxv __attribute__((weak));
/* startup code */
-void __attribute__((weak, noreturn, optimize("omit-frame-pointer"))) __no_stack_protector _start(void)
+void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void)
{
__asm__ volatile (
".option push\n"