Clarification on Binary file (PE/COFF & ELF) formats & terminology
我对术语没什么困惑。
A file that is given as input to the linker is called Object File.
The linker produces an Image file, which in turn is used as input by the loader.
我来自" MS PE
- 在二读时,我不确定是否要问您的问题-您是否在询问PE,COFF和ELF之间的区别,链接/加载的工作方式以及地址的解析方式或其他原因?
-
我将问题分为两个问题:VA & RVA上的另一个问题是stackoverflow.com/questions/2170843/
-
@Michael Burr:1.我对object file的术语差异感到困惑
-
对于术语"二进制文件","图像文件"或"目标文件"没有严格的定义。
特别是术语"目标文件"有时可能表示由编译器输出的中间文件,以供链接器使用,但在另一种情况下则可能表示可执行文件。
尤其是在不同的平台上,它们可能用于指代不同或相似的事物。即使在单一平台上讨论问题时,一位作家可能也会使用与另一位作家稍有不同的术语。
关于" PE"和" COFF",我的回忆是,Microsoft使用" COFF"规范作为" PE"规范的起点,但根据他们的需要对其进行了扩展。因此严格来说," PE"文件不是" COFF"文件,但是在许多方面都非常相似。
434511
gcc -c将在Linux系统上生成一个.o文件,该文件是elf格式的目标文件。" ELF可重定位的32位LSB,英特尔80386,版本1(SYSV)"是通过我的计算机上的file命令描述.o文件的方式。
434511
关于ELF的Q2,ELF不仅是图像文件的格式,而且还是目标文件的格式。
每个ELF文件都以ELF标头开头。 ELF标头的第二个字段是e_type;此字段使我们知道文件是对象文件(在ELF中又是可重定位的),图像(可以是可执行文件或共享对象)还是其他内容(核心文件也是ELF文件)。
434511
我是OP。每个人的答案都是部分答案。因此,我将所有其他答案与我学到的答案结合起来。
这是"常规"使用的术语。
-
作为链接器的输入(汇编器的输出)提供的文件称为Object File或Relocatable File。
-
链接器生成一个Image file,而它又被加载程序用作输入。现在,Image file可以是Executable file或Library file。这些"库文件"有两种:
-
静态库(用于Windows的* .lib文件。对于Linux的* .a)
-
共享/动态库:DLL(Windows上的* .dll)
-
对于术语"二进制文件","图像文件"或"目标文件"没有严格的定义。
特别是术语"目标文件"有时可能表示由编译器输出的中间文件,以供链接器使用,但在另一种情况下则可能表示可执行文件。
尤其是在不同的平台上,它们可能用于指代不同或相似的事物。即使在单一平台上讨论问题时,一位作家可能也会使用与另一位作家稍有不同的术语。
关于" PE"和" COFF",我的回忆是,Microsoft使用" COFF"规范作为" PE"规范的起点,但根据他们的需要对其进行了扩展。因此严格来说," PE"文件不是" COFF"文件,但是在许多方面都非常相似。
434511
gcc -c将在Linux系统上生成一个.o文件,该文件是elf格式的目标文件。" ELF可重定位的32位LSB,英特尔80386,版本1(SYSV)"是通过我的计算机上的file命令描述.o文件的方式。
434511
关于ELF的Q2,ELF不仅是图像文件的格式,而且还是目标文件的格式。
每个ELF文件都以ELF标头开头。 ELF标头的第二个字段是e_type;此字段使我们知道文件是对象文件(在ELF中又是可重定位的),图像(可以是可执行文件或共享对象)还是其他内容(核心文件也是ELF文件)。
434511
我是OP。每个人的答案都是部分答案。因此,我将所有其他答案与我学到的答案结合起来。
这是"常规"使用的术语。
-
作为链接器的输入(汇编器的输出)提供的文件称为Object File或Relocatable File。
-
链接器生成一个Image file,而它又被加载程序用作输入。现在,Image file可以是Executable file或Library file。这些"库文件"有两种:
-
静态库(用于Windows的* .lib文件。对于Linux的* .a)
-
共享/动态库:DLL(Windows上的* .dll)
-
对于术语"二进制文件","图像文件"或"目标文件"没有严格的定义。
特别是术语"目标文件"有时可能表示由编译器输出的中间文件,以供链接器使用,但在另一种情况下则可能表示可执行文件。
尤其是在不同的平台上,它们可能用于指代不同或相似的事物。即使在单一平台上讨论问题时,一位作家可能也会使用与另一位作家稍有不同的术语。
关于" PE"和" COFF",我的回忆是,Microsoft使用" COFF"规范作为" PE"规范的起点,但根据他们的需要对其进行了扩展。因此严格来说," PE"文件不是" COFF"文件,但是在许多方面都非常相似。
434511
gcc -c将在Linux系统上生成一个.o文件,该文件是elf格式的目标文件。" ELF可重定位的32位LSB,英特尔80386,版本1(SYSV)"是通过我的计算机上的file命令描述.o文件的方式。
434511
关于ELF的Q2,ELF不仅是图像文件的格式,而且还是目标文件的格式。
每个ELF文件都以ELF标头开头。 ELF标头的第二个字段是e_type;此字段使我们知道文件是对象文件(在ELF中又是可重定位的),图像(可以是可执行文件或共享对象)还是其他内容(核心文件也是ELF文件)。
434511
我是OP。每个人的答案都是部分答案。因此,我将所有其他答案与我学到的答案结合起来。
这是"常规"使用的术语。
我是OP。每个人的答案都是部分答案。因此,我将所有其他答案与我学到的答案结合起来。
这是"常规"使用的术语。
-
作为链接器的输入(汇编器的输出)提供的文件称为Object File或Relocatable File。
-
链接器生成一个Image file,而它又被加载程序用作输入。现在,Image file可以是Executable file或Library file。这些"库文件"有两种:
-
静态库(用于Windows的* .lib文件。对于Linux的* .a)
-
共享/动态库:DLL(Windows上的* .dll)
-
实际上,术语模块是否用于描述加载的PE图像取决于上下文。这是用户模式下Image Loader中的一个常用术语,因为从模块之间的依赖关系来描述EXE与DLL或两个DLL之间的符号依赖关系是有意义的。但是,从内核模式内存管理器的angular来看(在描述节和段对象时),加载的映像仍仅称为映像,因为用模块来描述内存映射没有意义。
-
看起来其中一个图像链接已失效,有人知道图像曾经是什么吗?我在archive.org上找不到它。
对于术语"二进制文件","图像文件"或"目标文件"没有严格的定义。
特别是术语"目标文件"有时可能表示由编译器输出的中间文件,以供链接器使用,但在另一种情况下则可能表示可执行文件。
尤其是在不同的平台上,它们可能用于指代不同或相似的事物。即使在单一平台上讨论问题时,一位作家可能也会使用与另一位作家稍有不同的术语。
关于" PE"和" COFF",我的回忆是,Microsoft使用" COFF"规范作为" PE"规范的起点,但根据他们的需要对其进行了扩展。因此严格来说," PE"文件不是" COFF"文件,但是在许多方面都非常相似。
关于ELF的Q2,ELF不仅是图像文件的格式,而且还是目标文件的格式。
每个ELF文件都以ELF标头开头。 ELF标头的第二个字段是e_type;此字段使我们知道文件是对象文件(在ELF中又是可重定位的),图像(可以是可执行文件或共享对象)还是其他内容(核心文件也是ELF文件)。
- 惊人的!!多数民众赞成在那,一条有价值的信息。您知道与PE类似的情况吗?
-
是的,从此文档(microsoft.com/whdc/system/platform/firmware/PECOFF.mspx)看来,PE所做的事情类似("在目标文件的开头,或在图像文件签名后,标准COFF文件头")。
-
我不是说PE标头。我知道PE文件有一个标头。我当时在问这样的标志位。 PE是否也有任何区分ObjectFile和ImageFile的标志。
gcc -c将在Linux系统上生成一个.o文件,该文件是elf格式的目标文件。" ELF可重定位的32位LSB,英特尔80386,版本1(SYSV)"是通过我的计算机上的file命令描述.o文件的方式。
n