windows – MS加载器将PE文件的哪些部分映射到内存?

MS加载器将PE文件的哪些部分映射到内存中?

从PE文档中,我可以推断出PE可执行文件的典型格式(见下文).

我知道,通过检查,PE文件的所有内容(包括节头)都被完全映射到内存,就像存储在磁盘上一样.

接下来发生什么?

是否还映射了文件的其余部分(这里我指的是下图中的图像页面部分),这样整个文件在内存中就像存储在磁盘上一样,或者加载器比那更具选择性?

在文档中,我找到了以下代码段:

Another exception is that attribute certificate and debug information
must be placed at the very end of an image file, with the attribute
certificate table immediately preceding the debug section, because the
loader does not map these into memory. The rule about attribute
certificate and debug information does not apply to object files,
however.

这就是我能找到的关于装载机行为的全部内容;它只是说这两个部分必须放在文件的最后,因为它们不会进入内存.

但是,如果加载程序加载除了这两个部分之外的所有部分,并且我将RVA部分设置得足够高,那么部分数据实际上将在内存中复制(一次在映射文件中,一次用于RVA指定的位置)?

如果可能的话,链接到我可以进一步阅读有关MS Windows特定加载的地方.

《windows – MS加载器将PE文件的哪些部分映射到内存?》

最佳答案 查找此信息就像是一次打蛋,因为当COFF描述使用AT& T术语时,MS始终坚持使用自己的术语.

What parts of a PE file are mapped into memory by the MS loader?

这取决于.
节标题涵盖的所有节都映射到运行时地址空间.
但是,RVA为0的部分未映射,因此从未加载.

Each debug directory entry identifies the location and size of a block of debug information. The RVA specified may be 0 if the debug information is not covered by a section header (i.e., it resides in the image file and is not mapped into the run-time address space). If it is mapped, the RVA is its address.

内存包含磁盘上文件的精确副本.
请注意,可执行文件和DLL将映射到虚拟内存,而不是物理内存!
当您访问时,可执行部分会根据需要交换到RAM中.

如果没有访问某个部分,那么它显然不会被交换到物理RAM,但仍然会映射到虚拟内存中.

您可以阅读有关您可能想知道的所有内容about PE files (and more) on MSDN.

您的报价从documentation of the COFF file format解除.
关键部分是:

The rule on attribute certificate and debug information does not apply to object files.

来自:https://support.microsoft.com/en-us/kb/121460

Size: Size of the optional header, which is included for executable files but not object files. An object file should have a value of 0 here.

Ergo:可执行文件或不是目标文件,它们是图像文件.
因此,规则的例外不适用于它们.

点赞