【问题标题】:Different types of object files不同类型的目标文件
【发布时间】:2020-09-14 04:59:48
【问题描述】:

ELF 文档中的e_type 列出了以下可用的对象文件类型:

Name       Value     Meaning
ET_NONE    0         No file type
ET_REL     1         Relocatable file
ET_EXEC    2         Executable file
ET_DYN     3         Shared object file
ET_CORE    4         Core file
ET_LOPROC  0xff00    Processor-specific
ET_HIPROC  0xffff    Processor-specific

我在哪里可以详细了解这些文件类型是什么?例如,我从未听说过“特定于处理器”的文件:有什么例子?


在做$ xxd -l 32 /bin/ls时,对象类型是ET_DYN:

00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
00000010: 0300 <-- object type = 3 or "shared object file"

为什么ls 不被视为可执行文件,而是共享对象? (编者按:这部分是Why does GCC create a shared object instead of an executable binary according to file?的副本,另外readelf -h /bin/ls是解码ELF头的更简单的方法,包括ELF类型)


最后,core 文件是什么?这像堆栈跟踪吗? http://man.netbsd.org/core.5, Get the address that caused segmentation fault from core dump using C.

(编者注:此部分与 What is a core dump file in Linux? What information does it provide? 重复。不幸的是,这是 1 个帖子中的 3 个问题,因此在回答非重复部分时不能轻易将其标记为重复)

【问题讨论】:

  • 简化视图:ET_REL => 对象文件 ET_EXEC => 非 PIE 可执行文件(固定加载基础),ET_DYN => 共享库和 PIE 执行程序,ET_CORE => 核心dump?, ET_LOPROC-ET_HIPROC => 由特定处理器的 ELF 补充定义(到目前为止,AFAIK、x86、ARM、powerPc、IBM zseries 和 PA-RISC 没有定义特定类型)。
  • 关于ls的部分是Why does GCC create a shared object instead of an executable binary according to file?的复制品。关于为什么ls 是 ET_DYN 的部分已经作为一个单独的问题存在。
  • @MargaretBloom 我看到这样做as file.s 将创建一个ET_REL 文件(目标文件),然后执行ld file.o 将创建ET_EXEC(可执行文件)。这或多或少是正确的吗?

标签: assembly elf abi


【解决方案1】:

您的问题分为两部分:

处理器特定类型

如果未来的 CPU 系列想要定义一种新的文件类型,这些将作为“扩展点”。没有一个主要的处理器系列使用过这个范围内的东西,所以即使稍微搜索一下,我也找不到任何例子。

lsET_DYN

ET_DYN 常量仅仅意味着对象是运行时可重定位的。传统上,这已用于共享对象 (.so),但对于 glibc 中的与位置无关的可执行文件 (PIE),它们重用与共享对象相同的编译器和加载器代码来执行运行时重定位,导致这种混乱可执行文件被报告为共享对象的情况。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
相关资源
最近更新 更多