在 2025-7-13 23:02, Pali Rohár 写道:
I see. But I think it is better to apply at least this "debugging purposes" attribute than nothing. It is only for older gcc versions. And with __SSP__ checks it can be targeted just for -fstack-protector-string CRT builds, which is what the original commit is aiming.What about something like this in the stack_chk_guard.c file? #if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 11 #if (defined(__SSP__) || defined(__SSP_STRONG__) || defined(__SSP_ALL__)) #define __no_stack_protector__ __optimize__("no-stack-protector") #else #define __no_stack_protector__ #endif #endif
I'd rather that we don't abuse the `optimize` attribute. Clang also doesn't support it, so there's no workaround for Clang 7-.
It should be an error if SSP is enabled when compiling this file: diff --git a/mingw-w64-crt/ssp/stack_chk_guard.c b/mingw-w64-crt/ssp/stack_chk_guard.c index be43d8c7e..6a728d712 100644 --- a/mingw-w64-crt/ssp/stack_chk_guard.c +++ b/mingw-w64-crt/ssp/stack_chk_guard.c @@ -10,10 +10,18 @@ void *__stack_chk_guard; +#if defined __SSP__ || defined __SSP_STRONG__ || defined __SSP_ALL__ // This function requires `no_stack_protector` because it changes the // value of `__stack_chk_guard`, causing stack checks to fail before // returning from this function. -__attribute__((__constructor__, __no_stack_protector__)) +# if (defined __GNUC__ && __GNUC__ >= 11) || (defined __clang__ && __clang_major__ >= 7) +__attribute__((__no_stack_protector__)) +# else +# error This file can't be built with stack protector enabled. Remove \ + -fstack-protector* options from CFLAGS. +# endif +#endif +__attribute__((__constructor__)) static void __cdecl init(void) { unsigned int ui; -- Best regards, LIU Hao
OpenPGP_signature.asc
Description: OpenPGP digital signature
_______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public