性格是 "if it ain't broke, don't fix it",所以Windows 95 同时使用 PE 和 LE 两种格式。
这使得微软能够继续大规模地使用既有的 Windows 3.x 码。
虽然,预期一个全新的操作系统(如 Windows NT )有一个全新的可执行档格式是合理
的,但面对 object module (.OBJ 和 .LIB )又不尽然是这么回事。在 Visual C++ 32 位
元版 1.0 之前,所有的微软编译器都使用 Intel 的OMF (Object Module Format )规格,
但 Win32 编译器改采 COFF 格式的 OBJ 档。微软的一些竞争者(如 Borland 公司)
则坚持使用 Intel 的 OMF 格式。
一些微软阴谋论者可能会认为改变 OBJ 格式正是微软企图打击对手的证据。因为如果
要宣称能够「与微软兼容」于 OBJ 层次,其它厂商就必须把它们的所有 32 位工具
都转换为 COFF OBJ 和 LIB 格式。简单地说,OBJ 和 LIB 文件格式可视为是微软为
求某种利益而放弃既有标准的又一个例子。
WINNT.H 之中有一些 PE 格式的说明(虽然是极其模糊暧眛),它定义了一些COFF OBJ
用的结构。我将在稍后细部解释时使用这些 WINNT.H 中定义的字段名称。在 WINNT.H
之中有一段名为 "Image Format",从这里开始就是旧的 MZ-DOS 格式和 NE 格式的表
头,然后才是 PE 格式资料。WINNT.H 提供了 PE 文件所需要的数据结构的明确定义,
但只以少量文字说明那些结构、字段、旗标的意义。PE 格式的表头设计者 Michael J.
O'Leary 想必是一位「长名称,具自身说明意义」的忠实拥护者,以及一位「巢状结构和
电脑技术002pc网从老电脑的硬盘PE 与COFF OBJ 文件格式分析来看,对老电脑的硬盘PE 与COFF OBJ 文件格式的结果。
宏」的忠实拥护者。当面对 WINNT.H 写码时,你得面对像这样的句子:
pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;
除了读取 PE 格式的成份,你还需要把一些 PE 档倾印出来,看看呈现其中的观念。如
果你使用微软的 Win32 开发工具,Visual C++ 和 Win32 SDK 提供的 DUMPBIN 程序
可以解析 PE 档和 COFF OBJ/LIB 档,并以人类可读的形式输出。DUMPBIN 甚至有一
项极佳能力,可以反汇编文件中的 code section 。有鉴于微软曾经宣称你不可以反汇编其
产品,这就有趣了。它竟然供应一个工具,如此轻易地反汇编它的程序和 DLLs 。如果
反汇编 EXEs 和 OBJs 的能力没有用,为什么微软要把这项功能加到 DUMPBIN 之中
呢?似乎这又是一个 "Do as we say ,not as we do"(照着我们所说的做,不要照着我们所
做的做)的例子。
Borland 的使用者可以使用 TDUMP 观察 PE 档,但 TDUMP 并不了解 COFF OBJ
档,这不是个大问题,因为 Borland 根本就不产生 COFF OBJ 档。我自己也写了一个PE
档和 COFF OBJ/LIB 档的倾印工具,名为 PEDUMP ,并且我认为我提供了比DUMPBIN
更容易了解的输出格式。它没有反汇编能力,但其它功能都类似DUMPBIN ,并且还有
一些新功能使它身价高一些。PEDUMP 的原始码放在书附磁盘中,所以我不打算在书中
列出太多。取而代之的是,我要列出 PEDUMP 的一些输出结果,用来解释我所要说的
观念。
更多:老电脑的硬盘PE 与COFF OBJ 文件格式
https://www.002pc.com/diannaojichu/135.html
你可能感兴趣的文件格式,OBJ,COFF,PE
