​.Net 7 AOT 彻底解析下(完结篇)

楔子:

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

.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.入口
9c250099b550d83ab01634218575b894.png
第二列00269F60是__managed__Main函数在段.managedcode$I的偏移地址,也就是函数头地址。

2.内容:
8fd34ab0f576f1783e0f375542b8ea72.png

3.局部变量
以下是.data段,
58492698eca1b58984ca986e998ccd4d.png
上图红色框的东西到底什么呢?为何也放入目标文件?

跟踪下发现是函数LdelemaRef重定位处的注释。以下是部分代码
31f45a9aafa1b77e4c0516266f2852fa.png
蓝色框为重定位,所以值是0,红色框就是上面需要找的内容。

4.链接之后的可执行文件。
无论是win还是linux,链接之后的可执行文件,体积变小了,省略了函数名。可以对照下。
前:
e404f12b9b6bb6709b544faf1fadaba1.png
后:
e3b83fbcba35ea3b6abf9b77ebcfe746.png

PE和ELF的加载器,LD和Link的中间连接过程。JIT,ILC,CL一个不落的全用上了。分支则在链接用了开源和不开源的链接器。

结果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cmd暂停快捷键_是否有键盘快捷键可以暂停正在运行的CMD窗口的输出?

cmd暂停快捷键When running a batch script, you may need or want to pause the output in the CMD window so that you can look things over. Is there an easy way to pause, then restart the output? Today’s SuperUser Q&A post has the answer to help with a re…

在 Docker 中使用 flannel - 每天5分钟玩转 Docker 容器技术(60)

上一节我们安装和配置了 flannel,本节在 Docker 中使用 flannel。配置 Docker 连接 flannel编辑 host1 的 Docker 配置文件 /etc/systemd/system/docker.service,设置 --bip 和 --mtu。这两个参数的值必须与 /run/flannel/subnet.env 中 FLANNEL_SUBNET …

使用.NET7和C#11打造最快的序列化程序-以MemoryPack为例

译者注本文是一篇不可多得的好文,MemoryPack 的作者 neuecc 大佬通过本文解释了他是如何将序列化程序性能提升到极致的;其中从很多方面(可变长度、字符串、集合等)解释了一些性能优化的技巧,值得每一个开发人员学习,特别是框架的开…

永不丢失照片:防弹照片备份的完整指南

There’s nothing as precious and irreplaceable as your personal photos and, with a little forethought and planning, there’s no reason to ever feel the heartbreak of losing even a single one of them to theft, broken devices, or disaster. 没有比您的个人照片…

MySQL InnoDB存储引擎

呵呵哒。。。 MySQL体系结构和存储引擎 首先要搞懂的是什么是数据库,什么是数据库实例。 数据库:物理操作系统文件或其他形式文件类型的集合。 实例:MySQL数据库由后台线程以及一个共享内存区组成,实例才是真正对数据库进行操作的…

Blazor学习之旅 (8) MudBlazor组件库介绍

【Blazor】| 总结/Edison Zhou大家好,我是Edison。为了实现一个Web应用系统,需要有个看起来不丑的UI,而对于.NET程序员来说要做全栈开发还是有点难,而本篇介绍的这个UI组件库正好可以帮助我们解决这个问题!MudBlaozr是…

棉花糖多少钱_如何在6.0棉花糖及更高版本中访问Android的正在运行的应用程序列表...

棉花糖多少钱In Android 5.x and below, accessing your list of running apps was simple—you’d jump into Settings > Apps > Running. Easy! In Android 6.0, however, Google moved this setting. It’s still not super difficult to find, but it’s a little tr…

C# 程序图标设置/winform 图标

一、目的、实际情况 1.编写一个winform 程序,发现有一个图标非常有意义。区分其他程序,以及感觉在做产品而不是写代码。 2.添加图标图片发现,需要用ico格式。在线转换(某度搜索)还是不靠谱。要微信登陆,登…

数字化转型,究竟在“转”什么?

