【发布时间】:2011-12-06 07:03:13
【问题描述】:
这是我现在正在使用的一些代码的简化版本:
int Do_A_Thing(void)
{
return(42);
}
void Some_Function(void)
{
int (*fn_do_thing)(void) = Do_A_Thing;
fn_do_thing();
}
当我在 xcode 4.1 中编译它时,它生成的汇编器会设置 fn_do_thing 变量,如下所示:
0x2006: calll 0x200b ;
0x200b: popl %eax ; get EIP
0x200c: movl 1333(%eax), %eax
即它为查找 Do_A_Thing 函数的位置生成一个相对地址——“当前指令加 1333”,根据映射文件,它是指向该函数的“非惰性指针”。
当我在 Windows 上使用 Visual Studio 编译类似代码时,windows 会生成一个固定地址,而不是相对像这样进行。例如,如果 Do_A_Thing 位于 0x40050914,它只需将 fn_do_thing 设置为 0x40050914。相比之下,xcode 将其设置为“我在哪里 + 一些偏移量”。
有没有办法让 xcode 生成一个绝对地址来设置函数指针,就像 Visual Studio 那样?还是有什么原因不起作用?我注意到每次运行程序时,Do_A_Thing 函数(和所有其他函数)似乎加载到不同的地址。
【问题讨论】:
-
为了好奇,何必呢?你是在写分析工具还是什么?