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

            Bug ID: 87412
           Summary: -fcf-protection and -mindirect-branch=thunk are
                    incompatible on x86_64
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fw at gcc dot gnu.org
  Target Milestone: ---
            Target: x86_64

Consider this test program:

__attribute__ ((weak))
int
f1 (int (*f2) (void))
{
  return f2 ();
}

int
f2 (void)
{
}

int
main (void)
{
  f1 (f2);
}

Compiled with ā€œ-O2 -mindirect-branch=thunk -fcf-protection -cā€, we get an
object file which has:

Displaying notes found in: .note.gnu.property
  Owner                 Data size       Description
  GNU                  0x00000010       NT_GNU_PROPERTY_TYPE_0
      Properties: x86 feature: IBT, SHSTK

But also:

0000000000000000 <__x86_indirect_thunk_rdi>:
   0:   e8 07 00 00 00          callq  c <__x86_indirect_thunk_rdi+0xc>
   5:   f3 90                   pause  
   7:   0f ae e8                lfence 
   a:   eb f9                   jmp    5 <__x86_indirect_thunk_rdi+0x5>
   c:   48 89 3c 24             mov    %rdi,(%rsp)
  10:   c3                      retq   

The retq will trap on CET-capable hardware because the shadow stack says it
should return to address 7, and not to the address in %rdi.

Seen with: xgcc (GCC) 9.0.0 20180924 (experimental)

Suggested fix is to error out when both options are specified at the same time.

Reply via email to