學習編譯和啟動時鏈結器所做的事

2021-10-02 06:13:52 字數 872 閱讀 4942

聯結器,我的理解是將高階語言編譯成二進位制檔案在記憶體中執行的中間橋梁,最主要的作用是將符號繫結到位址上.

ios用的是llvm(low level virtual machine)編譯器,編譯器可以將**編譯成二進位制並在記憶體中執行,這樣可以極大提公升程式執行的速度.同時缺點在於除錯週期比較長.每次都需要重新啟動才能看得到**執行效果,所以才有了基於runtime機制產生的rn flutter 等跨端解決方案.

llvm編譯過程:原始碼->ast-ir-mactch-o(ios)

編譯時聯結器做了哪些工作:

mach-o檔案中主要還是**和資料.**數函式,資料是全域性變數,聯結器是將這些符號繫結在執行位址中.

我們寫的**編譯器是將其翻譯成乙個個機器碼,需要聯結器將其串起來才能執行.就好比珍珠和線一樣.

連線過程中要對**進行檢查,因為咱們在寫**的時候不同檔案之間會有相互引用的**,聯結器會檢查不同檔案的相互引用,一些變數有沒有定義,對專案中不同的檔案變數進行位址重定位.隨著專案不斷迭代很多無用業務**,鏈結去會檢測函式呼叫關係,以main為源頭,跟隨每個引用,將引用的函式標記活的.自動將無用的**去掉.

說完自己書寫的**,接下來看看在專案中會引用各種系統庫和三方庫,鏈結去是怎樣處理他們的呢?

匯入的庫有靜態庫和動態庫,靜態庫是在程式設計過程中連線到mach-o檔案中,而動態庫是在執行時通過dyld實現動態載入.但是在mach-o檔案中包含了動態庫的名字和位址,dlopen 和 dlsym 匯入動態庫時就可以實現動態執行它們;

dyld 會先執行mach-o檔案 根據檔案中的undefined標記的符號來載入對應的動態庫,系統會開闢乙個共享空間來解決遞迴依賴問題;載入後將undefined的符號繫結到動態庫的位址上;最後再處理+load方法.main函式執行.

參考文獻:

伺服器啟動時的leader選舉

每個節點啟動的時候狀態都是looking,處於觀望狀態,接下來就開始進行選主流程 若進行leader選舉,則至少需要兩台機器,這裡選取3臺機器組成的伺服器集群為例。在集群初始化階段,當有一台伺服器server1啟動時,其單獨無法進行和完成leader選舉,當第二台伺服器server2啟動時,此時兩台...

360瀏覽器啟動時不開啟主頁的原因

最近使用360瀏覽器時發現瀏覽器啟動時的開啟頁面總是360導航,而不是自己設定的主頁,百思不得其解,如果不是大量的使用了360雲盤和360網路收藏夾等功能,早就解除安裝了換其他瀏覽器,但最後還是讓我找到了原因。首先檢視360瀏覽器主頁設定 正常,然後看360主頁防護 也正常,最後突發奇想,360使用...

我的父親母親 編譯器和鏈結器

更多來自 雖然我是visual studio建立的,但是實際上,我的老爸和老媽是visual studio整合的編譯器和鏈結器。此外,visual studio提供的主要是編輯功能,讓你更方便地編輯我的源 我老爸編譯器的工作是將高階語言c 翻譯為低階語言 機器語言 我的原始檔是使用c 這種高階程式語...