我能提供每个 CorFlags 值的含义参考吗?在哪里可以找到这些参考资料?

13

我在处理一些比较底层的东西,并尝试确定为什么使用CorFlags.exe工具会得到不同的输出。参考输出如下:

$ corflags test2.exe
Microsoft (R) .NET Framework CorFlags转换工具。 版本 4.0.30319.17929
版权所有 (c) Microsoft Corporation。 保留所有权利。
版本:v4.0.30319 CLR头文件:2.5 PE:PE32 CorFlags:0x1 ILONLY:1 32BITREQ:0 32BITPREF:0 已签名:0 $ corflags test.exe Microsoft (R) .NET Framework CorFlags转换工具。 版本 4.0.30319.17929 版权所有 (c) Microsoft Corporation。 保留所有权利。
版本:v4.0.30319 CLR头文件:2.5 PE:PE32 CorFlags:0x20003 ILONLY:1 32BITREQ:0 32BITPREF:1 已签名:0

我试图弄清楚在CorFlags值中未公开的其他位是什么意思。有哪里提供此类信息的参考资料呢?


出于好奇,为什么CorFlags很重要? - Erik Philips
1
@ErikPhilips 嗯,这是一些东西检测 exe/dll 是否为混合模式或仅限 IL 程序集的方式。 - Earlz
两个经典问题分别是 *如何确定 .NET 程序集是为 x86 还是 x64 构建的?*(包含有关 CorFlags、其输出和解释的信息)和 *解释 CorFlags 标志*(已更新以包括新标志 32BITREQ32BITPREF)。 - Peter Mortensen
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)。


哇,太好了,这回答了我的问题。但是,为什么这个信息不在其他文档中呢?它只被放在一些晦涩的头文件里! - Earlz
你为什么认为这是晦涩难懂的?它在任何VS安装中都是显而易见的,并且已经存在多年了。再仔细看看,SDK头文件是信息的宝库。 - Hans Passant

3

标志的解释:

Any CPU:PE = PE32,而 32BIT = 0

x86:PE = PE32,而 32BIT = 1

64 位:PE = PE32+,而 32BIT = 0


他的输出中没有32位。我想你是指32BITREQ。 - Wes
1
@Wes:你说得对。这个答案是针对早期版本的CorFlags。它取决于CorFlags的版本 - "32BIT"被"32BITREQ"和"32BITPREF"所取代。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接