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

在术语上我很困惑。

input到链接器的文件称为对象文件 。 链接器产生一个Image文件 ,这个文件又被加载器用作input。

我从“MS PE&COFF规格”

Q1。 图像文件也被称为Binary ImageBinary File或只是Binary 。 对?

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

本章描述了被称为ELF(可执行和链接格式)的目标文件格式。 有三种主要types的目标文件。

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

  • 可执行文件保存适合于执行的程序; 该文件指定exec(BA_OS)如何创build程序的过程映像。

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

他认为Object File和Image File都是ELF格式,他完全不区分对象和图像文件,而是将它们通常称为Object文件。 是不是错了?

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

我是OP。 每个人的答案都是部分答案。 所以,我把所有其他的答案与我所学到的结合起来。

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

  • 输入到链接器(汇编器的输出)的Object File称为Object FileRelocatable File

  • 链接器产生一个Image file ,这个Image file又被加载器用作输入。 现在, Image file可以是Executable fileLibrary file 。 这些“库文件”有两种:

    1. 静态库(* .lib文件,用于windows。* .a for linux)
    2. 共享/动态库: DLL (Windows上的* .dll)和Shared Object file (Linux中的* .so)
  • 术语Binary File / Binary File可以用来引用一个ObjectFile或一个ImageFile。 取决于上下文。 这是一个非常通用的术语。

  • 加载器将图像文件加载到内存中时。 然后它被称为modulee (我不知道Linux的家伙,但窗户家伙称之为modulee

http://img.zgserver.com/windows/L.jpg 替代文字http://img.zgserver.com/windows/L.jpg

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

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

特别是在不同的平台上,它们可能被用来指代不同或类似的东西。 即使在单个平台上讨论问题时,一个作者也许会以不同的方式使用这些术语。

  • 这两个ObjectFile和ImageFile在Linux中都是以Windows&ELF格式的PE格式。
  • ELF不仅是图像文件的格式,也是目标文件的格式。
  • 每个ELF文件都以ELF标题开头。 ELF头的第二个字段是e_type ; 这个字段让我们知道文件是否是一个目标文件(又名ELF术语中的可重定位文件),或者一个图像(可以是可执行文件或共享对象)或其他文件(核心文件也是ELF文件)。
  • 我不知道在标题中是否有任何区别Object文件和Image文件的位。 它需要检查。

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

就“PE”与“COFF”而言,我记得微软使用“COFF”规范作为“PE”规范的出发点,但根据自己的需要进行了扩展。 所以严格来说,一个“PE”文件不是一个“COFF”文件,但在很多方面非常相似。

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

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

特别是在不同的平台上,它们可能被用来指代不同或类似的东西。 即使在单个平台上讨论问题时,一个作者也许会以不同的方式使用这些术语。

就“PE”与“COFF”而言,我记得微软使用“COFF”规范作为“PE”规范的出发点,但根据自己的需要进行了扩展。 所以严格来说,一个“PE”文件不是一个“COFF”文件,但在很多方面非常相似。

gcc -c将在Linux系统上生成一个.o文件,这是一个elf格式的目标文件。 “ELF 32位LSB可重新定位,Intel 80386,版本1(SYSV)”是如何通过我的机器上的file命令描述.o文件。

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

每个ELF文件都以ELF标题开头 。 ELF头的第二个字段是e_type ; 这个字段让我们知道该文件是否是一个目标文件(又名ELF说法可重定位),一个图像(可以是可执行文件或共享对象)或其他东西(核心文件也是ELF文件)。

另外,我知道Solaris上的核心转储(我猜测其他Unix风格)可以是ELF格式。