PE文件部分对齐

时间:2013-08-30 14:12:21

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

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

在key / filealign的MSDN文档中,写有:“有效值为512,1024,2048,4096和8192”。是否有一些原因/ filealign:0被编译器禁止?

3 个答案:

答案 0 :(得分:2)

编译器禁止它,因为Windows(Windows中的exe加载器)禁止它。.我的意思是,如果我生成的exe的段对齐到256,并且字段设置正确,则Windows不会运行它

我不知道为什么Windows禁止使用它。我完全同意应该缩小它的尺寸(例如,我希望将其缩小为64或16)

答案 1 :(得分:1)

我怀疑是否有任何真正的技术原因为什么对齐不能为零(或至少比512小得多的值 - 可能存在问题,因为它小于4,8或16,因为数据对齐可能如果编译器生成的代码依赖于整个部分对齐得太小,那么最终会出错。但我也期望这个特性是为解决某些特定的用例而引入的,在大多数情况下,没有必要使用这个选项。我可以说我自己从未使用过它。

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

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

我也会留意评论:

  

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

答案 2 :(得分: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