-pie到底做什么?
作者:互联网
我归档/ bin / ls并获得输出:
/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, stripped
我发现原因是我的gentoo正在使用-pie编译所有内容.
如果我将-nopie传递给gcc,我将得到正确的答案:
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, not stripped
另外,我在building a .so that is also an executable处找到了一些东西.它使用-pie来使DSO可执行.
在gcc的手册页中,它简要描述了:
-pie
Produce a position independent executable on targets that support it.
所以我想知道-pie到底在做什么?它如何使我的可执行文件被识别为共享对象?
解决方法:
“可执行文件”和“共享对象”之间的区别在很大程度上是人为的.该文件命令显示的是ELF e_type标头是ET_EXEC还是ET_DYN.这是一个相当技术上的区别,与装载机如何对待它们有关.文件(通过其魔术文件)可能应该通过寻找其他特征(例如PT_INTERP程序标头的存在)来教您如何区分“共享库”和“ PIE可执行文件”意义上的“共享对象”.没有)或入口地址(尽管某些库似乎没有意义).
为了解决-pie的作用,它将生成可以在任意基地址处加载的可执行文件,而不是其加载地址在ld时间固定的“正常”可执行文件.它们使用共享库中使用的相同类型的与位置无关的代码和装入标头,它们也可以在任意地址处装入(并且必须在任意地址处装入,因为任何固定地址可能已被主可执行文件或另一个库使用). PIE通常被认为是一种强化机制(允许地址随机化以影响主程序中代码和数据的地址),但它也可以具有其他用途,例如使二进制文件更适合于无MMU的系统.
标签:gcc,linker,code-generation,c-3,linux 来源: https://codeday.me/bug/20191028/1951324.html