-pie到底做什么?

Xia*_*ami 5 c linux linker gcc code-generation

file /bin/ls并得到输出:

/ bin / ls:ELF 64位LSB共享库,x86-64,版本1(SYSV),动态链接,解释器/lib64/ld-linux-x86-64.so.2,用于GNU / Linux 2.6.32,剥离

我发现原因是我的gentoo正在使用-pie编译所有内容。

如果我将-nopie传递给gcc,我将得到正确的答案:

a.out:ELF 64位LSB可执行文件,x86-64,版本1(SYSV),动态链接,解释器/lib64/ld-linux-x86-64.so.2,用于GNU / Linux 2.6.32,未剥离

另外,我在构建.so时也发现了一些东西,它也是可执行文件。它使用-pie使DSO可执行。

在gcc的手册页中,它简要描述了:

-pie
在支持它的目标上生成与位置无关的可执行文件。

所以我想知道-pie到底在做什么?它如何使我的可执行文件被识别为共享对象?

R..*_*R.. 7

“可执行文件”和“共享对象”之间的区别在很大程度上是人为的。该file命令向您显示的是ELF e_type标头是ET_EXEC还是ET_DYN。这是一个相当技术上的区别,与装载机如何对待它们有关。file(通过其魔术文件)应该通过寻找其他特征(例如PT_INTERP程序标头的存在)来区分“共享库”和“ PIE可执行文件”意义上的“共享对象”。)或入口地址(尽管某些库似乎没有意义)。

为了解决这个-pie问题,它会生成一个可以在任意基地址处加载的可执行文件,而不是其加载地址在ld-time 固定的“普通”可执行文件。它们使用共享库中使用的相同类型的与位置无关的代码和装入标头,它们也可以在任意地址处装入(并且必须在任意地址处装入,因为任何固定地址可能已被主可执行文件或另一个库使用)。PIE通常被认为是一种强化机制(允许地址随机化影响主程序中代码和数据的地址),但它也可以具有其他用途,例如使二进制文件更适合于无MMU的系统。