我可以让clang生成函数指针的绝对地址吗?
Can I make clang generate absolute addresses for function pointers?
下面是我正在使用的一些代码的简化版本:
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)上,指令可以相对于指令指针进行操作,这提高了该技术的效率(并且使其在性能成本上基本"免费")。
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- 如何使用构造函数初始化内存地址(指针变量)?
- 数组基础地址指针
- 如何在不使用返回的情况下从函数获取变量的地址(指针)
- 将绝对地址强制转换为指针变量的现代C++方法是什么?
- 保存QWidgets的地址/指针
- C++ 读取内存地址/指针和偏移量
- 使用绝对指针地址作为模板参数
- 从存储在 CTreeCtrl 的 LPARAM 中的结构中检索地址/指针 (IXMLDOMNode*) - 不起作用
- 简单的C++地址/指针澄清
- 如何获取成员函数的地址指针
- 当“按引用传递”成为强制传递而不是按地址/指针传递时
- 是任何编程语言(C++、C#、Java、C.)中声明函数的最终内存地址,无论是相对地址还是绝对地址
- 是C/ c++指针保持绝对内存地址,或相对于应用程序,或相对于模块
- 我可以让clang生成函数指针的绝对地址吗?
- C++ 为什么不是同一个地址(指针)