.net7aot彻底解析下(完结篇)

dotNET跨平台 dotNET跨平台     2022-12-15     352

关键词:

楔子:

本篇是承继前面三篇文章而来,分别为:

.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代码编译成托管DLL
2.通过ILC AOT编译器调用JIT编译器
3.通过JIT编译器把托管DLL编译成二进制机器码
4.返回ILC编译器,把二进制的机器码写入目标文件.Obj OR .O。

写入目标文件之后,所有的代码需要运行的全局变量,局部变量,函数机器码,函数头,重定位偏移,符号结构,变量段偏移,全部被目标目标文件包含。

下一步就是进行目标机器的链接。

Link(win) OR ld(Linux)

win下面可以通过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的中间连接过程。JIT,ILC,CL一个不落的全用上了。分支则在链接用了开源和不开源的链接器。

结果

微软为了支持社区提出的AOT技术,这个过程搞得复杂多了。但是用起来似乎以前方便了些,只不过封装太多了。

图解googlev8学习笔记合集23篇(完结)

...码的?图解GoogleV8#02:函数即对象:一篇文章彻底搞懂JavaScript的函数特点图解GoogleV8#03:快属性和慢属性:V 查看详情

玩转webpack视频课程学习笔记合集(未完结)

...#xff1a;webpack核心概念webpack基础篇(三):资源解析–解析ES6webpack基础篇( 查看详情

使用golang+antlr4构建一个自己的语言解析器(完结篇)(代码片段)

Goland中Antlr4插件在goland中安装Antlr4插件,用于识别输入的字符在在语法文件中生成的语法树的样子,大概就是如下的摸样下载步骤:1.点击文件中的设置选项2.在插件目录下输入Antlr4搜索插件3.点击安装即可编写自己的语言语法文... 查看详情

jvm类加载机制全面解析,一篇完整彻底搞懂(代码片段)

我是目录:1、概述:2、类的生命周期:3、类加载器:4、类加载机制——双亲委派机制1、概述:2、类的生命周期:包括7个阶段:加载、验证、准备、解析、初始化、使用和卸载。(其中验证、准... 查看详情

从无到有写一个运维app完结篇

 前言:自己的挖的坑还得填,此篇为完结篇,环境的搭建参考第一篇从无到有写一个运维APP(一),至于第二篇就跳过吧,写个APP没那么复杂。由于自己现在无业游民,所以没有什么现成的环境,环境就随便找个公网的。。再者... 查看详情

转载读懂il代码就这么简单完结篇

一前言写了两篇关于IL指令相关的文章,分别把值类型与引用类型在堆与栈上的操作区别详细的写了一遍这第三篇也是最后一篇,之所以到第三篇就结束了,是因为以我现在的层次,能理解到的都写完了,而且个人认为,重要的... 查看详情

十日冲刺(第二阶段)完结篇

一、说在前面  基本上是完成了我的部分二、完成情况增加了一些可以交换双方的窗口两个冲刺阶段不容易以后学习继续里努力  查看详情

第18完结篇-javaxml

第18完结篇-JAVAXML每篇一句 :我们不缺方法,缺的是一往无前的决心和魄力初学心得:我们应该从中吸取教训,而不是累积伤痛(笔者:JEEP/711)[JAVA笔记|时间:2017-05-21|JAVAXML]1.什么是XMLExtensibleMarkupLanguage:翻译过来为可扩展标记... 查看详情

dtrace简介之完结篇3

...tps://blogs.oracle.com/swan/entry/dtrace%E7%AE%80%E4%BB%8B_3DTRACE简介之完结篇Bysamwanon 四月13,2007        已经有好长一段时间没有更新blog了,不是我懒,确实是这段时间太忙。工作加上生活,算了,不找借口了... 查看详情

简单演示django使用之五--(django概用完结总结篇)(代码片段)

经过前面四篇基本的django使用,下面对django这个web开发框架做个小小的个人总结:??首先,打开浏览器访问站点后,请求直接到服务器端。作为django的web服务器,接收请求的是由view视图来处理,此外view视图函数还能进行代码的... 查看详情

脚本语言bash简明教程(完结篇)(代码片段)

Bash(GNUBourne-AgainShell)isaUnixshellandscriptlanguagewrittenbyBrianFoxfortheGNUProjectasafreesoftwarereplacementfortheBourneshell.Firstreleasedin1989,ithasbeenusedasthedefaultloginshellformostLinuxd 查看详情

脚本语言bash简明教程(完结篇)(代码片段)

Bash(GNUBourne-AgainShell)isaUnixshellandscriptlanguagewrittenbyBrianFoxfortheGNUProjectasafreesoftwarereplacementfortheBourneshell.Firstreleasedin1989,ithasbeenusedasthedefaultloginshellformostLinuxd 查看详情

脚本语言bash简明教程(完结篇)(代码片段)

Bash(GNUBourne-AgainShell)isaUnixshellandscriptlanguagewrittenbyBrianFoxfortheGNUProjectasafreesoftwarereplacementfortheBourneshell.Firstreleasedin1989,ithasbeenusedasthedefaultloginshellformostLinuxd 查看详情

linux0.11-操作系统启动完结篇-40(代码片段)

Linux0.11-操作系统启动完结篇-40操作系统启动完结篇转载操作系统启动完结篇整个操作系统终于通过四个部分的讲解,完成了它的启动,达到了一个怠速状态,留下了一个shell程序等待用户指令的输入并执行。具体来说... 查看详情

linux0.11-操作系统启动完结篇-40(代码片段)

Linux0.11-操作系统启动完结篇-40操作系统启动完结篇转载操作系统启动完结篇整个操作系统终于通过四个部分的讲解,完成了它的启动,达到了一个怠速状态,留下了一个shell程序等待用户指令的输入并执行。具体来说... 查看详情

linux0.11-一个新进程的诞生完结篇-29(代码片段)

Linux0.11-一个新进程的诞生完结篇-29一个新进程的诞生完结篇转载一个新进程的诞生完结篇整个第三部分,我们用前四回的内容讲述了进程调度机制,又用后三回内容讲述了fork函数的全部细节。先看进程调度机制。进程调... 查看详情

linux0.11-一个新进程的诞生完结篇-29(代码片段)

Linux0.11-一个新进程的诞生完结篇-29一个新进程的诞生完结篇转载一个新进程的诞生完结篇整个第三部分,我们用前四回的内容讲述了进程调度机制,又用后三回内容讲述了fork函数的全部细节。先看进程调度机制。进程调... 查看详情

[转帖]解密国内bat等大厂前端技术体系-完结篇

解密国内BAT等大厂前端技术体系-完结篇https://juejin.im/post/5e02c0896fb9a0160770ae9e 在两个月前,我开始了一次对国内各大互联网前端技术体系的探索之路。自己的技术视野也得到不断扩展,自身对于大前端的技术也建立起了比较完... 查看详情