我目前正在编写一个从PE文件读取和写入的库。据我从规范中了解,可选标题通常不用于目标文件中。但是,它包含在PE32和PE32 +变体之间指定的字段。 PE是否允许PE32 +目标文件?
规范明确指出:
目标文件可能有一个可选的标题,但通常是这个标题 除了增加大小外,在目标文件中没有任何功能。
这对我来说似乎有些模棱两可。我倾向于将其视为"在目标文件中忽略可选标头并且仅使文件膨胀。"但是,它可以被读作"可以在目标文件中使用可选的头来将大小从32位增加到64位。"这意味着什么?
编辑:根据规范,值0x10b表示32位,值0x20b表示64位,值0x107表示ROM图像。 ROM映像总是32位吗?
答案 0 :(得分:1)
可选标题通常不用于目标文件
这是正确的
但是,它包含在PE32和PE32 +变体之间指定的字段。
也正确
PE是否允许PE32 +目标文件?
如果你的意思是你可以编译PE32 .obj并将其链接到PE32 + app,那么由于指针的大小不同而无论如何都是错误的。
我倾向于将其读作"在目标文件中忽略可选标题,只会使文件膨胀。"
这是正确的,我相信。
可选标头是图像的必需品(a.k.a.exe或dll)。
您可以通过在.obj或.exe文件上执行dumpbin /header
来自行收集所有这些信息。 Dumpbin随每个VC ++插件一起分发。例如,小文本项目
dumpbin.exe /headers PE.exe | findstr PE
将产生
Dump of file PE.exe
PE signature found
20B magic # (PE32+)
但在.obj文件上使用dumpbin
将不会产生任何内容,也没有可选标题。
ROM图像总是32位吗?
我怀疑是这样,但是,坦率地说,不知道,从未使用ROM图像
PS我认为,以上所述,对于使用Visual C ++编译的文件都是如此