.NET SDK中CorFlags.Exe的用法

news/2024/6/18 6:42:35
CorFlags .NET Framework 中一个用于查看.NET 可执行文件(PE) 的运行参数的 非常有用的工具,但是这个工具输出的结果不是特别直观,文档中并没有做出解释,本文将用实际例子解释CORFLAGS 的用法。
首先我们来看一个一般的情况,随便写一个A.CS 文件,用CSC 编译,并用CorFlags 察看
 
> csc a.cs
 
> corflags a.exe

Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 2.0.50727.42

Copyright (c) Microsoft Corporation. All rights reserved.

 
Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags : 1
ILONLY    : 1
32BIT     : 0
Signed    : 0
 
先解释一下每一项的意义:
项目
含义
对应
Version
Assembly所对应的Framework版本
IMAGE_COR20_HEADER.dwMajorRuntimeVersion
IMAGE_COR20_HEADER.dwMinorRuntimeVersion
CLR Header
CLR文件头的版本号
IMAGE_COR20_HEDER.MetaData
PE
PE文件的类型,包含PE32/PE32+
Magic=

IMAGE_NT_OPTIONAL_HDR32_MAGIC or

IMAGE_NT_OPTIONAL_HDR64_MAGIC
CorFlags
 
IMAGE_COR20_HEADER.Flags
CorFlags根据这个值来解析下面的选项
ILONLY
是否仅仅包含IL代码,0/1
COMIMAGE_FLAGS_ILONLY=0x1
32 BIT
是否仅以32BIT运行,0/1
COMIMAGE_FLAGS_32BITREQUIRED=0x2
Signed
是否经过签名

COMIMAGE_FLAGS_STRONGNAMESIGNED =0x8

 
PE 文件的类型需要解释一下,Windows PE 文件也就是可执行文件,存在两种类型(以前还有LE 等等,已淘汰):PE32 PE32+
PE32 是既可以在32 位下运行,也可以在64 位下运行,而PE32+ 只能在64 位下面运行。这里有一点需要澄清的是,普通的PE32 文件,如果里面代码有非托管代码,那么只能以32 位运行,不管是在32 Windows 还是64 位的Windows 。但是如果PE32 中仅含有托管代码,那么在64 Windows 下面则可以以64 位运行,因为CLR 可以将托管代码编译为64Bit 并运行,并且将其作为PE32+ 对待。
对应不同的平台的托管代码对应的CorFlags 的结果是不一样的。
平台
PE32/PE32+
IL Only?
32-Bit?
Any CPU
PE32
1
0
Pure x86
PE32
1
1
Pure x64
PE32+
1
0
Mixed x86
PE32
0
0
Mixed x64
PE32+
0
0
Pure 指纯托管程序,而Mixed 指混合。
Any CPU 必然只能是IL Only ,不能含有平台相关的非托管代码。而x86 AnyCPU 一样,都是PE32 文件,区别在于文件头上的32-Bit 的标志设置为1 ,表明其只能以32-Bit 运行。X64 则必然是PE32+ ,可以包含64 位非托管代码。
举一个例子:

> corflags C:/windows/microsoft.net/Framework/v2.0.50727/System.dll

 

Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 2.0.50727.42

Copyright (c) Microsoft Corporation. All rights reserved.

 
Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags : 9
ILONLY    : 1
32BIT     : 0
Signed    : 1
 

可以看到我机器上面32Bit.NET Framework 2.0 RTM版本里面的System.DLL是对应v2.0.50727版本的,属于PE32文件,是IL Only,不是32Bit的,因此这个是用AnyCPU来编译的。Corflags = 9 = COMIMAGE_FLAGS_ILONLY (1) + COMIMAGE_FLAGS_STRONGNAMESIGNED (8)

最后我们来看一个混合托管代码和非托管代码的例子:
 
>cl /clr a.cpp
 

Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.762

for Microsoft (R) .NET Framework version 2.00.50727.1416

