x64 可移植可执行节顺序

问题描述 投票:0回答:3

可移植可执行 (.exe) 文件格式中的 3 个基本部分:.data(资源)、.rdata(导入)和 .text(指令)可以任意顺序,只要“入口点地址”字段一致即可指向 .text 部分?似乎将说明(.text)放在第一位是一件很痛苦的事情,因为您必须计算导入和资源部分才能实际编写说明部分...

这就是我要的:https://i.stack.imgur.com/wKwgd.jpg

运行时性能怎么样?

64-bit portable-executable
3个回答
3
投票

正如 Hans 已经回答的那样,链接器可以自由地以任何顺序排列部分,只要认为最合适。唯一的例外是像

.text$A
.text$B
这样的命名部分,其中 must 根据
$
后面的后缀按字典顺序排序。

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

与性能相关的问题部分更多地与 Windows 中的图像加载器的工作方式有关,而不是与链接器有关。由于加载程序不需要按任何特定顺序排列各节,因此在将各节解压到图像文件的内存视图中时,没有额外的开销(例如与排序相关)。无论如何都要进行导入导出表的重定位和匹配,工作量由其他因素决定。因此,链接器决定的顺序本身并不影响加载时间。

对于普通的 Windows API 或 Native 二进制文件(不是 CLR),节名称也不重要——只有每个节的 characteristics,它决定了例如映像中内存映射页的访问权限(无论是只读、可写、可执行等)。例如,导入表可能放置在名为

.idata
而不是
.rdata
的部分中,或者该部分可能被命名为完全不同的名称。


3
投票

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

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

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

将说明(.text)放在第一位似乎是一个很大的痛苦

正如pecoff语言所暗示的,它是一个链接器实现细节。对于 Microsoft 的链接器以及可能大多数其他链接器来说,这实际上并不是一个很大的痛苦。它的首要任务是生成可执行代码,而且往往会有很多代码。并且并未使用所有代码,仅使用解决依赖关系所需的代码。这是一个非常常见的场景,静态 C 运行时库就是一个典型的例子。您的程序不会调用所有可能的运行时函数,链接器仅链接所需的内容。 诸如搬迁和导入之类的细节只是一个小细节,只是数量没有那么多。因此,

首先

生成代码并跟踪所需的重定位和导入以匹配内存中的代码,然后将它们写入 PE 文件会更有效。 您认为反过来“更好”的假设是不准确的。无论如何,对于链接器。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.