我(试图)遵循一个旧答案,但我一定做错了什么:该函数没有内联(它仍然在反汇编中被调用)。这是我所做的:
get_regs.h:
inline unsigned long __get_esp(void) {
__asm__("movl %esp,%eax");
}
程序.c:
...
#include "get_regs.h "
...
extern unsigned long __get_esp(void);
...
tmp = __get_esp();
编译为(出于各种原因的其他选项):
gcc -g -fno-stack-protector -mpreferred-stack-boundary=2 program.c
这遵循第二条建议,将定义包含在头文件中。
我意识到我可以使用扩展程序集并将结果从%eax
to复制tmp
,但想了解进行内联。我在 SO 上找到了一些热门,但似乎没有一个能涵盖我的情况。
系统:
- Ubuntu 12.04
- gcc 4.6.3。
- x86 32 位