【问题标题】:What does -pie do exactly?-pie 到底是做什么的?
【发布时间】:2015-08-06 05:29:21
【问题描述】:

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 , 不剥离

另外,我在building a .so that is also an executable 找到了一些东西。它使用 -pie 使 DSO 可执行。

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

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

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

【问题讨论】:

    标签: c linux gcc linker code-generation


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 2014-01-02
      • 2013-10-10
      • 2017-05-08
      • 2022-01-20
      • 2012-10-17
      • 2017-06-15
      • 2011-05-20
      • 2010-11-13
      相关资源
      最近更新 更多