16

我在术语上很少混淆。

作为链接器输入的文件称为Object File。链接器生成一个Image 文件,该文件又用作加载程序的输入。

我从“MS PE & COFF Specification”得到这个

Q1。图像文件也称为Binary ImageBinary File或简称为Binary. 对?

Q2。因此,根据上述术语,PE/ELF/COFF 是图像文件而不是目标文件的格式。对?但是http://www.sco.com/developers/gabi/latest/ch4.intro.html

本章介绍目标文件格式,称为 ELF(可执行和链接格式)。目标文件主要分为三种类型。

  • 可重定位文件包含适合与其他目标文件链接以创建可执行文件或共享目标文件的代码和数据。

  • 可执行文件包含适合执行的程序;该文件指定 exec(BA_OS) 如何创建程序的进程映像。

  • 共享对象文件包含适合在两个上下文中链接的代码和数据。首先,链接编辑器 [参见 ld(BA_OS)] 处理共享对象文件与其他可重定位和共享对象文件以创建另一个对象文件。其次,动态链接器将其与可执行文件和其他共享对象结合起来,以创建进程映像。

矛盾的是,他说目标文件和图像文件都是 ELF 格式,他根本没有区分目标文件和图像文件,而是通常将它们称为目标文件。是不是错了?

Q3。我知道PE源自COFF。但是为什么微软PE格式规范被命名为Microsoft Portable Executable《通用对象文件格式规范》。他们还支持COFF吗?如果他们,在哪个操作系统中?我以为PE很久以前就完全取代了COFF。

4

5 回答 5

16

我是OP。每个人的答案都是部分答案。因此,我将所有其他答案与我学到的知识结合起来以完成答案。

这是“一般”使用的术语。

  • 作为链接器的输入(汇编器的输出)给出的文件称为Object Fileor Relocatable File

  • 链接器生成一个Image file,然后加载器将其用作输入。现在, anImage file可以是 anExecutable fileLibrary file。这些“库文件”有两种:

    1. 静态库(Windows 的 *.lib 文件。Linux 的 *.a)
    2. 共享/动态库:DLL(Windows 上的 *.dll)& Shared Object file(Linux 上的 *.so)
  • 术语Binary File/Binary可用于指代 ObjectFile 或 ImageFile。不明白要看具体情况。这是一个非常笼统的术语。

  • 加载器将图像文件加载到内存中。然后它被称为Module(我不确定Linux家伙,但Windows家伙称之为Module

http://www.gliffy.com/pubdoc/1978433/L.jpg 替代文本 http://www.gliffy.com/pubdoc/1978433/L.jpg

正如我所说,这些是“一般”使用的术语。术语“二进制文件”、“图像文件”或“目标文件”没有严格的定义。

特别是术语“目标文件”有时可能用于表示编译器输出供链接器使用的中间文件,但在另一个上下文中可能表示可执行文件。

特别是在不同的平台上,它们可能用于指代不同或相似的事物。即使在单个平台上讨论问题时,一位作者使用这些术语的方式也可能与另一位有所不同。

  • ObjectFile 和 ImageFile 在 windows 中都是 PE 格式,在 linux 中是 ELF 格式。
  • ELF 不仅是图像文件的格式,也是目标文件的格式。
  • 每个 ELF 文件都以 ELF Header 开头。ELF Header 的第二个字段是e_type; 这个字段让我们知道文件是对象文件(在 ELF 用语中也称为可重定位文件),还是图像(可以是可执行文件或共享对象)或其他东西(核心文件也是 ELF 文件)。
  • 我不知道标头中是否有任何位可以区分对象文件和图像文件。需要检查。

我知道PE源自COFF。但是为什么将PE格式的微软规范命名为Microsoft Portable Executable《通用对象文件格式规范》。他们还支持COFF吗?如果他们,在哪个操作系统中?我以为PE很久以前就完全取代了COFF。

至于“PE”与“COFF”,我记得微软使用“COFF”规范作为“PE”规范的起点,但为了他们的需要对其进行了扩展。所以严格来说,“PE”文件不是“COFF”文件,但它在很多方面都非常相似。

于 2010-02-03T22:25:19.153 回答
3

术语“二进制文件”、“图像文件”或“目标文件”没有严格的定义。

特别是术语“目标文件”有时可能用于表示编译器输出供链接器使用的中间文件,但在另一个上下文中可能表示可执行文件。

特别是在不同的平台上,它们可能用于指代不同或相似的事物。即使在单个平台上讨论问题时,一位作者使用这些术语的方式也可能与另一位有所不同。

至于“PE”与“COFF”,我记得微软使用“COFF”规范作为“PE”规范的起点,但为了他们的需要对其进行了扩展。所以严格来说,“PE”文件不是“COFF”文件,但它在很多方面都非常相似。

于 2010-01-31T06:44:47.933 回答
1

gcc -c 将在 Linux 系统上生成一个 .o 文件,这是一个 elf 格式的目标文件。“ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV)”是我机器上的 file 命令描述 .o 文件的方式。

于 2010-01-31T07:01:37.010 回答
1

对于 ELF 的 Q2,ELF 不仅是图像文件的格式,也是目标文件的格式。

每个 ELF 文件都以ELF Header 开头。ELF Header 的第二个字段是e_type; 这个字段让我们知道文件是对象文件(在 ELF 用语中也称为可重定位文件)、图像(可以是可执行文件或共享对象)还是其他文件(核心文件也是 ELF 文件)。

于 2010-01-31T09:39:42.263 回答
0

顺便说一句,我知道 Solaris 上的核心转储(我猜是其他 Unix 风格)可以是 ELF 格式。

于 2010-02-26T17:01:19.547 回答