“LSB 可执行文件”(ET_EXEC)和“LSB 共享对象”(ET_DYN)有什么区别?

Eva*_*oll 9 gcc elf ld

有两个文件,一个编译并链接,gcc另一个手动使用nasmld我得到

  • ELF 32 位 LSB 共享对象...
  • ELF 32 位 LSB 可执行文件...

这两件事有什么区别?我可以看到readelf -h那个是

  • 类型: DYN (Shared object file)
  • 类型: EXEC (Executable file)

我可以在维基百科ET_DYNET_EXEC上看到这些记录。这两者之间有什么实际区别?

Eva*_*oll 5

这似乎与位置无关可执行文件(PIE)有关。当 GCC 默认编译可执行文件时,它会使它们成为 PIE,从而将 ELF 标头上的输出标志更改为ET_DYN.

您可以使用以下命令禁用 PIE 可执行文件的生成

  • gcc -no-pie

如果您看到此检查 gcc 配置的默认选项gcc -v,您应该看到类似的内容--enable-default-pie

答案受到 StackOverflow 上此提交的启发。我打算在这里更多地使用它并解释更多。