【问题标题】:ELF file type - ET_EXEC and ET_DYN [duplicate]ELF 文件类型 - ET_EXEC 和 ET_DYN [重复]
【发布时间】: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 条目的共享对象的黑客行为点。

标签: x86 elf


【解决方案1】:

为什么 readelf 将可执行文件识别为共享库?

因为它(一种特殊的)共享库。另见this answer

【讨论】:

  • 我还在32-bit absolute addresses no longer allowed in x86-64 Linux? 上写了一个包含有关 PIE 可执行文件的一些详细信息的答案,但我确实提到file a.out 显示 gcc -no-pie 的“可执行文件”,但 PIE 可执行文件的“共享对象”,因为他们就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2011-03-16
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多