https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71585

            Bug ID: 71585
           Summary: Cannot selectively disable stack protector with LTO
           Product: gcc
           Version: 5.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: js at alien8 dot de
  Target Milestone: ---

The following code includes a function that is intended to not be compiled with
a stack canary. This is a reduced example from an embedded project, where this
function is the function that actually sets the __stack_chk_guard variable.

The code is this:

#pragma GCC push_options
#pragma GCC optimize ("-fno-stack-protector")

__attribute__((constructor)) void foo()
{
  asm ("");
}

#pragma GCC pop_options

int main() { return 0; }

When compiled without LTO ( gcc -fstack-protector-all -O2  -o main
lto-func-attr.c ), it correctly emits a non-stack-protected function foo():

00000000004004c0 <foo>:
  4004c0:       c3                      ret    

When compiled with LTO ( gcc -fstack-protector-all -flto -O2  -o main
lto-func-attr.c ), it incorrectly emits a stack canary check:

00000000004004a0 <foo>:
  4004a0:       48 83 ec 18             sub    rsp,0x18
  4004a4:       64 48 8b 04 25 28 00    mov    rax,QWORD PTR fs:0x28
  4004ab:       00 00 
  4004ad:       48 89 44 24 08          mov    QWORD PTR [rsp+0x8],rax
  4004b2:       31 c0                   xor    eax,eax
  4004b4:       48 8b 44 24 08          mov    rax,QWORD PTR [rsp+0x8]
  4004b9:       64 48 33 04 25 28 00    xor    rax,QWORD PTR fs:0x28
  4004c0:       00 00 
  4004c2:       75 05                   jne    4004c9 <foo+0x29>
  4004c4:       48 83 c4 18             add    rsp,0x18
  4004c8:       c3                      ret    
  4004c9:       e8 72 ff ff ff          call   400440 <__stack_chk_fail@plt>


The expected behavior is that even with LTO, no stack canary check is emitted.

I am using gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) running on Fedora 23
x86_64.

Reply via email to