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

时间:2010-01-31 06:38:23

标签: windows linux assembly elf portable-executable

我在术语上很少混淆。

  

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

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

Q1。图片文件也称为Binary ImageBinary FileBinary。对?

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

  

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

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

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

  •   
  • 共享对象文件包含适合链接的代码和数据   上下文。首先,链接编辑器[见   ld(BA_OS)]处理共享对象   文件与其他可重定位和共享   目标文件来创建另一个对象   文件。第二,动态链接器   将它与可执行文件相结合   和其他共享对象来创建   过程形象。

  •   
矛盾的是他说对象文件和图像文件是ELF格式&他完全没有区分对象与对象。图像文件,但通常将它们称为对象文件。不是吗?

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

5 个答案:

答案 0 :(得分: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(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&在Windows&中,ImageFile采用PE格式。 Linux中的ELF格式。
  • ELF不仅是图像文件的格式,还是目标文件的格式。
  • 每个ELF文件都以ELF标头开头。 ELF标题的第二个字段是e_type;这个字段让我们知道文件是一个目标文件(也就是ELF用语中的可重定位),还是一个图像(可以是可执行文件或共享对象)或其他东西(核心文件也是ELF文件)。
  • 我不知道标题中是否有任何位来区分Object文件和Image文件。需要进行检查。
  

我知道PE来自COFF。   但为什么是微软呢   PE格式的规格命名   Microsoft Portable Executable“和   通用目标文件格式   规范“。他们仍然支持   COFF?如果他们,在哪个操作系统?我想   PE很久以前完全取代了COFF。

就“PE”与“COFF”而言,我的回忆是微软使用“COFF”规范作为“PE”规范的起点,但扩展了它的需求。严格来说,“PE”文件不是“COFF”文件,但它在很多方面非常相似。

答案 1 :(得分:2)

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

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

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

就“PE”与“COFF”而言,我的回忆是微软使用“COFF”规范作为“PE”规范的起点,但扩展了它的需求。严格来说,“PE”文件不是“COFF”文件,但它在很多方面非常相似。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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