在Windows中,什么是“目标文件”,它与“图像文件”有何不同?

在Windows中,什么是“目标文件”,它与“图像文件”有何不同?

微软文档对于 PE 文件格式提及图像文件目标文件

本规范描述了 Windows 系列操作系统下的可执行(映像)文件和目标文件的结构。这些文件分别称为可移植可执行文件 (PE) 和通用目标文件格式 (COFF)。

我知道 PE 文件格式注定要保存各种或多或少可执行的文件,包括 exe 和 dll 文件。我还知道“目标文件”通常用于库(即 dll,或 Linux 上的共享对象)。

因此,引用的句子可能意味着“目标文件” - 也是 COFF 文件?是 DLL,而图像文件 - PE - 是 exe?

更令人困惑的是,文档图像文件和目标文件均存在“COFF 头”。

所以我觉得这不太清楚:什么是图像文件?什么是目标文件?它们与 PE 格式有什么关系?coff 与什么有关?

答案1

据我了解,目标文件是编译器的中间输出创建最终的 .exe 或 .dll。例如,每个输入 .c 文件对应一个输出目标文件;它们尚未解析对其他对象或外部库的引用。链接器将目标文件组合成一个图像文件。

(当一个程序由许多源文件组成时,这意味着整个程序不必在开发人员进行每次编辑时一遍又一遍地重新编译 - 只需重新编译编辑的文件并重新链接整个程序。)

只有静态库 (.lib/.a) 包含目标文件,因为它们在链接时被读取并静态地合并到输出映像中。动态库 (.dll/.so) 以及可执行文件都是图像文件,因为它们包含直接加载到内存中执行的最终数据。

存在诸如 ELF 或 PE/COFF 之类的格式来向这些文件添加元数据 - 除了原始机器代码之外,它们还允许指定图像需要哪些动态库、它导出哪些符号(函数或变量)、它导入哪些符号等。据我所知,Windows PE 可执行映像格式是原始 COFF 的衍生产品。

相关内容