【问题标题】:Can I make clang generate absolute addresses for function pointers?我可以让clang为函数指针生成绝对地址吗?
【发布时间】: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 函数(和所有其他函数)似乎加载到不同的地址。

【问题讨论】:

  • 为了好奇,何必呢?你是在写分析工具还是什么?

标签: c++ xcode macos clang


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,显然我可以使用 -Wl,-no_pie 禁用与位置无关的东西。但是,即使我这样做了,仍然会为 fn_do_thing 函数指针生成一个相对地址。你知道有什么方法可以禁用它的生成吗?
  • @Colen:您应该能够通过不传入-fPIC 来禁用所有位置独立性(即 GCC 选项,但 clang 通常使用相同的选项)
  • clang 似乎没有该选项,但感谢您的解释!
猜你喜欢
  • 2011-03-19
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
相关资源
最近更新 更多