【问题标题】:PE file sections alignmentPE 文件部分对齐
【发布时间】:2013-08-30 14:12:20
【问题描述】:

为什么 PE 文件中的节之间存在对齐?由于可以在 IMAGE_SECTION_HEADER.SizeOfRawData 中指定节的确切大小,我看不出在节之间使用这些“间隙”有任何意义。

在密钥 /filealign 的 MSDN 文档中写道:“有效值为 512、1024、2048、4096 和 8192”。编译器禁止 /filealign:0 有什么原因吗?

【问题讨论】:

  • 不知何故,我认为这是对慢得多的磁盘(如软盘)进行优化的产物。 512 是典型的扇区大小。查找和读取会将特定部分的第一个字节放在缓冲区的第一个字节。
  • 好吧,我实际上可以使用 /filealign:[number lower than 512] 编译我的源代码,但是当我尝试运行该 PE 文件时它总是以错误告终。
  • 我确实觉得这是一个 XY 问题。你真正想解决什么问题(或者你只是好奇)?
  • 我只是好奇,因为如果 Windows 加载器编写正确,我看不到使用文件对齐的任何意义。

标签: c++ visual-c++ assembly portable-executable


【解决方案1】:

以下来自 Matt Pietrek 的文章指出,在 RAM 中,一个部分必须在页面边界上对齐(在 x86 架构上为 4096 字节)。节对齐在 PE 文件中没有这个约束,因此可以更短。

要检查架构的页面大小,维基百科文章可能会有所帮助。 http://en.wikipedia.org/wiki/Page_(computer_memory)

Matt Pietrek 文章: http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

【讨论】:

    【解决方案2】:

    编译器禁止它,因为 windows(windows 中的 exe 加载器)禁止它。我的意思是,如果我将生成 exe,其部分对齐为 256 并且字段设置适当,windows 将不会运行它

    我不知道为什么 windows 会禁止它。我完全同意应该允许它变小(我想将其设置为 64 或 16)

    【讨论】:

      【解决方案3】:

      我怀疑对齐不能为零(或至少比 512 小得多的值 - 可能存在小于 4、8 或 16 的问题,因为数据对齐可以如果编译器生成的代码依赖于整个部分对齐太小,最终会出错。但我也希望引入这个特性来解决一些特定的用例,在大多数情况下,没有必要使用这个选项。可以说我自己没用过。

      但是,使用 4096 会很有意义,因为这意味着一个部分不会与另一个部分共享页面。

      我还怀疑 /filealign:0 表示“默认对齐”。

      我也会留意评论:

      大多数开发人员不需要使用此选项

      【讨论】:

      • 请注意,filealign 与内存布局无关,它与文件内布局有关。除了 512 之外,它很少有值。由于您概述的原因,内存布局的最小对齐为 4k。
      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 2012-12-19
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多