“-pie”具体是做什么的?

9
我键入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具体做什么?它如何使我的可执行文件被识别为共享对象?
1个回答

13
“可执行文件”和“共享对象”的区别在很大程度上是人为的。 file 命令显示的是ELF e_type头部是ET_EXEC还是ET_DYN。这是一个相当技术性的区别,并且与加载器如何处理它们有关。通过其魔术文件,file 可能应该学会通过查找其他特征(例如PT_INTERP程序头或者入口点地址)来区分“共享库”和“PIE可执行文件”。通常认为PIE是增强机制(允许地址随机化影响主程序中代码和数据的地址),但它也可以有其他用途,比如使二进制文件更适合无MMU系统。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接