如何强制GCC使用jmp指令代替ret?

时间:2017-05-10 13:52:19

标签: c++ gcc assembly x86 inline-assembly

我现在正在使用堆栈协同程序进行网络编程。但是我被返回堆栈缓冲区的失效处罚了(参见 http://www.agner.org/optimize/microarchitecture.pdf p.36),在上下文切换期间(因为我们手动更改SP寄存器)

我发现汇编语言测试后TEncSearch.cpp指令优于jmp。但是,我有一些函数间接调用用C ++语言编写的上下文切换函数(由GCC编译)。我们如何在GCC汇编结果中使用ret而不是jmp来强制执行这些函数返回?

一些常见但不完美的方法:

  1. ret之前使用内联汇编并手动将SP寄存器设置为__builtin_frame_address+2*sizeof(void*)jmp到返回地址?
  2. 这是一种不安全的解决方案。在C ++中,在ret指令之前破坏局部变量或正确的值。如果我们ret,我们将省略这些指令。更糟糕的是,即使我们在C中,被调用者保存的寄存器也需要在jmp指令之前恢复,我们也将省略这些指令。

    那么我们可以做什么强制GCC使用jmp而不是ret来避免上面列出的问题

1 个答案:

答案 0 :(得分:3)

使用汇编程序宏:

.macro ret
       pop %ecx
       jmp *%ecx
.endm

将它放在文件顶部或其他位置的内联汇编程序中。