(翻译)《Expert .NET 2.0 IL Assembler》 第四章 托管可执行体文件的结构 4.3 小结
小结
讨论过托管映像文件的结构以及IL编译器生成这些文件的方式,我将小结一下IL编译器创建一个托管PE文件的步骤。PE文件的创建表现为以下4个步骤:
步骤1:初始化
1. 初始化内部缓冲器
2. 在内存创建一个PE文件的空模板,包括MS-DOS头和stub、PE签名、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 同样的