.NET框架源码解读之SSCLI编译过程简介
前文演示了编译SSCLI最简便的方法(在Windows下):
- 在“Visual Studio 2005 Command Prompt”下,进入SSCLI的根目录;
- 运行 env.bat 脚本准备环境;
- 运行 buildall.cmd 脚本开始编译过程。
env.bat设置了当前SSCLI的运行环境,命令的语法是:`env [option]`,其中[option]可以是debug、checked和free,各个环境选项说明如下表:
选项 |
说明 |
debug |
关闭代码优化设置,启用调试用代码(一般是通过条件编译开关),生成调试用符号文件。 |
checked |
打开代码优化设置,启动调试用代码,生成符号文件。 |
free |
打开代码优化设置,关闭调试用代码,生成符号文件。 |
出于解读代码的需要,一般都会选择debug选项。
设定好运行环境后,buildall.cmd的编译过程可以分为下面几大步骤:
- 编译基本的引导工具集:平台抽象层(PAL)和非托管程序(unmanaged)编译工具;
- 编译辅助的引导工具集:剩余的工具集和相关基础架构;
- 编译CLR内核、基本类库,C#编译器和其他支持工具;
- 编译其它.NET类库和支持工具
- 编译其它托管程序的编译器,如JS编译器。
其实.NET天生就是跨平台的,SSCLI 2.0除了支持Windows平台,还支持FreeBSD和Mac OS X,源码可以在FreeBSD 4.8和Mac OS X 10.2下编译通过,通过修改一些源码,还可以在Linux平台下编译和使用,实际上SSCLI 1.1通过一些修改可以在Red Hat 8.0下编译通过。
为了在后文说明方便,这里用SSCLI内置的几个环境变量来指代将会提到的文件夹路径:
- %ROTOR_DIR%: SSCLI的根目录,如Windows平台下一般是“c:\sscli”,在编译过程中,编译系统会自行设置此环境变量。
- %_NTTREE%:整个SSCLI编译输出结果的保存路径,其值一般是:“%ROTOR_DIR%\binaries.x86*.rotor\”,*号根据 env.bat 的选项赋值,如env.bat的选项是“debug”,那么它的值就是“%ROTOR_DIR%\binaries.x86dbg.rotor\”。
基本引导工具集
SSCLI的源码由C++、C#这些非托管和托管编程语言组成,而且SSCLI是跨平台的,因此在编译过程中编译系统会用操作系统上安装的C++编译器编译好编译SSCLI剩余源码的工具集。在这一步编译过程中,基本引导工具集包括下面这些组件:
- 平台抽象层(PAL):PAL是系统中其它所有组件的依赖项,因此必须先编译它:
源码位置(Windows平台):%ROTOR_DIR%\pal\win32
源码位置(Unix平台):%ROTOR_DIR%\pal\unix
输出路径:%_NTTREE%\rotor_pal.dll
- Nmake工具集:nmake是Windows SDK系统下的编译工具,类似unix下的make。SSCLI自带了nmake的源码,如果是在Unix或Linux系统下编译,会编译此工具;或者在Windows平台下,就用SDK系统下自带的nmake工具了:
源码位置:%ROTOR_DIR%\tools\nmake
输出路径:%_NTTREE%\nmake.exe
- 编译结果的处理工具:
源码位置:%ROTOR_DIR%\tools\binplace
输出路径:%_NTTREE%\binplace.exe
- 编译系统其它组件的编译工具集:
源码位置:%ROTOR_DIR%\tools\build
输出路径:%_NTTREE%\build.exe
辅助引导工具集
辅助引导工具集与前面基本引导工具集的区别是,辅助引导工具集用的是SSCLI编译系统自带的build.exe编译的,源文件列表等编译规则是保存在sources.lst文件里的,而基本引导工具集是用make命令编译,而且源文件列表等编译规则是保存在makefile文件夹里的。
辅助引导工具集保护下列这些组件:
- 资源编译器
源码位置:%ROTOR_DIR%\tools\resourcecompiler
输出路径:%_NTTREE%\resourcecompiler.exe
- PAL运行时(PAL RT):PAL RT包含了SSCLI和其一些辅助工具都用到的跨平台的功能。
源码位置:%ROTOR_DIR%\palrt\src
输出路径:%_NTTREE%\rotor_palrt.dll
编译CLR内核、基本类库,C#编译器和其他支持工具
引导工具集编译完成后,就可以开始编译整个CLR、.NET基本类库、C#编译器等工具了,各工具的源码位置、输出路径如下图所示:
源码路经 |
说明 |
\clr\src |
整个CLR内核和基本类库的源码路经 |
\clr\src\vm |
CLR虚拟机引擎的源码,包括GC、JIT、类库加载器等完整功能 |
\csharp |
C#编译器和Assembly链接程序的源码路经 |
\clr\src\bcl |
.NET基本类库源码,如System.IO、System.Collections这些命名空间下面的类库源码都在这里 |
\clr\src\dlls |
其它进程跟CLR虚拟机交换的几个关键DLL的源码,包括下面这些组件:
|
\src\utilcode |
被很多CLR虚拟机组件共享的通用代码 |
\src\fjit |
JIT编译器,即mscorejit.dll的源码 |
\src\fusion |
搜索和加载Assembly、GAC(Global Assembly Cache)的组件,即fusion.dll的源码 |
\src\ilasm |
IL语言编译器 |
\src\ildasm |
IL反编译工具 |
\src\debug |
托管调试器 cordbg 的源码 |
\src\md |
Assembly元数据读写库 |
\src\tools |
多个非托管工具的源码:
|
其它.NET类库和支持工具
这里面提供了一些除基本类库以外的少量类库源码:
- System.dll
源码位置:%ROTOR_DIR%\fx\src\sys
- System.xml.dll
源码位置:%ROTOR_DIR%\fx\src\xml
- System.Runtime.Serialization.Formatters.Soap.dll
源码位置:%ROTOR_DIR%\managedlibraries\soapserializer
- System.Runtime.Remoting.dll
源码位置:%ROTOR_DIR%\managedlibraries\remoting
其它托管程序的编译器
SSCLI里面还附带了一个使用C#语言开发的Microsoft Jscript编译器实现,而这个编译器本身就能编译托管程序,其源码路经是:%ROTOR_DIR%\jscript
转载于:https://www.cnblogs.com/vowei/p/4287572.html
.NET框架源码解读之SSCLI编译过程简介相关推荐
- Slim 框架源码解读
0x00 前言 Slim 是由<PHP The Right Way>作者开发的一款 PHP 微框架,代码量不算多(比起其它重型框架来说),号称可以一下午就阅读完(我觉得前提是熟悉 Slim ...
- Ubuntu12.04下Android4.0.4源码的下载及其编译过程
Ubuntu12.04下Android4.0.4源码的下载及其编译过程 http://www.jizhuomi.com/android/environment/427.html
- PyTorch 源码解读之即时编译篇
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 作者丨OpenMMLab 来源丨https://zhuanlan.zhihu.com/ ...
- Mybatis 框架源码解读(详细流程图+时序图)
看源码都要带着问题去看,比如 UserMapper.java只有接口而没有实现类,那么是如何执行的呢? mybatis中一级缓存是如何进行缓存与维护的? 底层是如何执行query查询的 查询后的结果是 ...
- .NET框架源码解读之MYC编译器
在SSCLI里附带了两个示例编译器源码,用来演示CLR整个架构的弹性,一个是简化版的lisp编译器,一个是简化版的C编译器.lisp在国内用的少,因此这里我们主要看看C编译器的源码,源码位置是:\ss ...
- eggjs框架源码解读
文章目录 前言 Egg进程模型 Egg应用程序结构 egg运行启动的内幕 加载插件 扩展内置对象 加载中间件 加载service 加载路由 加载配置 设置应用信息 执行业务逻辑 文件加载机制 结语 前 ...
- 若依框架源码解读之数据源篇
读源码过程中读到yml中有设置主次数据源,次数据源没有启用,在看到DruidConfig中的配置时,没有搞明白,怎么让mybatis找到主数据源的,请教大神在哪里实现的. 附上数据源配置 @Bean( ...
- eBPF动手实践系列一:解构内核源码eBPF样例编译过程
作者:闻茂泉 他山之石 了解和掌握纯c语言的ebpf编译和使用,有助于我们加深对于eBPF技术原理的进一步掌握,也有助于开发符合自己业务需求的高性能的ebpf程序.目前常见和主流的纯c语言的ebpf编 ...
- 深入wepy源码:wpy文件编译过程
wepy 是腾讯开源的一款小程序框架,主要通过预编译的手段,让开发者采用类 Vue 风格开发. 让我们一起看看, wepy 是如何实现预编译的.先放上一张官网的流程图,后面的分析可以参考该图. wep ...
- mysql 执行概况_转mysql源码分析之SQL执行过程简介
本人打算从SQL语句的执行开始学习和分析MYSQL源码,首先了解MYSQL是如何执行一条SQL语句的,详细了解它的执行过程之后,再深入学习执行一条SQL语句的运行原理. 1)从执行一条SQL语句的堆栈 ...
最新文章
- 安装和部署Exchange Server 2007
- wp7——sqlite数据库操作 from:http://blog.csdn.net/wp_lijin/article/details/7370790
- mysql 工具_MySQL压力测试工具,值得收藏
- css sprint 生成工具 bg2css
- ksql 数量大于2_A股史上唯一能暴涨200%的买卖铁则:内盘大于外盘股价必跌,外盘大于内盘股价必涨,堪称绝技...
- 《数据结构与算法》实验报告——快速排序
- 深入理解CachingConnectionFactory
- nginx优化——包括https、keepalive等
- hive 配置用户名_hive的用户和用户权限
- Unity中提升像素字体清晰度
- 第 24 章 状态模式
- 2.权限管理准备工作:你应该知道的ASP.NET网站最基本的安全措施!
- 计算机辅助翻译术语PPT,计算机辅助翻译
- linux项目实验ppt下载,实验一Linux系统的使用.ppt
- codebook算法原理
- 浏览器被hao360,hao123,2345,搜狗,www.xie116.xyz/ 劫持的方法
- TFTP文件传输NFS挂载ARM开发板移植Linux系统步骤
- 笔记本电脑安装 OMV 关闭屏幕自动休眠的问题
- Go 语言高质量编程
- Java后端以及web前端及echarts框架词云分析
热门文章
- 能跑的东西,尽量继续跑,平稳过渡
- 创业失败反思:吾亦有大错,错在哪里?
- C调用Python的示例代码
- MySQL到mongodb中间件_Bifrost: Bifrost ---- 面向生产环境的 MySQL 同步到Redis,MongoDB等服务的异构中间件...
- 使用双向链表构建二叉树_LeetCode-109 有序链表转换二叉搜索树
- python爬虫安装了pycharm还要安装什么_Pycharm安装与使用
- OnSetCursor 及改变鼠标形状
- matlab的梯形公式推导公式,复化梯形公式,辛普森公式的matlab程序
- python使用opencv图像聚类_Python3 OpenCV3图像处理-K-means 聚类
- Python编写的强大的、通用的解析器