我(试图)跟随an old answer,但我必须做错事:函数没有内联(它仍然在反汇编中调用)。这是我做的:
get_regs.h:
inline unsigned long __get_esp(void) {
__asm__("movl %esp,%eax");
}
program.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
复制到tmp
,但我想了解内联。我在SO上发现了一些点击,但似乎没有一个能够覆盖我的情况。
系统:
- Ubuntu 12.04
- gcc 4.6.3。
- x86 32位
答案 0 :(得分:3)
您需要启用编译器优化(甚至是最基本的级别)才能进行内联。
顺便说一句,除非您对函数的非内联副本有任何特殊需要,否则可以删除extern重新声明,并使用头文件中包含的内联声明。