欢迎来到天天文库
浏览记录
ID:8801044
大小:269.50 KB
页数:25页
时间:2018-04-08
《peeringinsidethepe中文版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、翻译:JasonSun(木水鱼)2004年5月10日[译注:仅供大家学习使用,您在复制或使用此文档时请保留这个文件头]PeeringInsidethePE:ATouroftheWin32PortableExecutableFileFormatMattPietrek1994年3月MattPietrek是WindowsInternals(Addison-Wesley,1993)的作者。他就职于Nu-Mega技术有限公司,可通过CompuServe:71774,362联系到他。这篇文章出自1994年3月发行的Micro
2、soft系统期刊。版权所有﹫1994MillerFreeman,Inc.保留所有权利。未经MillerFreeman同意,这篇文章的任何部分不得以任何形式被复制(除了在评论文章里以摘要引用)。一个操作系统的可执行文件的格式在很多方面是这个操作系统的一面镜子。虽然学习一个可执行文件格式不是大多数程序员的首要任务,但是从中你可学到大量的知识。这篇文章中,我将给出Microsoft为他们的基于Win32的系统所设计的PE文件格式的详细说明。可以预知在未来,PE文件格式在Microsoft的所有操作系统包括Windows
3、2000中都将扮演着很重要的角色。如果你在使用Win32s或WinNT,那么你已经在使用PE文件了。甚至你只是在Windows3.1下用VisualC++编程,你也已在使用PE文件了(VisualC++的32位DOS扩展组件使用此格式)。简而言之,PE格式已得到普遍应用并且在不短的将来也不会取消。现在是时间找出这种新的可执行文件格式为操作系统所带来的影响了。我不会让你盯住无穷无尽的16进制Dumps和详细讨论页面中每个单独位的重要性。代替的,我将介绍PE文件格式中内含的概念并且把它们和你每天都会遇到的东西联系起来
4、。例如,线程局部变量的概念,比如declspec(thread)inti;它使我快要发疯了,直到我明白它是怎样在可执行文件里优雅而简单的实现的。既然你们大多数都有使用16位Windows的背景,我将把Win32PE文件格式的结构和与其等价的16位的NE文件格式联系起来。除了一个不同的可执行文件格式之外,Microsoft还引入了一个由它的编译器和汇编器生成的新的目标模块格式。这个新的OBJ文件格式和PE格式有许多相同的东西。为了找到这个新的OBJ文件格式的文档我做了许多徒劳的搜索。所以我以自己的理解来解释它,并且
5、除了PE格式之外我会在这里描述它其中的一部分。大家都知道WindowsNT继承了VAX®VMS®和UNIX®。许多WindowsNT的创建者在进入Microsoft之前都在那些平台上进行设计和编码。当开始设计WindowsNT时,很自然的他们设法使用以前编写的并经过测试的工具以最小化项目启动时间。这些工具生成的并且与之一起工作的可执行文件和目标模块格式被叫做COFF(CommonObjectFileFormat的首字母缩写)。COFF格式自身是一个好的起点,但需要被扩展以满足一个现代操作系统如WindowsNT或
6、者Windows95的所有需要。这个扩展的结果就是PE格式。它被称为“可移植”是因为WindowsNT在不同的平台(x86,MIPS®,Alpha,等等)上的所有实现都使用这个相同的可执行格式。当然,也有不同的地方比如CPU指令的二进制编码。重要的是操作系统加载器和程序设计工具不必为每种CPU完全重写。Microsoft抛弃了现存的32位工具和文件格式的事实证明了他们想让WindowsNT升级并且运行的更快的决心。为16位Windows编写的虚拟设备驱动使用一个不同的32位文件布局-LE格式-它在WindowsN
7、T出现很早以前就存在了。比那更重要的是OBJ格式的改变。在WindowsNT的C编译器以前,所有的Microsoft编译器使用IntelOMF(ObjectModuleFormat)规范。以前提到,Microsoft的Win32编译器生成COFF格式的OBJ文件。一些Microsoft的竞争者例如Borland和Symantec选择放弃COFF格式的OBJs而坚持使用IntelOMF格式。结果导致生成OBJs或LIBs的公司为了使用不同的编译器就必须回去为不同的编译器发布他们产品的不同版本(如果他们还没有那么做)
8、。PE格式在WINNT.H头文件中被文档化了。大约在WINNT.H文件的中间一个标题为“ImageFormat”的区域。这块区域的开头是我们熟悉的老的MS-DOSMZ格式和NE格式文件头接下来才是更新的PE格式的信息。WINNT.H提供PE文件用到的原始数据结构的定义,但只包含了很少有用的以助于理解这些结构和标志的意思的注释。当使用WINNT.H编码时,类似这样的表达式很
此文档下载收益归作者所有