繁体   English   中英

-pie到底做了什么?

[英]What does -pie do exactly?

file /bin/ls并得到输出:

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

我发现原因是我的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到底做了什么? 它如何使我的可执行文件被识别为共享对象?

“可执行”和“共享对象”之间的区别在很大程度上是人为的。 file命令显示的是ELF e_type标头是ET_EXEC还是ET_DYN 这是一个相当技术性的区别,与装载机如何处理它们有关。 file (通过它的魔法文件)应该被教导通过寻找其他特征来区分“共享库”和“PIE可执行”意义上的“共享对象”,例如存在PT_INTERP程序头(这些库通常会赢得' t)或者可能是一个入口点地址(虽然有些库似乎没有意义)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM