(翻译)《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>

  

 

Commit翻译——提交?

Preferred——首选的

take precedence of——优先于

make nontrivial use of = 很需要使用

as sush 同样的

posted @ 2008-08-27 23:51  包建强  Views(816)  Comments(1Edit  收藏  举报