Copyright (C) Microsoft Corporation. All rights reserved.

 
a.cpp

Microsoft (R) Incremental Linker Version 8.00.50727.762

Copyright (C) Microsoft Corporation. All rights reserved.

 
/out:a.exe
a.obj
 
> corflags a.exe
 

Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 2.0.50727.42

Copyright (c) Microsoft Corporation. All rights reserved.

 
Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags : 0
ILONLY    : 0
32BIT     : 0
Signed    : 0
 
 

可以看到用/CLR编译选项编译出来的C++/CLI的代码总是混合的,因此是 ILONLY=0,值得注意的是其32BIT=0,说明当ILONLY=0的时候,CLR不需要32BIT=0就可以判断出这个PE32文件必然要在32BIT下面运行。

CorFlags 除了可以输出这些信息之外,还可以一定程度上修改这些信息,用法比较简单,只要了解各个输出的含义就可以了。但是除非对相关信息的含义以及对目标程序非常了解,一般情况下最好不要修改这些信息,以避免出现无法预料的问题。
 
 

作者:      张羿(ATField)
Blog:      http://blog.csdn.net/atfield
                http://blogs.msdn.com/yizhang
转载请注明出处





http://www.niftyadmin.cn/n/3658063.html

相关文章

pytong之语音环境:edge-tts and edge-playback

系统平台:windows10 一、安装python3.x 二、安装edge-tts(文本转换为声音文件) 启动windows命令行(cmd),执行如下命令: pip install edge-tts 可能会因为网络的问题出现错误。用ping测试pypi.org是否通畅:ping pyp…

嵌入式系统学习笔记(8)——定时器计数器

定时器计数器的操作是通过对SFR的赋值实现的,定时器计数器的结果是通过对SFR的读取得到的。注意T0和T1并不是16位寄存器而是4个8位寄存器,单片机内部只有一个真正意义上的16位寄存器:DPTR。实际上定时器就是计数器,定时是通过对固…

.NET/Rotor源码研究1补遗 - 解决无法检测操作系统版本的错误

最近不少朋友反映在编译Rotor的时候出现无法检测操作系统版本的错误,具体现象为执行env.bat的时候报错:Could not get platform OS version 出现该错误的原因是env.bat会调用env.core.pl设置环境,而env.core.pl在检测操作系统版本的时候会使用…

.NET Main函数参数解释过程和特殊规则

最近正在准备一个小型开发工具的发布工作(具体的内容请容我先卖个关子,等发布之后我会详细给大家介绍的)。在使用时不经意中发现,使用.NET开发的命令行工具的对引号和反斜杠 /和一般命令行程序有着不同的解释规则。举例来说&#…

python 打印表格(如深度学习想打印混淆矩阵)

来源:prettytable confusion_matrix [[0 for j in range(4)] for i in range(4)]for i, j in zip(new_predicted, new_targets):confusion_matrix[i][j] 1tb pt.PrettyTable( ["predicted\\label", class1, class2, class3, class4])for i in range(4)…

SSD论文阅读笔记

SSD: Single Shot MultiBox Detector 论文arxiv链接:https://arxiv.org/pdf/1605.06409v2.pdf 亮点在于对多个size的featuremap产生各自scale的bbox: scale采取的是0-1的归一化scale,假设一共利用了m个大小不同的feature map,就…

Calling Convention的总结

因为经常需要和不同的Calling Convention打交道,前段时间整理了一下它们之间的区别,如下:清理堆栈参数压栈顺序命名规则 (MSVC)备注Cdecl调用者 (Caller)从右往左 FuncName因为是调用者清理Stack,因此允许变参 (如printf)Pascal被…

如何调试托管代码(managed code)和非托管代码(native code)混合的项目

在调试同时存在托管代码和非托管代码的程序的时候,需要特别注意选用适当的调试器的类型。因为看到类似的问题问得比较多,因此这里把做法写出来。在托管项目中在调试之前,需要打开对非托管代码调试的功能,这个选项在项目的属性的De…