它将如何更改代码,例如函数调用?

最佳答案

PIE 是在可执行文件中支持 address space layout randomization (ASLR)

在创建 PIE 模式之前,程序的可执行文件不能放置在内存中的随机地址,只能将位置无关代码 (PIC) 动态库重新定位到随机偏移量。它的工作方式与 PIC 为动态库所做的工作非常相似,不同之处在于不创建过程链接表 (PLT),而是使用与 PC 相关的重定位。

在 gcc/linkers 中启用 PIE 支持后,程序主体被编译和链接为与位置无关的代码。动态链接器对程序模块进行完全重定位处理,就像动态库一样。全局数据的任何使用都将转换为通过全局偏移表 (GOT) 进行访问,并添加 GOT 重定位。

PIE 在 this OpenBSD PIE presentation 中有很好的描述。

功能更改显示为 in this slide(PIE 与 PIC)。



并在 this slide(PIE 与旧式链接)



请注意,PIE 可能与 -static 不兼容

关于gcc - gcc 和 ld 中与位置无关的可执行文件的 -fPIE 选项是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2463150/

10-13 09:53