On Wed, Oct 21, 2020 at 02:04:15PM -0700, Nick Desaulniers via Gcc-patches wrote: > Tangentially related question: > We're running into a bug related to LTO for the kernel when code > compiled with -fno-stack-protector is called from and inlined into > code that is compiled with -fstack-protector. Specifically, stack > canaries get checked before they're restored post suspend/resume which > leads to spooky bugs. > > Once we have more fine grain function level attribute to explicitly > disable stack protectors on a per function basis, I'm considering > making this function attribute a barrier to inlining in LLVM so that > callers with stack protectors don't inline callees that explicitly > should not have a stack protector and vice versa (more concretely, > when they don't match). I think this would maximize which functions > are still covered by stack protectors, and be the most straightforward > to implement.
That doesn't make sense to me. Stack protector doesn't affect in any way inlined code, the stack protection is always solely in the prologue and epilogue of out of line functions. So, if the (non-inlined) caller is -fstack-protector and inlined callee is -fno-stack-protector, there should be ssp store in the prologue of the resulting function and test in the epilogue. The effect will be exactly like that if the function wouldn't be inlined. Similarly, if the non-inlined caller is -fno-stack-protector and inlined callee is -fstack-protector, there will be no stack protection. This isn't exactly the effect one would get without the inlining (as in that case the callee would check it), but matches the general behavior that we allow inlining functions with -fstack-protector* at all (and only check it in the prologue/epilogue, not somewhere in the middle). Jakub