12

我正在处理一些相当低级的事情,并试图确定为什么我使用 CorFlags.exe 实用程序得到不同的输出。作为参考,输出如下:

$ corflags test2.exe
Microsoft (R) .NET Framework CorFlags 转换工具。版本 4.0.30319.17929
版权所有 (c) 微软公司。版权所有。

版本:v4.0.30319
CLR 标头:2.5
聚乙烯:PE32
CorFlags:0x1
仅 : 1
32 位请求:0
32BITPREF:0
签名:0

$ corflags test.exe
Microsoft (R) .NET Framework CorFlags 转换工具。版本 4.0.30319.17929
版权所有 (c) 微软公司。版权所有。

版本:v4.0.30319
CLR 标头:2.5
聚乙烯:PE32
CorFlags:0x20003
仅 : 1
32 位请求:0
32BITPREF : 1
签名:0

我试图弄清楚 CorFlags 值中未在 CorFlags 实用程序中公开的其他位的含义。这个参考在哪里?

4

2 回答 2

14

您实际上看到了来自 PE32 标头(PE 字段)和嵌入在程序集中的清单标头(其余部分)的混合信息。这在 Windows SDK 中都有描述,您需要版本 8 才能获得新的 32BITPREF 标志。使用 C:\Program Files (x86)\Windows Kits\8.0\Include\um\CorHdr.h,该文件中有很多描述声明的注释。

我将复制描述 IMAGE_COR20_HEADER.Flags 值的部分:

COMIMAGE_FLAGS_ILONLY               =0x00000001,
COMIMAGE_FLAGS_32BITREQUIRED        =0x00000002,
COMIMAGE_FLAGS_IL_LIBRARY           =0x00000004,
COMIMAGE_FLAGS_STRONGNAMESIGNED     =0x00000008,
COMIMAGE_FLAGS_NATIVE_ENTRYPOINT    =0x00000010,
COMIMAGE_FLAGS_TRACKDEBUGDATA       =0x00010000,
COMIMAGE_FLAGS_32BITPREFERRED       =0x00020000,

因此显示的 0x20003 值分解为 32BITPREFERRED (0x20000) 加上 32BITREQUIRED (0x00002) 加上 ILONLY (0x00001)

于 2012-12-07T16:57:34.313 回答
2

标志解释:

任何 CPU:PE = PE32 和 32BIT = 0

x86:PE = PE32 和 32BIT = 1

64 位:PE = PE32+ 和 32BIT = 0

于 2013-09-04T08:02:45.027 回答