如何在C中找到函数的返回地址?

时间:2014-05-22 22:45:30

标签: c windows gcc assembly inline-assembly

我试图通过阅读有关CodeProject here的文章,在C和GCC中使用少量的AT& T样式内联汇编。我希望这样做的主要原因是找到EIP寄存器的旧值,以便能够在我的代码中拥有可靠的指令地址。我写了一个简单的示例程序来证明我对此概念的理解:

#include <stdio.h>
#include <stdlib.h>

int mainReturnAddress = 0;

int main()
{
    asm volatile (
         "popl %%eax;"
         "pushl %%eax;"
         "movl %%eax, %0;"
         : "=r" ( mainReturnAddress )
       );

    printf( "Address : %d\n",  mainReturnAddress );
    return 0;
}

此特定示例的目的是从堆栈顶部弹出4个字节,表示从EIP寄存器保存的32位返回地址,然后将其推回堆栈。然后,我将其存储在全局mainReturnAddress变量中。最后,我打印存储在mainReturnAddress中的值。

我的输出来自此代码4200560

这段代码是否达到了上述目的,这是Windows平台上32位的跨处理器吗?

1 个答案:

答案 0 :(得分:5)

在GCC中,您应该使用__builtin_return_address而不是尝试使用内联汇编。