.net中PE文件的结构:初步认识IL代码
(3)元数据结构
前面曾经提到过,元数据其实就是一个二进制的数据块,所以元数据的内部,就是一个个的named stream。这些stream又分为两种类型,除了前面提到过的Table,还有一类是以Heap的形式体现(见上文代码段中的注释)。下图是书中给出的一个完整的元数据结构图:

上面以#开头的就是元数据中可能出现的6个命名流,他们的用途分别是
#Strings:用来存储元数据项的名字,如类名、方法名等 //Heap Stream
#Blob: 用来存储一些内部的对象实例,如默认值什么的 //Heap Stream
#US: 用户定义的字符串常量 //Heap Stream
#GUID: 包含各种全局统一标志符 //Heap Stream
#~: “优化的”、“压缩的”元数据,里面的元数据表以优化方式存储(我们在父子关系中刚刚提到过的) //Table Stream
#-: 非优化的元数据(和#~不能共存) //Table Stream
其中(#~或#-)、#GUID、#Strings是必不可少的。
另外,元数据既然被存储在很多表里,那么CLR是如何定位一个元数据项的呢(怎么样定位到某个表的某一行)?这里,它使用了一种叫做Token的机制,每个token占4个字节,其中高位字节表示表序号,剩余三个字节表示表内的行序号。具体这些序号被称为RID(record index),其中行序号从1开始,表序号从0开始。
0
相关文章