(翻译)《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 同样的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架