澄清二进制文件(PE/COFF和ELF)格式和术语

cla*_*aws 13 linux windows assembly elf portable-executable

我在术语上很少混淆.

作为链接器输入的文件称为对象文件.链接器生成一个Image文件,该文件又被加载器用作输入.

我从"MS PE&COFF规范"中得到了这个

Q1.图像文件也被称为Binary Image,Binary 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.但为什么Microsoft格式的PE格式被命名为Microsoft Portable Executable"和Common Object File Format Specification".他们还支持COFF吗?如果他们,在哪个操作系统?我以为PE很久以前完全取代了COFF.

cla*_*aws 14

我是OP.每个人的答案都是部分答案.所以,我将所有其他答案与我学到的完成答案相结合.

这是" 一般 "使用的术语.

  • 作为链接器输入的文件(汇编程序的输出)被称为Object FileRelocatable File.

  • 链接器生成一个Image file,然后由加载器用作输入.现在,一个Image file可以是一个Executable fileLibrary file.这些"图书馆文件"有两种:

    1. 静态库(*.lib文件用于windows.*.a用于linux)
    2. 共享/动态库:DLL(*.dll on windows)&Shared Object file(*.so in Linux)
  • 术语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标头开头.ELF标题的第二个字段是e_type; 这个字段让我们知道文件是一个目标文件(也就是ELF用语中的可重定位),还是一个图像(可以是可执行文件或共享对象)或其他东西(核心文件也是ELF文件).
  • 我不知道标题中是否有任何区别可以将Object文件与Image文件区分开来.需要检查.

我知道PE来自COFF.但为什么Microsoft格式的PE格式被命名为Microsoft Portable Executable"和Common Object File Format Specification".他们还支持COFF吗?如果他们,在哪个操作系统?我以为PE很久以前完全取代了COFF.

至于"PE"与"COFF",我的回忆是微软使用"COFF"规范作为"PE"规范的起点,但扩展了它的需求.严格来说,"PE"文件不是"COFF"文件,但它在很多方面都非常相似.