我可以让clang生成函数指针的绝对地址吗?

Can I make clang generate absolute addresses for function pointers?

本文关键字:绝对地址 指针 函数 clang 我可以      更新时间:2023-10-16

下面是我正在使用的一些代码的简化版本:

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",根据映射文件,这是一个指向该函数的"非惰性指针"。

当我用Visual Studio在Windows上编译类似的代码时,Windows生成一个固定的地址,而不是这样做。例如,如果Do_A_Thing位于0x40050914,它只将fn_do_thing设置为0x40050914。相比之下,xcode将其设置为"where I am + some offset"。

是否有任何方法使xcode生成一个绝对地址设置函数指针,像visual studio一样?还是有什么原因让它不起作用?我注意到每次运行程序时,Do_A_Thing函数(和所有其他函数)似乎都在不同的地址加载。

您正在查看与位置无关的代码(更具体地说,与位置无关的可执行文件)。正如您所注意到的,这允许操作系统在内存中的任何位置加载二进制文件,这为潜在的不安全代码提供了许多安全性改进。

你可以通过删除XCode (-Wl,-pie)中的链接器选项来禁用它。

请注意,在x86_64 (amd64)上,指令可以相对于指令指针进行操作,这提高了该技术的效率(并且使其在性能成本上基本"免费")。