当前位置: 首页 > news >正文

深入了解CLR的加载过程

我们知道,.net编译器在生成托管代码时会将一些重要信息写入PE文件的header.text section(后边我会介绍这些写入程序集的重要信息是什么),本文介绍当我们双击一个托管代码写的exe程序时发生的事情。

以下说明所使用的工具是VS2005+sos.dll,示例程序代码如下:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespacehello
{
classProgram
{
staticvoidMain(string[] args)
{
Int32 a=1;
Int32 b=2;
b=a+b;
Console.WriteLine(b);

Console.ReadKey();
}
}
}

那么CLR是如何被加载的呢?

1、当你双击一个.exe文件时,Windows操作系统提供的PE Loader会将该exe文件载入内存;

(1)、首先明确一点,PE Loader问什么能加载exe文件呢?因为exe文件就是一种PE文件,PE(Portable Execute)文件是微软Windows操作系统上的程序文件
EXEDLLOCXSYS文件以及COM组件都是PE文件

(2)、有必要了解一下PE文件的结构:

图 1

1) Dos stub

100个左右的字节所组成,用来输出类似“这个程序不能在DOS下运行!”这样的错误信息;

2) PE Signature

DWORD类型,PE文件签名,用来表示这是个PE文件,用ASCII码表示;

3) File Header

包含PE文件最基本信息,通过dumpbin可以看到,如图2所示从这里可以看到:CPU类型为14c,是Intel I386I486或者I586section的数量为2;链接器产生这个文件的日期;COFF符号表的文件偏移量,为0COFF符号表的符号数目,为0Optional Header的大小。

图2

4) Optional Header

用来存储除了基本信息以外的其他重要信息,具体含义大家可以查阅PE文件格式的相关资料,我这里对一些关心的域根据图3进行一下说明:

-- entry point,指明这个PE文件的入口地址,是一个RVA(相对虚拟地址)

-- base of code,代码块起始地址的RVA,在内存中,代码块通常在PE首部之后,数据块之前;

-- base of data,数据块;

-- image basePE文件被链接器重定位后的内存地址,可以是链接器优化,节省载入时间和空间;

-- subsystem,可执行文件的用户界面使用的子系统类型。具体值的含义为:

1不需要子系统(比如设备驱动)

2Windows图形用户界面子系统下运行

3Windows字符子系统下运行(控制台程序)

5OS/2字符子系统下运行(仅对OS/2 1.x

7Posix字符子系统下运行

所以可以看到我们的程序是一个控制台程序。

--最后定义了一些数据目录,具体内容不再赘述。

图 3

5)section header

Section header可以有一个或多个,见图4、图5、图6。

-- name,表示这个section的名字,例如这个section的名字为.text

-- virtual address,保存section中数据被载入内存后的RVA

-- file pointer to raw data,从文件开头到section中数据的偏移量。

图 4

-- Section的原始数据

图 5

http://www.jsqmd.com/news/1132090/

相关文章:

  • 使用过正规新能源企业 GEO 优化服务团队,效果究竟咋样?
  • Meta、Google、Adobe隐形水印算法大翻车!误报率远高于宣称
  • Visual C++运行库终极解决方案:一键修复Windows系统兼容性问题
  • 前端day4
  • IR2104 半桥 BUCK 电路 PCB 布局:3 个关键布线规则解决开关尖峰与振荡
  • c#基础内容:泛型、线程、委托、流
  • 早上,邮递员送来的时候,我还在梦中。
  • 经典题目(2):最长公共子序列;最长公共子串
  • 真的领到了这张8元现金券
  • 2026 内容创作类 AI 赛道全新红利(分短视频、图文绘画、AI 音乐、通用自动化四大板块,全部是今年落地可变现风口)
  • OpenCode × DeepSeek 配置方案迭代记:砍砍补补,越来越好用
  • Ubuntu系统向日葵远程桌面配置指南
  • iNeuOS工业互联网操作系统
  • 大部分管理信息系统(MIS)都少不了员工
  • 昆仑芯的“第三条路”
  • Week7:卷积神经网络、深度网络原理与循环神经网络专题
  • Linux find 命令性能深度解析:对比 locate 与 fd 的 3 大场景实测
  • Unity AssetBundle 加密方案对比:3种主流方法性能开销与安全性实测
  • ChatModel 构建 LLM 驱动的 Java 应用
  • Edge/Chrome 开发者工具获取京东 Cookie:3 步定位 pt_key/pt_pin 的完整流程
  • 折腾了两周Codex,整理了一份从安装到实战的避坑指南
  • Agent Memory最新综述:长上下文和RAG之后,还缺什么?
  • 张家界口碑黄金铂金回收白银回收实体老店
  • C语言学习笔记20260705-基于栈的排列重排——求字典序最大的合法出栈序列
  • DB2 11.5 Windows 10 安装避坑 3 要点:家庭版系统安全性与驱动下载
  • 机器人产业演进逻辑与商业化落地全景攻略
  • 从演示到生产:AI 编程工具链在大模型应用落地中的工程化实践
  • 知识加工模块与博客工厂模块的状态重新定义
  • 一年之后,重新理解 AI 编程
  • 2026北京活动策划公司口碑榜与政企会务优选指南