SSCLI编译过程简介

前文演示了编译SSCLI最简便的方法(在Windows下):

  1. 在“Visual Studio 2005 Command Prompt”下,进入SSCLI的根目录;
  2. 运行 env.bat 脚本准备环境;
  3. 运行 buildall.cmd 脚本开始编译过程。

env.bat设置了当前SSCLI的运行环境,命令的语法是:env [option],其中[option]可以是 debugcheckedfree ,各个环境选项说明如下表:

  • debug:关闭代码优化设置,启用调试用代码(一般是通过条件编译开关),生成调试用符号文件。
  • checked: 打开代码优化设置,启动调试用代码,生成符号文件。
  • free :打开代码优化设置,关闭调试用代码,生成符号文件。
    出于解读代码的需要,一般都会选择debug选项。

设定好运行环境后,buildall.cmd的编译过程可以分为下面几大步骤:

  1. 编译基本的引导工具集:平台抽象层(PAL)和非托管程序(unmanaged)编译工具;
  2. 编译辅助的引导工具集:剩余的工具集和相关基础架构;
  3. 编译CLR内核、基本类库,C#编译器和其他支持工具;
  4. 编译其它.NET类库和支持工具
  5. 编译其它托管程序的编译器,如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\,*号根据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的源码,包括下面这些组件:
  • shim:主要是确定当前机器上安装了哪些.net版本
  • mscorsn:用来做强签名验证
  • mscorpe:Windows平台可执行文件PE格式读写库
  • mscoree:用来在进程中加载CLR虚拟机
  • mscordbi和mscordbc:调试服务
  • \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:多个非托管工具的源码:
  • clix:托管程序解释执行工具
  • ildbsymbols:托管程序调试符号文件读写工具
  • metainfo:assembly元数据读取工具
  • peverify:验证托管程序的IL程序
  • internalresgen
  • sn:强签名操作工具
  • permview:Assembly权限查看工具
  • gac:全局Assembly缓存管理工具
  • sos:Windbg调试.NET程序的辅助函数库

其它.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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容