On 2023-07-14 17:47:23+0800, Zhangjin Wu wrote:
On 2023-07-14 13:58:13+0800, Zhangjin Wu wrote:
[..]
I was also not able to reproduce the issue.
Thanks very much for your 'reproduce' result, It is so weird, just rechecked the toolchain, 13.1.0 from https://mirrors.edge.kernel.org/ is ok, gcc 9, gcc 10.3 not work.
But even in the page of 13.1.0 [1], we still see this line:
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.
Not sure if "individual optimization flags" also means the optimize() flags in gcc attributes. or the doc is not updated yet?
And further found gcc 11.1.0 is ok, gcc 10.4 still not work, so, gcc 11.1.0 may changed something to let the "individual optimization flags" work with -O0.
We may need to at least document this issue in some files, -O0 is not such a frequently-used option, not sure if we still need -O0 work with the older gcc < 11.1.0 ;-)
It seems we can avoid the issue by enforcing optimizations for _start:
diff --git a/tools/include/nolibc/arch-x86_64.h b/tools/include/nolibc/arch-x86_64.h index f5614a67f05a..b9d8b8861dc4 100644 --- a/tools/include/nolibc/arch-x86_64.h +++ b/tools/include/nolibc/arch-x86_64.h @@ -161,12 +161,9 @@
- The deepest stack frame should be zero (the %rbp).
*/ -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)
Great, it works and it is minimal enough ;-)
Thanks very much.
Willy, I'm not sure if the issues solved by the commit 7f8548589661 ("tools/nolibc: make compiler and assembler agree on the section around _start") still exist after we using _start_c()?
Thomas, because we plan to move the stackprotector init to _start_c(), If using pure assembly _start, we may also not need the __no_stack_protector macro too?
It would probably not needed anymore in this case.
Yeah, but let's reserve it as-is for we have the working omit-frame-pointer now.
Best regards, Zhangjin
Thomas