【问题标题】:Clarification on Binary file (PE/COFF & ELF) formats & terminology澄清二进制文件 (PE/COFF & ELF) 格式和术语
【发布时间】:2011-01-11 08:46:20
【问题描述】:

我在术语上有点混乱。

作为链接器输入的文件称为对象文件。 链接器生成一个图像文件,然后加载器将其用作输入。

我从“MS PE & COFF 规范”中得到这个

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

Q2. 所以,根据上述术语,PE/ELF/COFF 是 Image File 而不是 Object File 的格式。 对吗?但是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。

【问题讨论】:

  • 在二读时,我不确定您的问题是什么 - 您是否询问 PE、COFF 和 ELF 之间的区别、链接/加载的工作方式以及地址的解析方式,还是别的什么?
  • 我把我的问题分成了2个问题:VA & RVA上的另一个问题是stackoverflow.com/questions/2170843/…
  • @Michael Burr:1. 我对 PE/COFF 和 ELF 规范中使用的 object fileImage file 的术语差异感到困惑。 2. 坚持上面提到的object file & Image file 术语,object files 是否也是 PE/COFF 格式(在 windows 上)和 ELF 格式(在 linux 上)?
  • @Michael Burr:是你把答案贴出来删了吗?如果是您,请重新发布答案,因为它清楚地解决了我的第一部分查询。
  • @claws:我取消了我的答案。但仅供参考,我最初删除了它,因为它似乎主要是在重申您在问题中的信息,而不是回答它。

标签: windows linux assembly elf portable-executable


【解决方案1】:

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

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

  • 作为链接器的输入(汇编器的输出)提供的文件称为Object FileRelocatable File

  • 链接器产生一个Image file,它又被加载器用作输入。现在,Image file 可以是Executable 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 alt text http://www.gliffy.com/pubdoc/1978433/L.jpg

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

“目标文件”这个词有时可能用来表示编译器输出供链接器使用的中间文件,但在另一种情况下可能表示可执行文件。

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

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

我知道PE源自COFF。 但为什么微软 PE格式的规范被命名为 Microsoft 便携式可执行文件“和 通用对象文件格式 规范”。他们还支持吗? 咖啡?如果他们,在哪个操作系统中?我想 PE早就完全取代了COFF。

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

【讨论】:

  • 其实,是否用module这个词来描述一个加载的PE镜像,还是要看上下文的。它是用户模式下 Image Loader 中的常用术语,因为根据模块之间的依赖关系来描述 EXE 和 DLL 之间或两个 DLL 之间的符号依赖关系是有意义的。但是,从内核模式内存管理器的角度来看(在描述节和段对象时),加载的图像仍然只是称为 images,因为描述内存映射没有意义模块的条款
  • 其中一个图片链接好像失效了,有人知道这张图片是什么吗?我在archive.org 上找不到它。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 太棒了!!那是一条有价值的信息。你知道PE是否也有类似的情况吗?
      • 是的,从这个文档 (microsoft.com/whdc/system/platform/firmware/PECOFF.mspx) 中可以看出,PE 做了类似的事情(“在目标文件的开头,或者在图像文件的签名之后,是一个标准的 COFF 文件标题")。
      • 我不是说 PE 标头。我知道PE文件有一个标题。我在问这样一个标志位。 PE 是否也有任何标志将 ObjectFile 与 ImageFile 区分开来。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2011-03-05
        • 1970-01-01
        • 2021-02-03
        • 2018-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        相关资源
        最近更新 更多