-fPIE(“位置无关的可执行文件”)(gcc,ld)

在gcc和ld中需要什么-fPIE (-pie,“与位置无关的可执行文件”)选项?

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

PIE支持可执行文件中的地址空间布局随机化(ASLR) 。

在PIE模式创build之前,程序的可执行文件不能放在内存中的随机地址处,只能将位置独立的代码(PIC)dynamic库重定位到随机偏移量。 它非常类似于PIC为dynamic库所做的工作,区别在于没有创build过程链接表(PLT),而是使用PC相对重定位。

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

PIE在这个OpenBSD PIE演示中有很好的描述。

这张幻灯片展示了function的变化(PIE vs PIC)。

x86图片对馅饼

局部全局variables和函数在饼图中进行了优化

外部全局variables和函数与pic相同

并在这张幻灯片 (PIE vs老式链接)

x86馅饼vs无标记(固定)

局部全局variables和函数类似于固定的

外部全局variables和函数与pic相同

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