x64可移植可执行部分顺序

时间:2015-03-31 22:38:21

标签: 64-bit portable-executable

3个基本部分:可移植可执行文件(.exe)文件格式的.data(资源),.rdata(导入)和.text(指令)是否可以按任何顺序排列,只要地址为“地址”即可入口点'字段指向.text部分?似乎首先将指令(.text)放在首位是一个很大的痛苦,因为你必须计算导入和资源部分才能实际写出指令部分......

这就是我要做的事:https://i.imgur.com/LIImg.jpg

运行时性能怎么样?

2 个答案:

答案 0 :(得分:2)

pecoff.doc document(指向Word2003文件的直接链接)详细描述了PE文件的格式。您要问的内容将在第4章中介绍,它将讨论章节表。最相关的细节:

  

Section Section中的条目数由文件头中的NumberOfSections字段给出。节表中的条目从一开始编号。代码和数据存储器部分条目按链接器选择的顺序。

所以不,这不是一成不变的,部分可以按任何顺序出现。

  

看起来首先是指令(.text)是一个很大的痛苦

正如pecoff语言所暗示的那样,它是一个链接器实现细节。对于微软的链接器,可能是大多数其他链接器,它实际上并不是一个很大的痛苦。它的首要任务是生成可执行代码,并且往往会有很多可执行代码。并非所有代码都被使用,只需要解决依赖关系所需的代码。这是一个非常的常见场景,静态C运行时库将是一个典型的例子。您的程序不会调用所有可能的运行时函数,链接器仅链接所需的内容。

重新定位和进口等细节是一个小细节,其中几乎没有。因此,首先生成代码并跟踪所需的重定位和导入以匹配内存中的代码,以便稍后将它们写入PE文件,效率更高。

你的假设是'#34;更好"反过来说不准确。无论如何,到链接器。

答案 1 :(得分:1)

正如Hans已经回答的那样,链接器可以按任何顺序自由排列部分,如最佳选择。唯一的例外是名为.text$A.text$B的部分,其中部分必须按照$后面的后缀按字典顺序排序。

链接器编写部分的顺序对于生成最终二进制文件的容易程度也没有多大意义。通常,二进制文件在计算部分时不是顺序写入的;相反,节内容在缓冲区中生成,代码和数据之间的引用保持符号(以可重定位的格式),直到节被写入最终的可执行文件。

与性能相关的问题部分更多地与Windows中图像加载器的工作方式有关,而不是链接器。因为加载器不需要任何特定顺序的部分,所以在将部分解包到图像文件的存储器视图中时不存在额外的开销(例如,与排序有关)。在任何情况下都可以进行导入和导出表之间的重定位和匹配,并且工作量由其他因素决定。因此,链接器决定的顺序本身不会影响加载时间。

对于普通的Windows API或原生二进制文件(不是CLR),部分名称也不重要 - 只有每个部分的characteristics,它们决定例如:图像中内存映射页面的访问权限(无论它们是只读,可写,可执行等)。例如,导入表可以放在名为.idata而不是.rdata的部分中,或者该部分可以命名为完全不同的部分。