Hello, On Mon, 18 May 2020, Florian Weimer wrote:
> >> In glibc, we already have this: > >> > >> /* Used to disable stack protection in sensitive places, like ifunc > >> resolvers and early static TLS init. */ > >> #ifdef HAVE_CC_NO_STACK_PROTECTOR > >> # define inhibit_stack_protector \ > >> __attribute__ ((__optimize__ ("-fno-stack-protector"))) > >> #else > >> # define inhibit_stack_protector > >> #endif > >> > >> Is it broken? > > > > Depends on what your expectations are. It completely overrides all > > options given on the command line (including things like > > fno-omit-frame-pointer and -O2!). At least I was very surprised by that > > even though the current docu can be read that way; if you're similarly > > surprised, then yes, the above is broken, it does not only disable stack > > protection (but also e.g. all optimizations, despite the attributes name > > :-) ). > > Yes, that would qualify as broken. > > This is not what I observe with gcc-9.3.1-2.fc31.x86_64 from Fedora. > -O2 still has an effect. Indeed, I definitely remember an interaction with the attribute and -O{,2} (or something that I interpreted as such) but it obviously isn't as simple as plain disabling it, and right now I can't recreate the situation :-/ (It might be disabling of some further cmdline flags that I conflated in my brain with "effect of -O2") > So does -fcf-protection. -fno-omit-frame-pointer does not work for me at > all for some reason, the frame pointer is always missing? Not for me: % cat simple.c extern int bla(int *); int #ifdef ATTR __attribute__((__optimize__ ("-fno-stack-protector"))) #endif foo(int a, int b) { int c = b; return a * 42 + bla(&c); } % gcc-9 -fno-omit-frame-pointer -O -S -o - tryme.c | grep bp pushq %rbp movq %rsp, %rbp movl %esi, -20(%rbp) leaq -20(%rbp), %rdi popq %rbp % gcc-9 -fstack-protector-all -fno-omit-frame-pointer -O -S -o - tryme.c | grep bp pushq %rbp movq %rsp, %rbp movq %rax, -24(%rbp) movl %esi, -28(%rbp) leaq -28(%rbp), %rdi movq -24(%rbp), %rdx popq %rbp But using the attr: % gcc-9 -DATTR -fstack-protector-all -fno-omit-frame-pointer -O -S -o - tryme.c | grep bp % (gcc9 is gcc9-9.2.1+r275327-1.1.x86_64 on opensuse) Ciao, Michael.