这是头哥侃码的第265篇原创「头哥唠B唠」这个栏目已经持续了几个月了,没想到还在继续进行,并收获了很多朋友们的喜爱。非常感谢大家的支持!在上次的直播中,我找来了我的老熟人们。一个是右军老师,之前 APISIX 的很多内…

Crash 的文明世界

题目描述 给一棵树,求以每个点为根时下列式子的值。 题解 当k1时这就是一个经典的换根dp问题。 所以这道题还是要用换根dp解决。 部分分做法: 考虑转移时是这样的一个形式(图是抄的)。 用二项式定理展开就可以nk2做了。 观察到结果是一个xk的形式。 然后…

wampServer配置WWW根目录遇到的坑

直接在官网下载之后开始安装,一切正常 打开使用,一切正常 设置WWW目录。坑了一波 按照的都是百度上的教程,设置httpd.conf 这里配置之后网页访问127.0.0.1 还是localhost都还是原始的www目录 后来 我发现了这里 是配置虚拟URL的地方。以上是正…

windows安装程序创建_如何在Windows上创建已安装程序的列表

windows安装程序创建Reinstalling Windows is a good way to fix serious problems with your computer, or just to get a fresh slate. But before you reinstall Windows, you should make a list of programs you currently have installed on your PC so you know what yo…

实现一个更新所有 dotnet tool 的 dotnet tool

实现一个更新所有 dotnet tool 的 dotnet toolIntrodotnet tool 是从 .NET Core 2.1 开始支持的命令行工具,在使用 dotnet tool 比较多了的时候,想要更新所有的 dotnet tool 就比较麻烦,而目前 .NET SDK 还不支持,也有一些人希望能…

[AHOI2009]飞行棋 BZOJ1800

题目描述 给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。 输入输出格式 输入格式:第一行为正整数N&…

webapi+Quartz.NET解决若干定时程序同时运行的问题

项目现状: 有若干定时程序需要自启动运行,为了简便程序部署等问题,采取这种办法把定时程序集中管理到webapi中跟随api发布 代码架构介绍: 新建一个类库,类库引用Quartz(Quartz.2.3.2)&#xff0…

mac恢复iphone_免费下载:旧Mac和iPhone壁纸的令人震惊的完整档案

mac恢复iphoneLove or hate Apple, you’ve got to admit: their background images are consistently stunning. Now you can download all of them. 爱或恨苹果,您必须承认:它们的背景图像始终令人赞叹。 现在,您可以下载所有这些文件。 A …

Magicodes.IE 2.7.1发布

2.7.12022.12.01Magicodes.IE.EPPlus默认添加SkiaSharp.NativeAssets.Linux.NoDependencies包,以便于在Linux环境下使用导入验证支持将错误数据通过Stream的方式返回,感谢sampsonye (见pr#466)2.7.02022.11.07添加SkiaSharp移除Si…

Comcast以纯文本泄露客户Wi-Fi登录信息,立即更改密码

A Comcast Xfinity website was leaking Wi-Fi names and passwords, meaning now is a good time to change your Wi-Fi passcode. Comcast Xfinity网站泄漏了Wi-Fi名称和密码,这意味着现在是更改Wi-Fi密码的好时机。 The site, intended to help new customers se…

龙芯上跑WTM,为国产化做点贡献

点击上方蓝字关注我哦“信创”,是一项国家战略,即信息技术应用创新产业,它是数据安全、网络安全的基础,也是新基建的重要组成部分。信创从名称上来看本意指向创新,但是自从漂亮国亲手撕碎了“科技没有国界”的谎言之后…

PHP安装之configure的配置参数

1、生成环境安装配置如下 要求安装如下库: imagickgdmysqlmysqlimysqlndphalconPharsoapsocketsxwebxsvczipzlib 具体查看 vim php-config 就可以知道是如何配置的 --prefix/home/php --with-config-file-path/home/php/etc --with-mysql --with-pdo-oci --with-ope…