ELF文件类型 - ET_EXEC和ET_DYN

7

据我所知,ET_EXEC用于表示文件是可执行文件,而ET_DYN则表示文件是共享库。因此,为了确保,我用C语言编写了一个简单的程序,但问题在于readelf -h输出如下:

ELF Header:
Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
Class:                             ELF64
Data:                              2's complement, little endian
Version:                           1 (current)
OS/ABI:                            UNIX - System V
ABI Version:                       0
Type:                              DYN (Shared object file)
  .
  .
  .

我原以为这和我使用的编译器有关,所以我在/bin中尝试了一些实用程序,但不幸的是结果也是一样的。因此,问题来了:为什么readelf会将可执行文件识别为共享库?


1
使用-static生成ET_EXEC,默认情况下GCC生成共享对象以便进行重定位。这会与PIE、x86_64和ASRL有些纠缠。 - Margaret Bloom
1
@MargaretBloom:即使使用gcc -no-pie,也会生成ELF可执行文件而不是共享对象,因为对于可执行文件的ASLR来说,这是一种利用动态链接器现有功能处理具有ELF入口点的共享对象的黑客方式。 - Peter Cordes
1个回答

6
为什么readelf将可执行文件识别为共享库?
因为它是(一种特殊的)共享库。另请参见this answer

1
我还在32位绝对地址在x86-64 Linux中不再允许?上写了一个关于PIE可执行文件的答案,但我提到file a.out显示gcc -no-pie的“可执行文件”,但对于PIE可执行文件则显示“共享对象”,因为它们就是这样。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接