https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83641
Bug ID: 83641 Summary: -fstack-clash-protection generates incorrect CFI on i386 Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: fw at gcc dot gnu.org Target Milestone: --- Target: i386 Created attachment 42995 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=42995&action=edit unwind.i The attached unwind.i file, when compiled with -O2 -fstack-clash-protection -m32 -fPIC, produces incorrect CFI information: __GI___pthread_unwind: .LFB55: .cfi_startproc pushl %esi .cfi_def_cfa_offset 8 .cfi_offset 6, -8 pushl %ebx .cfi_def_cfa_offset 12 .cfi_offset 3, -12 pushl %esi .cfi_def_cfa_offset 16 .cfi_offset 6, -16 popl %esi .cfi_restore 6 .cfi_def_cfa_offset 12 xorl %edx, %edx call __x86.get_pc_thunk.bx addl $_GLOBAL_OFFSET_TABLE_, %ebx #APP # 114 "unwind.c" 1 movl %gs:8,%ecx # 0 "" 2 #NO_APP subl $8, %esp .cfi_def_cfa_offset 20 movl %eax, %esi The “.cfi_restore 6” directive claims that %esi has the same value as in the caller in the following code, but “movl %eax, %esi” clobbers it. I believe this is the reason why the libgcc unwinder cannot restore %esi to its original value when pthread_exit is called and glibc has been compiled with a GCC that has this bug.