On Monday 14 July 2025 19:47:49 Pali Rohár wrote:
> On Monday 14 July 2025 10:46:36 LIU Hao wrote:
> > 在 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;
> > 
> 
> Ok, that is also a solution.

The change should be applied also to v11.x, v12.x and v13.x branches as
it is fixing the already applied commit.


_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to