https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70064
Uroš Bizjak <ubizjak at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |hjl.tools at gmail dot com --- Comment #2 from Uroš Bizjak <ubizjak at gmail dot com> --- Hohum, the problem here is where following asm part is positioned: call __x86.get_pc_thunk.bx # 263 set_got [length = 12] addl $_GLOBAL_OFFSET_TABLE_, %ebx If these two insns are positioned as in the attached assembly, we get: $ gcc -m32 pr70064.s $ ./a.out 0000318f9e133088 Aborted (core dumped) But moving insns to the beginning of the assembly, like: --- pr70064.s 2016-03-03 22:57:32.576740271 +0100 +++ pr70064_.s 2016-03-03 23:20:27.579594191 +0100 @@ -18,6 +18,8 @@ pushl %ebx # 623 *pushsi2 [length = 1] .cfi_def_cfa_offset 20 .cfi_offset 3, -20 + call __x86.get_pc_thunk.bx # 263 set_got [length = 12] + addl $_GLOBAL_OFFSET_TABLE_, %ebx subl $340, %esp # 624 pro_epilogue_adjust_stack_si_add/1 .cfi_def_cfa_offset 360 movl 364(%esp), %eax # 4 *movsi_internal/1 [length = 7] @@ -48,8 +50,6 @@ movl 384(%esp), %ecx # 639 *movsi_internal/1 [length = 7] movl %edi, -56(%esp) # 282 *movsi_internal/2 [length = 4] movl 388(%esp), %edi # 460 *movsi_internal/1 [length = 7] - call __x86.get_pc_thunk.bx # 263 set_got [length = 12] - addl $_GLOBAL_OFFSET_TABLE_, %ebx negl %esi # 461 *negsi2_cmpz [length = 2] adcl $0, %edi # 462 addsi3_carry/1 [length = 3] negl %edi # 463 *negsi2_1 [length = 2] the test passes: $ gcc -m32 pr70064_.s $ ./a.out 0000318f9e1392ce I have checked that neither ebx is clobbered, nor flags chain is broken by the above two insns, so I really fail to see where and if compiler is at fault. Binutils bug maybe?