Microsoft MVP성태의 닷넷 이야기
.NET Framework: 509. ELEMENT_TYPE_MODIFIER의 조합 [링크 복사], [링크+제목 복사],
조회: 20898
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 9개 있습니다.)
.NET Framework: 491. 닷넷 Generic 타입의 메타 데이터 토큰 값 알아내는 방법
; https://www.sysnet.pe.kr/2/0/1848

.NET Framework: 494. 값(struct) 형식의 제네릭(Generic) 타입이 박싱되는 경우의 메타데이터 토큰 값
; https://www.sysnet.pe.kr/2/0/1857

.NET Framework: 495. CorElementType의 요소 값 설명
; https://www.sysnet.pe.kr/2/0/1860

.NET Framework: 509. ELEMENT_TYPE_MODIFIER의 조합
; https://www.sysnet.pe.kr/2/0/2894

.NET Framework: 510. 제네릭(Generic) 인자에 대한 메타데이터 등록 확인
; https://www.sysnet.pe.kr/2/0/2907

.NET Framework: 844. C# - 박싱과 언박싱
; https://www.sysnet.pe.kr/2/0/11943

.NET Framework: 955.  .NET 메서드의 Signature 바이트 코드 분석
; https://www.sysnet.pe.kr/2/0/12379

.NET Framework: 1130. C# - ELEMENT_TYPE_INTERNAL 유형의 사용 예
; https://www.sysnet.pe.kr/2/0/12903

.NET Framework: 1174. C# - ELEMENT_TYPE_FNPTR 유형의 사용 예
; https://www.sysnet.pe.kr/2/0/12998




ELEMENT_TYPE_MODIFIER의 조합

ELEMENT_TYPE_MODIFIER 조합을 알다가도 모르겠군요. ^^;

지난 글에서는 SNINativeMethodWrapper.MarshalConsumerInfo 메서드의 signature가 "SIG: 00 02 01 12 20 20 45 0f 11 30" 값이었고, 그중 0x45가 ELEMENT_TYPE_MODIFIER | ELEMENT_TYPE_PINNED의 조합인 것을 알 수 있었습니다.

그런데, .NET 2.0에 정의된 SNINativeMethodWrapper.MarshalConsumerInfo는 signature가 다릅니다.

.method private hidebysig static void  MarshalConsumerInfo(class SNINativeMethodWrapper/ConsumerInfo consumerInfo,
                                                           valuetype SNI_CONSUMER_INFO* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) native_consumerInfo) cil managed
// SIG: 00 02 01 12 1C 20 39 0F 11 28

00 IMAGE_CEE_CS_CALLCONV_DEFAULT (static method)
02 # of arg(s)
01 ELEMENT_TYPE_VOID (return)
12 ELEMENT_TYPE_CLASS (1st arg type)
  1C (1byte - type token)
  20 ELEMENT_TYPE_CMOD_OPT
  39 ????
  0F ELEMENT_TYPE_PTR
11 ELEMENT_TYPE_VALUETYPE (2nd arg type)
  28 (1byte - type token) 

0x39라니...? ELEMENT_TYPE_MODIFIER의 값이 0x40이기 때문에 .NET 2.0 시절에는 ELEMENT_TYPE_MODIFIER로 분류되지도 않았다는 의미가 됩니다. 알수는 없지만, 억지로 조합해보면 다음과 같이 0x39를 만들 수 있습니다.

ELEMENT_TYPE_VALUETYPE = 0x11
ELEMENT_TYPE_PTR = 0x0f
                 == 20
ELEMENT_TYPE_U == 0x19

ELEMENT_TYPE_VALUETYPE | ELEMENT_TYPE_PTR | ELEMENT_TYPE_U

그런데, ".NET 4.0 (x64)"에서는 또 다른 조합이 나옵니다.

.method private hidebysig static void  MarshalConsumerInfo(class SNINativeMethodWrapper/ConsumerInfo consumerInfo,
                                                           valuetype Sni_Consumer_Info* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) native_consumerInfo) cil managed
SIG: 00 02 01 12 20 20 49 0F 11 38

0x49입니다. ELEMENT_TYPE_MODIFIER의 조합을 corhdr.h에서 보면,

ELEMENT_TYPE_MODIFIER       = 0x40,
ELEMENT_TYPE_SENTINEL       = 0x01 | ELEMENT_TYPE_MODIFIER, // sentinel for varargs
ELEMENT_TYPE_PINNED         = 0x05 | ELEMENT_TYPE_MODIFIER,
ELEMENT_TYPE_R4_HFA         = 0x06 | ELEMENT_TYPE_MODIFIER, // used only internally for R4 HFA types
ELEMENT_TYPE_R8_HFA         = 0x07 | ELEMENT_TYPE_MODIFIER, // used only internally for R8 HFA types

0x49는 도저히 나올 수 없는 조합입니다. 게다가, 이번에 공개된 .NET 4.6 Preview의 corhdr.h에 보면 ELEMENT_TYPE_R4_HFA, ELEMENT_TYPE_R8_HFA는 아예 삭제된 것을 볼 수 있습니다.

// C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\Include\um\corhdr.h

