Microsoft 可移植可执行文件和通
用目标文件格式文件规范
修订版 8.0 - 2006 年 5 月 16 日
摘要
本规范描述了 Microsoft® Windows®操作系统家族下的可执行文件(映像)和目
标文件的结构。这些文件分别被称为可移植可执行(PE)文件和通用目标文件格式
(COFF)文件。
注意
提供本文档是为了辅助开发用于 Microsoft Windows 操作系统上的工具和应用程
序,但并不保证它在各个方面都是完整的规范。Microsoft 保留更改本文档而不通知
的权利。
Microsoft 可移植可执行文件和通用目标文件格式文件规范的此次修订版取代了
本规范的 6.0 修订版。
本规范的最新版在万维网的以下地址被维护:
http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
SmartTech 译
电子信箱:zhzhtst@163.com
Microsoft 可移植可执行文件和通用目标文件格式文件规范 - 2
修订版 8.0 - 2006 年 5 月 16 日
© 2005 Microsoft Corporation。保留所有权利。
法律声明
Microsoft 可移植可执行文件和通用目标文件格式文件规范
Microsoft Corporation
修订版 8.0
注意:提供本规范是为了辅助开发某些用于 Microsoft Windows 操作系统平台上的开发工具。但是
Microsoft 并不保证它在各个方面都是完整的规范,也无法保证这里的所有信息在发布之后一直都是准确
的。Microsoft 保留更改本规范而不通知的权利。
在合理的和非歧视性条款和条件下,Microsoft 将针对任何 Microsoft 认为仅在面向 Microsoft
Windows 的被称为编译器、链接器以及汇编程序的软件开发工具中实现和遵守本规范中所需部分这种有限
用途下所需要的 Microsoft 权利要求书(如果存在)授予您免版税许可。
遵守所有适用的版权法是用户的责任。在不限制版权许可权利的前提下,未经 Microsoft 明确书面许
可,不得出于任何目的或以任何形式或任何手段(电子、机械、影印、记录或其他方法)复制本规范的任
何部分,或者将其存储或引入检索系统,或者修改或用于其衍生作品,或者将其进行传播。
对于本规范中的主题,Microsoft 可能拥有知识产权。除非在书面许可中明确规定,否则提供本规范
并不意味着 Microsoft 通过暗示、默许或其它方式针对这些知识产权和其它权利授予您任何许可。
© 2006 Microsoft Corporation。保留所有权利。
本规范依“原样”提供。Microsoft 不针对下列情形作任何明示的、暗示的或者法定的表示或担保:
(1)本规范中的信息,包括对适销性、针对特定目的的适用性、不侵权或所有权的担保;(2)本规范中的内
容适用于任何用途;(3)对这些内容的实现不会侵犯任何第三方的专利、版权、商标或其它权利。
Microsoft 不就由本规范及其相关的使用或分发所带来的任何直接的、间接的、特别的、偶然的或者
后果性的损害负任何责任。
Microsoft、MS-DOS、MSDN、Visual Studio、Visual C++、Win32、 Windows、Windows NT、Windows
Server 和 Windows Vista 是 Microsoft Corporation 在美国和/或其它国家的注册商标或商标。这里提到
的其它产品和公司名称可能是其各自所有者的商标。
对于上述名称和商标,在没有事先得到其各自所有者明确书面许可的情况下,不得以任何方式使用,
包括广告或宣传本规范及其内容。
Microsoft 可移植可执行文件和通用目标文件格式文件规范 - 3
修订版 8.0 - 2006 年 5 月 16 日
© 2005 Microsoft Corporation。保留所有权利。
目录
1 基本概念 ...................................................................... 5
2 概览 .......................................................................... 6
3 文件头 ........................................................................ 7
3.1 MS-DOS占位程序(仅适用于映像文件) ....................................... 7
3.2 签名(仅适用于映像文件) ................................................. 7
3.3 COFF文件头(适用于目标文件和映像文件) ................................... 7
3.3.1 机器类型 ............................................................ 8
3.3.2 特征 ................................................................ 9
3.4 可选文件头(仅适用于映像文件) ........................................... 9
3.4.1 可选文件头中的标准域(仅适用于映像文件) ........................... 10
3.4.2 可选文件头中的Windows特定域(仅适用于映像文件) .................... 11
3.4.3 可选文件头中的数据目录(仅适用于映像文件) ......................... 13
4 节表(节头) ................................................................. 14
4.1 节标志 .................................................................. 15
4.2 成组的节(仅适用于目标文件) ............................................ 17
5 文件中的其它内容 ............................................................. 17
5.1 节中的数据 .............................................................. 17
5.2 COFF重定位信息(仅适用于目标文件) ...................................... 18
5.2.1 类型指示符 ......................................................... 18
5.3 COFF行号信息(不赞成使用) .............................................. 25
5.4 COFF符号表 .............................................................. 26
5.4.1 符号名称表示 ....................................................... 27
5.4.2 SectionNumber域的值 ................................................ 27
5.4.3 类型表示 ........................................................... 27
5.4.4 存储类别 ........................................................... 28
5.5 辅助符号表记录 .......................................................... 29
5.5.1 辅助符号表记录格式之一:函数定义 ................................... 30
5.5.2 辅助符号表记录格式之二:.bf和.ef符号 ............................... 30
5.5.3 辅助符号表记录格式之三:弱外部符号 ................................. 31
5.5.4 辅助符号表记录格式之四:文件 ....................................... 31
5.5.5 辅助符号表记录格式之五:节定义 ..................................... 31
5.5.6 COMDAT节(仅适用于目标文件) ....................................... 32
5.5.7 CLR记号定义(仅适用于目标文件) .................................... 33
5.6 COFF字符串表 ............................................................ 33
5.7 属性证书表(仅适用于映像文件) .......................................... 33
5.7.1 证书数据 ........................................................... 33
5.8 延迟加载导入表(仅适用于映像文件) ...................................... 33
5.8.1 延迟加载目录表 ..................................................... 34
5.8.2 属性 ............................................................... 34
5.8.3 名称 ............................................................... 34
5.8.4 模块句柄 ........................................................... 34
5.8.5 延迟导入地址表 ..................................................... 34
5.8.6 延迟导入名称表 ..................................................... 35
5.8.7 延迟绑定导入地址表和时间戳 ......................................... 35
5.8.8 延迟卸载导入地址表 ................................................. 35
6 特殊的节 ..................................................................... 35
6.1 .debug节 ................................................................ 37
6.1.1 调试目录(仅适用于映像文件) ....................................... 37
6.1.2 调试类型 ........................................................... 38
6.1.3 .debug$F节(仅适用于目标文件) ..................................... 38
6.1.4 .debug$S节(仅适用于目标文件) ..................................... 39
6.1.5 .debug$P节(仅适用于目标文件) ..................................... 39
6.1.6 .debug$T节(仅适用于目标文件) ..................................... 39
Microsoft 可移植可执行文件和通用目标文件格式文件规范 - 4
修订版 8.0 - 2006 年 5 月 16 日
© 2005 Microsoft Corporation。保留所有权利。
6.1.7 链接器对Microsoft调试信息的支持 .................................... 39
6.2 .drectve节(仅适用于目标文件) .......................................... 39
6.3 .edata节(仅适用于映像文件) ............................................ 39
6.3.1 导出目录表 ......................................................... 40
6.3.2 导出地址表 ......................................................... 40
6.3.3 导出名称指针表 ..................................................... 41
6.3.4 导出序数表 ......................................................... 41
6.3.5 导出名称表 ......................................................... 42
6.4 .idata节 ................................................................ 42
6.4.1 导入目录表 ......................................................... 42
6.4.2 导入查找表 ......................................................... 43
6.4.3 提示/名称表 ........................................................ 43
6.4.4 导入地址表 ......................................................... 43
6.5 .pdata节 ................................................................ 43
6.6 .reloc节(仅适用于映像文件) ............................................ 44
6.6.1 基址重定位块 ....................................................... 44
6.6.2 基址重定位类型 ..................................................... 45
6.7 .tls节 .................................................................. 45
6.7.1 TLS目录 ............................................................ 46
6.7.2 TLS回调函数 ........................................................ 47
6.8 加载配置结构(仅适用于映像文件) ........................................ 47
6.8.1 加载配置目录 ....................................................... 48
6.8.2 加载配置结构布局 ................................................... 48
6.9 .rsrc节 ................................................................. 49
6.9.1 资源目录表 ......................................................... 50
6.9.2 资源目录项 ......................................................... 50
6.9.3 资源目录字符串 ..................................................... 50
6.9.4 资源数据项 ......................................................... 50
6.10 .cormeta节(仅适用于目标文件) ......................................... 51
6.11 .sxdata节 .............................................................. 51
7 档案(库)文件格式 ........................................................... 51
7.1 档案文件签名 ............................................................ 52
7.2 档案文件成员头部 ........................................................ 52
7.3 第一个链接器成员 ........................................................ 53
7.4 第二个链接器成员 ........................................................ 54
7.5 长名称成员 .............................................................. 54
8 导入库格式 ................................................................... 54
8.1 导入头 .................................................................. 55
8.2 导入类型 ................................................................ 55
8.3 导入名称类型 ............................................................ 56
附录A:计算Authenticode® PE映像散列 ............................................ 57
A.1 什么是Authenticode PE映像散列? ......................................... 57
A.2 Authenticode PE映像散列保护了哪些内容? ................................. 57
参考信息 ....................................................................... 58
Microsoft 可移植可执行文件和通用目标文件格式文件规范 - 5
修订版 8.0 - 2006 年 5 月 16 日
© 2005 Microsoft Corporation。保留所有权利。
1 基本概念
本文档详细说明了 Microsoft® Windows®操作系统家族下的可执行文件(映像)
和目标文件的结构。这些文件分别被称为可移植可执行(PE)文件和通用目标文件格
式(COFF)文件。“可移植可执行”这个名称道出了这种格式与平台体系结构无关的
事实。
下表描述了贯穿于本规范中的一些概念:
名称 描述
属性证书 用来将可校验的声明与映像关联起来的证书。有许多不同的可校验声
明可以与文件关联,最常用的一种就是软件制造商用来指明映像的消
息摘要是什么的声明。消息摘要与校验和类似,但想要伪造它却极其
困难。因此对一个文件进行修改并保持它的消息摘要与原始文件一致
是非常困难的。正如制造商所做的那样,可以使用公钥或私钥加密机
制来校验声明。本文档除了描述允许将它们插入到映像文件中外还描
述了有关属性证书的详细信息。
日期/时间戳 由于不同目的而用于 PE 或 COFF 文件中好几个地方的戳。戳的格式与
C 运行时库时间函数所使用的戳的格式相同。
文件指针 某项内容在文件被链接器处理前(如果是目标文件文件)或者被加载
器处理前(如果是映像文件)在文件自身中的位置。换句话说,这是
一个位于存储在磁盘上的文件中的位置。
链接器 指的是随 Microsoft Visual Studio®提供的链接器。
映像文件 可执行文件:或者是.EXE 文件,或者是 DLL。映像文件可以被认为是
“内存映像”。术语“映像文件”经常用来代替“可执行文件”,因
为后者有时仅用来指代.EXE 文件。
目标文件 作为链接器的输入的文件。链接器生成一个映像文件,而这个映像文
件又作为加载器的输入。
保留,必须为 0 对一个域的这种描述表明,对于生成这个域的程序来说必须将这个域
设置为 0,对于使用这个域的程序来说必须忽略它的值。
RVA 相对虚拟地址。对于映像文件来说,它是某项内容被加载进内存后的
地址减去映像文件的基地址。某项内容的 RVA 几乎总是与它在磁盘上
的文件中的位置(文件指针)不同。
对于目标文件来说,RVA 并没有什么意义,因为内存位置尚未分配。
在这种情况下,RVA 是一个节(后面将要描述)中的地址,这个地址
在以后链接时要被重定位。为了简单起见,编译器应该将每个节的首
个 RVA 设置为 0。
节 节是 PE 或 COFF 文件中代码或数据的基本单元。例如一个目标文件中
所有代码可以被组合成单个节,或者(依赖于编译器的行为)每个函
数独占一个节。增加节的数目会增加文件开销,但是链接器在链接代
码时有更大的选择余地。节与 Intel 8086 体系结构中的段非常相似。
一个节中的所有原始数据必须被加载到连续的内存中。另外,映像文
件可能包含一些具有特殊用途的节,例如.tls 节或.reloc 节。
VA 虚拟地址。除了不减去映像文件的基地址外,与 RVA 相同。这个地址
之所以被叫做“虚拟地址”是因为 Windows 为每个进程创建一个私有
的虚拟地址空间,它独立于物理内存。无论出于何种目的,VA 都只应
该被认为是一个地址。VA 并不能像 RVA 那样能够预先得到,因为加载
器可能不把映像加载到它的首选位置上。