(翻译)《Expert .NET 2.0 IL Assembler》 第四章 托管可执行体文件的结构 4.3 小结

     讨论过托管图像文件的结构以及IL编译器生成这些文件的方式,我将小结一下IL编译器创建一个托管PE文件的步骤。PE文件的创建表现为以下4个步骤:

 

步骤1:初始化

1.       初始化内部缓冲器

2.       在内存创建一个PE文件的空模板,包括MS-DOS头和stubPE签名、COFF头和PE头。

3.       输入地址表和CLR头被分配在.text区域中。

步骤2:源代码的语法分析

1.       元数据被收集在内部缓冲器中。

2.       方法体(IL代码和托管的异常处理表)被收集在内部缓冲器中。

3.       数据常量被发布到.sdata.tls区域。

步骤3:图像的生成

1.       为强签名在.text区域中分配空间。

2.       元数据被分析和重新整理。

3.       内部(到模块)的引用在IL代码中被处理。

4.       方法体被发布到.text区域。

5.       TLS目录表被发布到.sdata区域。

6.       调试目录被发布到.text区域。

7.       为元数据在.text区域中分配空间。

8.       为内嵌的托管资源在.text区域中分配空间。

9.       非托管的输出stub被发布到.text区域。

10.   VTFixup标被发布到.text区域。

11.   V表被发布到. sdata区域。

12.   非托管的输出表被发布到. sdata区域。

13.   元数据中最近的改变——映射字段的RVA被修复。

14.   元数据被发布在.text区域的预分配空间。

15.   托管的资源被发布在.text区域的预分配空间。

16.   运行时的开始stub被发布在.text区域

17.   非托管资源被从.res文件中读取到,并被发布在.rsrc区域

18.   必需的基本重定向被发布在.reloc区域

步骤4:完成

1.       图像文件被写为一个磁盘文件。

2.       强签名过程被应用到文件,通过调用强名称工具的方式。

 

     IL编译器允许你在图像文件的头中显示地设置某个值,依靠源代码指令和编译器命令行选项,正如表4-7所示。在本章所讨论的所有情形中,命令行选项优先于相应的源代码指令。

 

字段

指令

命令行选项

COFF

Machine

 

/ITANIUM, /X64(default is I386)

PE

Header type

 

/PE64(default is PE32)

PE

ImageBase

.imagebase <integer value>

/BASE=<integer value>

PE

SizeOfStackReserve

.stackreserve <integer value>

/STACK=<integer value>

PE

FileAlignment

.file alignment <integer value>

/ALIGNMENT=<integer value>

PE

Subsystem

.subsystem <integer value>

/SUBSYSTEM=<integer value>

CLR

Flags

.corflags <integer value>

/FLAGS=<integer value>

 

 

posted @ 2008-08-04 00:02  包建强  Views(443)  Comments(0Edit  收藏  举报