建设网站要不要钱百度贴吧,政务服务 网站 建设方案,卖房网站排名,网站 域名 空间 服务器楔子#xff1a;本篇是承继前面三篇文章而来#xff0c;分别为#xff1a;.Net 7 的 AOT 和 CLR有什么区别#xff1f;.Net 7 的 R2R,Crossgen2是什么?.Net 7 的AOT原理简析通过以上三篇的基础#xff0c;本篇来彻底解析下AOT这门技术的底层原理。AOT此终#xff0c;不再…楔子本篇是承继前面三篇文章而来分别为.Net 7 的 AOT 和 CLR有什么区别.Net 7 的 R2R,Crossgen2是什么?.Net 7 的AOT原理简析通过以上三篇的基础本篇来彻底解析下AOT这门技术的底层原理。AOT此终不再叙。.Obj(win) OR .O(Linux)目标文件AOT的第一步就是比较重要的通过ILC AOT编译器把托管代码的动态链接库DLL)编译成二进制的机器码。这个编译的过程基本上如下1.通过Roslyn把.Net代码编译成托管DLL2.通过ILC AOT编译器调用JIT编译器3.通过JIT编译器把托管DLL编译成二进制机器码4.返回ILC编译器把二进制的机器码写入目标文件.Obj OR .O。写入目标文件之后所有的代码需要运行的全局变量局部变量函数机器码函数头重定位偏移符号结构变量段偏移全部被目标目标文件包含。下一步就是进行目标机器的链接。Link(win) OR ldLinuxwin下面可以通过link.exe来链接目标文件。而linux下面可以通过ld -o命令来链接gcc或者ilc编译的目标文件.o 。然后得到的exe或者ELF就是AOT最终的文件形态。过程以上经过提炼的过程看似非常简单里面实则极其复杂而且晦涩。简单的看看。不会太深入。以下1,2以__managed__Main AOT入口函数为例它里面调用的是C#的Main函数。3以函数System.Runtime.TypeCast.LdelemaRef的重定位为例。4看链接之后。1.入口第二列00269F60是__managed__Main函数在段.managedcode$I的偏移地址也就是函数头地址。2.内容3.局部变量以下是.data段上图红色框的东西到底什么呢为何也放入目标文件跟踪下发现是函数LdelemaRef重定位处的注释。以下是部分代码蓝色框为重定位所以值是0红色框就是上面需要找的内容。4.链接之后的可执行文件。无论是win还是linux,链接之后的可执行文件体积变小了省略了函数名。可以对照下。前后PE和ELF的加载器LD和Link的中间连接过程。JITILCCL一个不落的全用上了。分支则在链接用了开源和不开源的链接器。结果微软为了支持社区提出的AOT技术这个过程搞得复杂多了。但是用起来似乎以前方便了些只不过封装太多了。