据我所知,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会将可执行文件识别为共享库?
-static
生成ET_EXEC
,默认情况下GCC生成共享对象以便进行重定位。这会与PIE、x86_64和ASRL有些纠缠。 - Margaret Bloomgcc -no-pie
,也会生成ELF可执行文件而不是共享对象,因为对于可执行文件的ASLR来说,这是一种利用动态链接器现有功能处理具有ELF入口点的共享对象的黑客方式。 - Peter Cordes