ELEMENT_TYPE_MODIFIER       = 0x40,
ELEMENT_TYPE_SENTINEL       = 0x01 | ELEMENT_TYPE_MODIFIER, // sentinel for varargs
ELEMENT_TYPE_PINNED         = 0x05 | ELEMENT_TYPE_MODIFIER,

도대체 어떻게 0x49가 나올 수 있을까 싶어 무작위로 검색해 보니, coreclr에 힌트가 나옵니다.

// https://github.com/dotnet/coreclr/blob/master/src/vm/compactlayoutwriter.h

178     enum CorElementTypeMDIL 
179     { 
180         ELEMENT_TYPE_NATIVE_VALUETYPE = 0x08 | ELEMENT_TYPE_MODIFIER 
181     }; 

위의 값을 기반으로 만들어 보면, 0x49를 이렇게 만들어 볼 수 있습니다.

0x49 == ELEMENT_TYPE_MODIFIER | 0x08 | 0x01
     == ELEMENT_TYPE_NATIVE_VALUETYPE | ELEMENT_TYPE_SENTINEL

00 IMAGE_CEE_CS_CALLCONV_DEFAULT (static method)
02 # of arg(s)
01 ELEMENT_TYPE_VOID (return)
12 ELEMENT_TYPE_CLASS (1st arg type)
  20 (1byte - type token)
  20 ELEMENT_TYPE_CMOD_OPT
  49 ELEMENT_TYPE_NATIVE_VALUETYPE | ELEMENT_TYPE_SENTINEL 
  0F ELEMENT_TYPE_PTR
11 ELEMENT_TYPE_VALUETYPE (2nd arg type)
  38 (1byte - type token)

물론, 위의 가정은 어디까지나 제 개인적인 가정입니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 10/24/2018]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13818정성태11/15/20245283Windows: 272. Windows 11 24H2 - sudo 추가
13817정성태11/14/20244929Linux: 106. eBPF / bpf2go - (BPF_MAP_TYPE_HASH) Map을 이용한 전역 변수 구현
13816정성태11/14/20245386닷넷: 2312. C#, C++ - Windows / Linux 환경의 Thread Name 설정파일 다운로드1
13815정성태11/13/20244809Linux: 105. eBPF - bpf2go에서 전역 변수 설정 방법
13814정성태11/13/20245283닷넷: 2311. C# - Windows / Linux 환경에서 Native Thread ID 가져오기파일 다운로드1
13813정성태11/12/20245047닷넷: 2310. .NET의 Rune 타입과 emoji 표현파일 다운로드1
13812정성태11/11/20245265오류 유형: 933. Active Directory - The forest functional level is not supported.
13811정성태11/11/20244848Linux: 104. Linux - COLUMNS 환경변수가 언제나 80으로 설정되는 환경
13810정성태11/10/20245389Linux: 103. eBPF (bpf2go) - Tracepoint를 이용한 트레이스 (BPF_PROG_TYPE_TRACEPOINT)
13809정성태11/10/20245261Windows: 271. 윈도우 서버 2025 마이그레이션
13808정성태11/9/20245257오류 유형: 932. Linux - 커널 업그레이드 후 "error: bad shim signature" 오류 발생
13807정성태11/9/20244994Linux: 102. Linux - 커널 이미지 파일 서명 (Ubuntu 환경)
13806정성태11/8/20244902Windows: 270. 어댑터 상세 정보(Network Connection Details) 창의 내용이 비어 있는 경우
13805정성태11/8/20244736오류 유형: 931. Active Directory의 adprep 또는 복제가 안 되는 경우
13804정성태11/7/20245366Linux: 101. eBPF 함수의 인자를 다루는 방법
13803정성태11/7/20245319닷넷: 2309. C# - .NET Core에서 바뀐 DateTime.Ticks의 정밀도
13802정성태11/6/20245704Windows: 269. GetSystemTimeAsFileTime과 GetSystemTimePreciseAsFileTime의 차이점파일 다운로드1
13801정성태11/5/20245492Linux: 100. eBPF의 2가지 방식 - libbcc와 libbpf(CO-RE)
13800정성태11/3/20246323닷넷: 2308. C# - ICU 라이브러리를 활용한 문자열의 대소문자 변환 [2]파일 다운로드1
13799정성태11/2/20244907개발 환경 구성: 732. 모바일 웹 브라우저에서 유니코드 문자가 표시되지 않는 경우
13798정성태11/2/20245521개발 환경 구성: 731. 유니코드 - 출력 예시 및 폰트 찾기
13797정성태11/1/20245508C/C++: 185. C++ - 문자열의 대소문자를 변환하는 transform + std::tolower/toupper 방식의 문제점파일 다운로드1
13796정성태10/31/20245382C/C++: 184. C++ - ICU dll을 이용하는 예제 코드 (Windows)파일 다운로드1
13795정성태10/31/20245178Windows: 268. Windows - 리눅스 환경처럼 공백으로 끝나는 프롬프트 만들기
13794정성태10/30/20245261닷넷: 2307. C# - 윈도우에서 한글(및 유니코드)을 포함한 콘솔 프로그램을 컴파일 및 실행하는 방법
13793정성태10/28/20245135C/C++: 183. C++ - 윈도우에서 한글(및 유니코드)을 포함한 콘솔 프로그램을 컴파일 및 실행하는 방법
1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...