?.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.pswp.cn/news/280686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280686.shtml
英文地址,請注明出處:http://en.pswp.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…

bash快捷鍵

Ctrl h :回退一個字符Ctrl f :光標前進一個字符Ctrl b :光標后退一個字符Ctrl w :刪除光標之前的一個字符串(進入剪切板)Ctrl u :刪除光標前的所有字符 (進入剪切板&#xff09…

J - 青蛙的約會(擴展歐幾里得)

https://vjudge.net/contest/218366#problem/J 第一步追及公式要寫對:ynk-(xmk)pL > (n-m)klpx-y 可以看出擴展歐幾里得原型,這里注意擴展歐幾里得求出的是任意解,非最優,要推出最小解k。 (n-m)xlygcd > (n-m)(x*(x-y)/gcd)…

C# 簡單方式解壓Zip文件/使用VS2019自帶功能

一、目的、構想 1.直接解壓zip文檔。 2.網上資料不少需要外部dll。 3. 找到可以不需要外部dll方法,分享。 二、code實現 using System.IO.Compression;string filePath "c:\Server\fileList"; string zipPath "C:\Server\Download\Auto.zip&quo…

在 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. 沒有比您的個人照片…

C# 檢查當前系統已安裝的程序app/兩種方法檢測

一、目的、構思 1.檢測當前系統有沒有安裝某個程序,如果沒有就重新安裝。 2.在網上找到了兩種方法,可惜都找不到需要檢測的app。 二、code實現 1.查找注冊列表方式。要在winform的project使用,在console project 貌似找不到Microsoft.Win3…

Integer源碼解析

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wangyangzhizhou/article/details/77196626 概況 Java的Integer類主要的作用就是對基本類型int進行封裝,提供了一些處理int類型的方法,比如int到Strin…

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…

IE不能直接顯示PDF的原因分析和解決方法

>>>>>問題<<<<<因為有系統用iframe顯示PDF&#xff0c;但PDF有時卻并不能順利地在流覽器中顯示&#xff0c;而是跳出下載對話框&#xff0c;要求下載&#xff0c;給user帶來很多困擾&#xff0c;也給我們系統維護人員帶來了麻煩&#xff0c;用了…

C# 程序圖標設置/winform 圖標

一、目的、實際情況 1.編寫一個winform 程序&#xff0c;發現有一個圖標非常有意義。區分其他程序&#xff0c;以及感覺在做產品而不是寫代碼。 2.添加圖標圖片發現&#xff0c;需要用ico格式。在線轉換&#xff08;某度搜索&#xff09;還是不靠譜。要微信登陸&#xff0c;登…

數字化轉型,究竟在“轉”什么?

這是頭哥侃碼的第265篇原創「頭哥嘮B嘮」這個欄目已經持續了幾個月了&#xff0c;沒想到還在繼續進行&#xff0c;并收獲了很多朋友們的喜愛。非常感謝大家的支持&#xff01;在上次的直播中&#xff0c;我找來了我的老熟人們。一個是右軍老師&#xff0c;之前 APISIX 的很多內…

C++ Primer 第Ⅲ部分筆記——類設計者的工具

1.對象移動 1.1右值引用 右值引用區別于普通引用&#xff0c;用兩個&表示 返回左值引用的函數&#xff0c;連同賦值、下標、解引用和前置遞增遞減運算符返回左值 返回非引用的函數&#xff0c;連同算術、關系、位以及后置遞增遞減運算符都生成右值 我們不能將左值引用綁定到…

Crash 的文明世界

題目描述 給一棵樹&#xff0c;求以每個點為根時下列式子的值。 題解 當k1時這就是一個經典的換根dp問題。 所以這道題還是要用換根dp解決。 部分分做法&#xff1a; 考慮轉移時是這樣的一個形式(圖是抄的)。 用二項式定理展開就可以nk2做了。 觀察到結果是一個xk的形式。 然后…

wampServer配置WWW根目錄遇到的坑

直接在官網下載之后開始安裝&#xff0c;一切正常 打開使用&#xff0c;一切正常 設置WWW目錄。坑了一波 按照的都是百度上的教程&#xff0c;設置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 開始支持的命令行工具&#xff0c;在使用 dotnet tool 比較多了的時候&#xff0c;想要更新所有的 dotnet tool 就比較麻煩&#xff0c;而目前 .NET SDK 還不支持&#xff0c;也有一些人希望能…