최근 포토로그


clrver.exe와 Corflags.exe 에 대해서

이미 다 알고 계신 내용일 것 같습니다만, 공유차원에서 써봅니다.

CLRVER.exe

어떤 machine에 어떤 .NET Framework이 설치되어 있는지 알고 싶다면,

c:\>clrver

Versions installed on the machine:

v1.1.4322

v2.0.50727

v4.0.30319

 

이 Tool을 이용하면 수행 중인 Process가 어떤 Clr version을 사용하고 있는지도 알 수 있습니다.

c:\>clrver -all

4016    MOM.exe                 v2.0.50727

6248    DcaTray.exe             v2.0.50727

6624    EasyAssistLaunchpad.exe v2.0.50727

7312    CCC.exe                 v2.0.50727

5668    calibre.exe             v4.0.30319

8612    explorer.exe            v4.0.30319

특정 pid를 줘서 확인도 가능하죠

c:\>clrver 4016

v2.0.50727

 

Corflags.exe

Exe나 dll의 PE header를 조사해주는 Tool입니다. dumpbin으로 header를 볼 수도 있지만, Managed Assembly에 대한 정보만을 간략하게 보려면 이 Tool도 좋아 보이네요

D:\corflags WpfApplication2.exe

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

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

위 결과의 의미를 파악하기 위해서 Visual Studio 2010에서 .NET Framework 2.0/4.0각각에 대해서 AnyCPU/x86/x64/Itanium 으로 변경해 가면서 결과를 얻어 보았습니다.

 

AnyCPU

X86

X64

Itanium

2.0

Version   : v2.0.50727

CLR Header: 2.5

PE        : PE32

CorFlags  : 1

ILONLY    : 1

32BIT     : 0

Signed    : 0

Version   : v2.0.50727

CLR Header: 2.5

PE        : PE32

CorFlags  : 3

ILONLY    : 1

32BIT     : 1

Signed    : 0

Version   : v2.0.50727

CLR Header: 2.5

PE        : PE32+

CorFlags  : 1

ILONLY    : 1

32BIT     : 0

Signed    : 0

Version   : v2.0.50727

CLR Header: 2.5

PE        : PE32+

CorFlags  : 1

ILONLY    : 1

32BIT     : 0

Signed    : 0

4.0

Version   : v4.0.30319

CLR Header: 2.5

PE        : PE32

CorFlags  : 1

ILONLY    : 1

32BIT     : 0

Signed    : 0

Version   : v4.0.30319

CLR Header: 2.5

PE        : PE32

CorFlags  : 3

ILONLY    : 1

32BIT     : 1

Signed    : 0

Version   : v4.0.30319

CLR Header: 2.5

PE        : PE32+

CorFlags  : 1

ILONLY    : 1

32BIT     : 0

Signed    : 0

Version   : v4.0.30319

CLR Header: 2.5

PE        : PE32+

CorFlags  : 1

ILONLY    : 1

32BIT     : 0

Signed    : 0

위 결과를 보면 Framework의 버젼을 확인하거나(Version정보), 64bits용인지의 여부(PE: PE32+)를 확인할 수 있으며, X86 전용으로 컴파일 되었는지의 여부(32BIT : 1)를 각기 확인할 수는 있지만, 이 결과를 이용해서 어떤 CPU type으로 컴파일 되었는지는 확인하기 힘들다는 것을 알 수 있습니다. 이 경우 “dumpbin /headers”를 이용하면 확인할 수 있겠지요.

CorFlags.exe를 이용하면 CLR Header의 일부 내용을 변경할 수도 있습니다.

/ILONLY+ /ILONLY-     Sets/clears the ILONLY flag

/32BIT+  /32BIT-      Sets/clears the 32BIT flag

/UpgradeCLRHeader     Upgrade the CLR Header to version 2.5

/RevertCLRHeader      Revert the CLR Header to version 2.0

/Force                Force an assembly update even if the image is

                      strong name signed.

                      WARNING: Updating a strong name signed assembly

                       will require the assembly to be resigned before

                       it will execute properly.

/nologo               Prevents corflags from displaying logo

/? or /help           Display this usage message

그런데 이를 이용하면 조금 재미난 일을 해볼 수 있습니다.

예를들어 AnyCPU Type으로 컴파일된 assembly를 32bit전용으로 수행하도록 할 수 있습니다. AnyCPU Type의 경우 32bit OS에서는 32bit으로 64bits OS의 경우 64bits로 동작하는데, 32/64bits 구분없이 항상 32bits로 수행되는 assembly로 변경하는 것이지요.

AnyCPU Type으로 컴파일된 assembly의 이름을 clr4test.exe 라고 가정하면, 이를 64bits OS에서 수행했을때 항상 64bits로 수행됩니다. 그리고 clr4test.exe의 CorFlags의 수행결과는 다음과 같습니다.

Version   : v4.0.30319

CLR Header: 2.5

PE        : PE32

CorFlags  : 1

ILONLY    : 1

32BIT     : 0

Signed    : 0

이제 다음과 같이 수행하여 CLR Header를 변경합니다.

CorFlags /32BITS+ clr4test.exe

다시 CorFlags를 이용하여 CLR Header를 확인해보면 다음과 같이 변경되어 있음을 확인할 수 있습니다.

Version   : v4.0.30319

CLR Header: 2.5

PE        : PE32

CorFlags  : 3

ILONLY    : 1

32BIT     : 1

Signed    : 0

CorFlags의 값이 1à3으로 변경되고 32bit의 값이 0à1로 변경되었습니다. 이 결과를 상위의 표에서 확인해보면, 32bits 전용의 CLR Header와 동일함을 알 수 있습니다.

이제 64bits OS에서 clr4test.exe를 수행하면 32bits로 수행됩니다.

물론 이는 ILONLY assembly에서만 가능하겠지요.

감사합니다.


덧글

댓글 입력 영역


facebook 프로필 위젯

트위터 위젯