【发布时间】:2018-10-22 12:27:43
【问题描述】:
好吧,据我所知 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 纠缠在一起。 -
@MargaretBloom: 甚至
gcc -no-pie使 ELF 可执行文件而不是共享对象,因为用于可执行文件的 ASLR 是一种利用动态链接器的现有功能来处理具有 ELF 条目的共享对象的黑客行为点。