gpt4 book ai didi

c++ - 我可以让 clang 为函数指针生成绝对地址吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:56:02 59 4
gpt4 key购买 nike

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

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 函数(以及所有其他函数)似乎都加载到不同的地址。

最佳答案

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

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

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

关于c++ - 我可以让 clang 为函数指针生成绝对地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7743252/

59 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com