有两个文件,一个编译并链接,gcc
另一个手动使用nasm
,ld
我得到
- ELF 32 位 LSB 共享对象...
- ELF 32 位 LSB 可执行文件...
这两件事有什么区别?我可以看到readelf -h
那个是
- 类型:
DYN (Shared object file)
- 类型:
EXEC (Executable file)
我可以在WikipediaET_DYN
ET_EXEC
上看到这些记录为和. 这两者之间有什么实际区别?
有两个文件,一个编译并链接,gcc
另一个手动使用nasm
,ld
我得到
这两件事有什么区别?我可以看到readelf -h
那个是
DYN (Shared object file)
EXEC (Executable file)
我可以在WikipediaET_DYN
ET_EXEC
上看到这些记录为和. 这两者之间有什么实际区别?
这似乎与位置无关可执行文件(PIE)有关。当 GCC 默认编译可执行文件时,它会使它们成为 PIE,从而将 ELF Header 上的输出标志更改为
ET_DYN
.您可以使用禁用 PIE 可执行文件的生成
gcc -no-pie
如果您看到此检查 gcc 配置的默认选项
gcc -v
,您应该会看到类似--enable-default-pie
.受StackOverflow 上的此提交启发的答案。我打算更多地使用它并在这里解释更多。
似乎 ET_EXEC 与 ET_DYN 在 Linux 内核/动态加载程序中的主要作用是通知可执行文件是否可以使用 ASLR 放置在随机内存位置。
正如您当时得出的结论,PIE 可执行文件是 DYN,因为它们可以随机化,就像共享库一样。
我对此进行了更详细的探索,并且: