生活的天平本不平衡,只有通过努力改变其偏向。

深入剖析Win32可移植可执行文件格式(PDF)

2008-04-24

很久以前,我开始为Microsoft Systems Journal(现在的MSDN® Magazine)写文章,其中有一篇名为“探索PE文件内幕——Win32可移植可执行文件格式之旅”的文章很受欢迎,大大超出了我的意料。直到现在, 我还听说有人(甚至在Microsoft)仍然在使用那篇文章,它依旧被收录在MSDN Library中。不幸的是,文章的最大问题是它们是静止的。但是Win32®的世界在这些年已经发生了很大的变化,因此那篇文章已经严重过时了。我要从 本月开始用两部分系列的文章来补救这种情况。
你可能想知道为什么要关注可执行文件的格式。答案永远是:操作系统的可执行文件格式和数据结构展现了操作系统内部许多信息。通过理解EXE和DLL的内部情况,你会发现你已经变成你周围一个更优秀的程序员。
当然,通过阅读Microsoft的PECOFF规范你可以获得许多我将要告诉你的内容。但是与大多数规范一样,它更注重完整性而不是可读性。在本文中, 我把精力集中于解释整个故事中最重要的部分,同时填补那些并不适合出现在官方规范中的怎么样(How)以及为什么(Why)的问题。另外,在本文中我还会 讲到一些非常有用的内容,它们并未出现在任何Microsoft官方文档中。
让我先举一些例子来说明自从1994年我写那篇文章以来有关可执行文件方面都发生了哪些变化。由于16位Windows®已经成为历史,因此没有必要再与 Win16的NE(New Executable)格式相比较了。另一个已经脱离人们视野的是Win32s®。在Windows 3.1上运行Win32程序非常不稳定是最令人讨厌的事。
回到当时,Windows 95(当时代号为“Chicago”)甚至还未发行。Windows NT®还是3.5版。Microsoft链接器还未进行非常有效地优化。值得一提的是当时已经在MIPS和DEC Alpha上实现了Windows NT。
自从那篇文章以来都出现了什么新内容呢?64位Windows引进了它自己的变种的PE文件格式。Windows CE添加了许多的新型处理器。诸如DLL延迟加载、节合并以及绑定之类的优化已经铺天盖地。有许多新东西要加入到这个故事中。
让我们不要忘了Microsoft® .NET。该把它放在什么位置呢?对于操作系统来说,.NET可执行文件只不过是普通的Win32可执行文件。但是.NET运行时能够识别出这些可执行文 件中的数据并把它作为元数据(metadata)和中间语言(Intermediate Language,IL),它们对.NET来说非常重要。在本文中,我要敲开.NET元数据结构的大门,但把对它全部光彩的彻底挖掘留给下一篇文章。
如果Win32世界中的所有这些加加减减还不足以成为我重新写那篇文章的理由的话,那么我只有列出原来那篇文章中的一些令我害怕的错误了。例如我对线程局部存储(TLS)支持情况的描述是错误的。同样,通篇我对日期/时间戳这个DWORD的描述仅在太平洋时区才是精确的.

  Inside.rar (415.6 KiB, 1,043 hits)

作者:lonkil | 分类目录:编程开发 | 标签:

评论已关闭。