gcc - gcc 和 ld 中与位置无关的可执行文件的 -fPIE 选项是什么?

标签 gcc linker aslr position-independent-code

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

最佳答案

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)。

x86 pic vs pie

Local global variables and functions are optimized in pie

External global variables and functions are same as pic

以及 this slide (PIE 与旧式链接)

x86 pie vs no-flags (fixed)

Local global variables and functions are similar to fixed

External global variables and functions are same as pic

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

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

相关文章:

windows - 强制 Windows 在某些地方加载 DLL,以使内存碎片最少

windows - 如何在 Windows 7 x64 上禁用 ASLR(地址空间布局随机化)?

c++ - 在 Mint 17.2 上安装 g++ 4.9

gcc - GCC 中的 OpenSSL 链接选项 -lssl 和 -lcrypto

c - 在 ubuntu16.04 上为 i686-elf 构建 gcc 交叉编译器时出错

iphone - Apple Mac-o-Linker (id) 错误

c++ - 库无法链接特定体系结构的可能原因?

c++ - 为什么 `sqlpp-mysql` 没有正确链接?

c - 我如何跟踪 gcc 中的变量变化

c - Linux 上的堆栈开始