首页 文章

x64可移植可执行部分顺序

提问于
浏览
1

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

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

运行时性能怎么样?

2 回答

  • 1

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

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

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

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

  • 2

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

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

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

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

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

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

    你认为它反过来“更好”的假设并不准确 . 无论如何,到链接器 .

相关问题