메타데이터 및 PE 파일 구조
업데이트: 2007년 11월
메타데이터는 .NET Framework PE 파일의 한 섹션에 저장되고 MSIL은 PE 파일의 다른 섹션에 저장됩니다. PE 파일의 메타데이터 부분에는 테이블과 힙 데이터 구조가 있으며 MSIL 부분에는 MSIL 및 PE 파일의 메타데이터 부분을 참조하는 메타데이터 토큰이 있습니다. 예를 들면 MSIL 디스어셈블러(Ildasm.exe)를 사용하여 코드의 MSIL을 보거나 런타임 디버거(Cordbg.exe)를 사용하여 메모리 덤프를 수행하는 경우 메타데이터 토큰을 발견할 수 있습니다.
메타데이터 테이블 및 힙
각 메타데이터 테이블은 프로그램 요소에 대한 정보를 보유합니다. 예를 들어 한 메타데이터 테이블은 코드의 클래스를 나타내고 다른 테이블은 필드를 나타내는 식입니다. 코드에 클래스가 10개 있는 경우 클래스 테이블은 각 클래스마다 행 하나씩, 모두 10개의 행을 가집니다. 메타데이터 테이블은 다른 테이블과 힙을 참조합니다. 예를 들어 클래스의 메타데이터 테이블은 메서드의 테이블을 참조합니다.
또한 메타데이터는 문자열, blob, 사용자 문자열 및 GUID라고 하는 네 가지 힙 구조에 정보를 저장합니다. 형식과 멤버의 이름을 지정하는 데 사용되는 모든 문자열은 문자열 힙에 저장됩니다. 예를 들어 메서드 테이블은 특정 메서드의 이름을 직접 저장하지 않지만 문자열 힙에 저장된 메서드의 이름을 가리킵니다.
메타데이터 토큰
메타데이터 테이블의 각 행은 메타데이터 토큰에 의해 PE 파일의 MSIL 부분에서 고유하게 식별됩니다. 메타데이터 토큰은 MSIL에 유지되고 특정 메타데이터 테이블을 참조하는 포인터와 개념적으로 비슷합니다.
메타데이터 토큰은 4바이트 숫자입니다. 최상위 바이트는 특정 토큰이 참조하는 메타데이터 테이블(메서드, 형식 등)을 나타내고 나머지 3바이트는 메타데이터 테이블의 행 중에서 현재 나타내고 있는 프로그래밍 요소에 해당하는 행을 지정합니다. C#에서 메서드를 정의하여 PE 파일로 컴파일하면 PE 파일의 MSIL 부분에 다음과 같은 메타데이터 토큰이 존재합니다.
0x06000004
최상위 바이트(0x06)는 이 토큰이 MethodDef 토큰임을 나타내고, 하위 3바이트(000004)는 공용 언어 런타임이 MethodDef 테이블의 넷째 행에서 이 메서드 정의를 기술하는 정보를 찾도록 지시합니다.
PE 파일 내의 메타데이터
프로그램이 공용 언어 런타임으로 컴파일되면 해당 프로그램은 세 부분으로 구성되는 PE 파일로 변환됩니다. 다음 표에서는 각 부분의 내용을 설명합니다.
PE 섹션 |
PE 섹션의 내용 |
---|---|
PE 헤더 |
PE 파일의 주 섹션 인덱스 및 진입점 주소를 저장합니다. 런타임은 이 정보를 사용하여 파일을 PE 파일로 식별하고 프로그램을 메모리로 로드하는 경우 실행 시작 위치를 결정합니다. |
MSIL 명령 |
코드를 구성하는 MSIL 명령. 대부분의 MSIL 명령은 메타데이터 토큰을 동반합니다. |
메타데이터 |
메타데이터 테이블과 힙. 런타임은 이 섹션을 사용하여 코드의 모든 형식과 멤버에 대한 정보를 기록합니다. 또한 사용자 지정 특성과 보안 정보도 포함되어 있습니다. |