【问题标题】:What is the difference between executable formats?可执行格式有什么区别?
【发布时间】:2016-03-29 19:08:31
【问题描述】:
PE、ELF 和 Mach-O 之间有什么主要区别吗?我的意思是,一个人有其他人没有的能力吗?一个人可以携带比其他人更多的信息吗?还是它们只是相同信息的不同容器格式?
我对此不是很了解,但在我看来,它们都带有文本(代码)部分、已初始化和未初始化的数据部分等,以及重定位、符号、字符串、导入和导出表。
我不是在问细微的差异,例如格式 X 可以拆分数据部分,或者格式 Y 可以在硬件中更有效地解析。
我问的是主要差异,这样它们可能会影响新通用操作系统的选择。或者,如果一个平台有一个适用于所有 3 种格式的加载器,那么只需“重新打包”这些部分并将表格重写为新格式,就可以轻松地将一种格式转换为另一种格式。
【问题讨论】:
标签:
elf
portable-executable
mach-o
【解决方案1】:
Mach-O 来自于 1985 年的 CMU Mach。它被 NeXT 和 Apple 采用。 PE 来自于 1993 年的 Microsoft Windows NT 3.1。ELF 来自最迟 1993 年的 ATT 的 System V。这些是旧的 32b 格式,后来扩展到 64b。添加了字段并扩展了枚举,但它们的结构保持不变。它们的主要区别在于 Mach-O 是 OSX+iOS 的基础; PE 是 Windows 的基础;并且 ELF 是 Linux、FreeBSD 的基础...... ELF 在 Windows 上也受支持,Windows 子系统用于 Linux。每个都支持动态库、PIE、ASLR,...。您不会根据功能选择一个,而是选择一个目标,然后选择您的对象/可执行格式。 GNU ld 链接器处理所有三种格式,实际上 OSX 链接器是 ld 的分叉版本。