Linux下ELF文件的介紹

目錄

1.溫故知新

2.ELF文件介紹

3.ELF文件組成

4.ELF文件形成到加載

5.連接過程


1.溫故知新

? ? ? ? 上一篇博客,我們介紹了我們的動靜態,知道了我們的庫其實也是文件,如果我們想寫一個庫也是可以的,我們的把我們的庫文件編譯成.o文件,然后把它們進行打包.a文件,形成靜態庫,然后我們把我們的程序和庫進行打包編譯,就把我們的靜態庫和我們的代碼進行合并,我們就可以使用庫的函數了。動態庫需要我們把它的庫文件放在我們的默認查找路徑下/lib/64下,讓我們可以找到我們的庫文件就可以了,而至于我們的頭文件,我們只需要讓我們的文件找到它就可以了。

2.ELF文件介紹

首先我們知道ELF文件是什么?是文件啊。是文件就有內容和屬性,了解它無非就是內容上了解,屬性上了解。

? ? ? ?我們的.o文件,可執行程序,.so文件,core dump都是我們的ELF文件,所以我們想要進一步了解編譯鏈接的細節就需要來了解我們的ELF文件。

3.ELF文件組成

? ? ? ? 我們的ELF文件由四部分組成:ELF頭,程序頭表,節頭表,節組成。

我們的ELF header里面定位文件的其他部分。ELF文件內容對我來講,就是一個數組。

因為我只要知道他這個文件的起始位置和它們的大小,我們就可以找到這個文件的任意位置了。

ELF文件內容里面的四個部分。

????????? ? ? ??

我們內核里面ELF的代碼是有這個程序的入口的,它位于我們文件的開始位置,可以定位文件的其他部分,它也有我們程序的入口,讓我們編譯器知道從程序的哪個位置開始執行。

4.ELF文件形成到加載

我們進行動靜態庫鏈接需要先把.c文件編譯成.o文件,我們還需要對多個.o文件進行合并。

但是這個合并是在我們鏈接的時候進行的。我們做的是把我們.o庫文件進行打包。

我們的ELF文件有多種不同的Section,在加載到內存的時候,也會進行Section的合并

我們的節頭表在鏈接時起作用,節頭表里面有對每個節的描述,鏈接的時候可以根據對節的描述把節進行合并成段,提高空間利用效率,而我們的程序頭表里面列舉了每個段的描述和屬性,知道每個段在哪里分開,把每個段進行分開,這樣可以幫助我們加載的時候告訴我們OS怎樣加載可執行文件完成進程內存的初始化。

說白了就是節是具體的,告訴怎么合并,程序頭表是告訴段的劃分是怎么樣的,讓OS進行內存初始化。節頭表是我們鏈接的時候,程序頭表告訴我們怎么把我們鏈接好的文件放到內存里進行執行。

上面我們說過,我們ELF頭可以幫助我們定位ELF文件每個部分,所以我們編譯器只需要知道我們ELF節頭表,就可以對節進行合并了,合并好了就鏈接好了啊。

當我們想要執行的時候我們的OS可以找到這個文件ELF頭表,再根據頭表找到程序頭表,知道哪些模塊要加載進內存。知道我們程序的加載。

所以我們上面說我們OS和編譯器都要知道ELF頭表因為我們鏈接時要用,加載時也要用。不知道

ELF怎么完成這個工作呢?

實踐中,當我們將一個.c文件編譯成我們的.o文件我們去查看我們的文件,發現我們文件中調庫函數地方的地址是沒有的。

這是因為我們只有函數的聲明,我們還沒有對我們的,o文件進行鏈接,找不到具體的實現方法,所以這里學習的是不是和我們以前介紹的對上了呢?因為沒有鏈接,所以找不到具體的實現,但是頭文件里面有我們函數的聲明,所以并沒有報錯。

我們靜態鏈接就是把我們的.o進行合并,鏈接合并的時候,鏈接器會根據我們的重定位表對函數的地址進行重定位從而形成我們的可執行文件。這就是靜態鏈接的過程。

我們鏈接之后我們發現我們的函數地址就被填充上了,我們就可以找到對應的實現方法了。

所以鏈接在干什么?就是把我們不知道函數具體實現的地方找到了函數實現的地址,對地址實現了重定位。

這里我們終于知道了為什么.o叫做可重定位文件了,因為它需要重定位才可以執行,不然我們只有函數聲明,沒有函數實現,執行個毛!

兩個.o代碼合并到一起,進行統一的編制,鏈接的時候,修改.o中沒有確定的函數地址,進行相關call地址,完成代碼調用。

5.連接過程

事實上,我們對ELF進行編制,采用平坦模式進行編制,說白了就是從000-fff進行線性統一編制。

磁盤可執行文件,就是起始地址+偏移量這種地址,只不過我們平坦模式的起始地址是0.

我們給磁盤中這種文件編制的地址叫邏輯地址。它和我們加載到內存的虛擬地址是一樣的。

如同一個硬幣的兩面,硬幣翻面了還是那個硬幣啊!

? ? ? ??

在我們的磁盤中,我們的文件就有了邏輯地址了,所以我們可以看到我們的文件還沒有被加載到內存的時候,就已經被編制了,并不是加載到內存才有得地址。

而且我們的虛擬地址初始化的時候還需要依賴ELF文件,每個segment有自己的起始地址和結束地址,就可以用來初始化虛擬地址了。

根據下面這張圖,我們來做一個總結,我們的ELF文件在我們的磁盤中的時候就有了虛擬地址了,然后當我們的可執行程序被加載到內存的時候,我們會拿到它的虛擬地址,在頁表中為它建立映射關系,根據ELF合并之后的段對我們的虛擬地址空間進行初始化,也就是虛擬地址對物理內存映射的建立過程,然后我們就根據ELF文件提供的內容完成了我們可執行程序從硬盤加載到內存調用的過程了。

給到我們的虛擬地址,當我們調用我們的程序的時候,根據我們的MMU,我們就找到了物理內存的實際位置進行調用。

這里要說明的是,當我們建立虛擬和物理的映射關系時,不會立即在內存分配空間,而是當你調用的時候再為你分配空間。這個是我們缺頁異常導致的,就好比我們fork一個子進程,只有當我們修改的時候我們才會寫實拷貝,這是因為我們進行權限檢查發現越界了,OS檢查后對它進行了修改。類似!

我們下期再見!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94545.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94545.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94545.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能領域、圖歐科技、IMYAI智能助手2025年6月更新月報

2025年6月AI領域重要模型更新與平臺優化匯總 摘要: 本文匯總了2025年6月期間AI領域發布的多項重要模型更新及平臺功能優化信息,涵蓋Google Gemini、阿里通義萬相、字節豆包、百度文心一言、MiniMax海螺02、Google Veo3、快手可靈2.1、FLUX Kontext等模型…

從零開始學Express,理解服務器,路由于中間件

當我們初學前端時,常常只關注頁面效果和交互,但隨著項目復雜度提升,我們遲早會遇到“服務端”的問題:如何讓一個頁面的數據是從數據庫來的?怎么讓不同的用戶看到不同的內容?這時候,我們就需要一…

Codeforces Round 987 (Div. 2)

ABC 略D預處理出每個位置的前綴最大和后綴最小。從后向前枚舉&#xff0c;如果一個數無法后移&#xff0c;那么答案就是最大前綴&#xff0c;否則答案要不是前綴最大&#xff0c;要不就是這個數先移到前綴最大位置再移到能移到的最大的位置此處的答案。用線段樹維護#include<…

Javascript/ES6+/Typescript重點內容篇——手撕(待總結)

前端核心知識點梳理與面試題詳解 1. Promise 核心知識點 Promise 是異步編程的解決方案&#xff0c;用于處理異步操作三種狀態&#xff1a;pending&#xff08;進行中&#xff09;、fulfilled&#xff08;已成功&#xff09;、rejected&#xff08;已失敗&#xff09;狀態一旦改…

[自動化Adapt] 父子事件| 冗余過濾 | SQLite | SQLAlchemy | 會話工廠 | Alembic

第五章&#xff1a;事件處理與融合 歡迎回到OpenAdapt探索之旅~ 在第四章&#xff1a;系統配置中&#xff0c;我們掌握了如何定制化系統參數。更早的第一章&#xff1a;錄制引擎則展示了系統如何捕獲海量原始操作數據。 假設我們需要訓練機器人輸入"hello"一詞。原…

組合期權:跨式策略

文章目錄0.簡介1.買入跨式組合&#xff08;Long Straddle&#xff09;1.1 適用場景?1.2 合約選擇1.3 損益分析1.4 案例示范2.賣出跨式組合&#xff08;Short Straddle&#xff09;2.1 適用場景?2.2 合約選擇2.3 損益分析2.4 案例示范3.小結參考文獻0.簡介 跨式策略是一種交易…

Vue計算屬性詳解2

可寫計算屬性 計算屬性默認是只讀的,但在特殊場景下,我們可以創建"可寫"的計算屬性,通過同時提供getter和setter實現: <script setup>import { ref, computed } from vueconst firstName = ref(John)const lastName = ref(Doe)const fullName = computed(…

UniStorm 5.3.0 + Unity2022 + URP配置說明

一、前言 以前我用的是UniStorm3.0&#xff0c;主要用在內置管線里面&#xff0c;最近想在URP管線里面使用UniStorm天氣系統&#xff0c;于是弄了UniStorm5.3.0的包&#xff0c;在Unity2022.3的URP模式下配置&#xff0c;直接導入package&#xff0c;兩次宣告失敗。最后看了官方…

力扣經典算法篇-44-組合總和(回溯問題)

1、題干 給你一個無重復元素的整數數組candidates和一個目標整數 target &#xff0c;找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 &#xff0c;并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同一個 數字可以 無限制重復被選取 。…

矩陣與高斯消元:數學算法在計算機領域的應用

一、概述和基本概念 矩陣&#xff0c;類似于在 C 中我們看到的二維數組。它有兩個維度&#xff0c;行和列。下面是一個典型的矩陣&#xff1a; M[12342345445610111213] M \begin{bmatrix} 1 & 2 & 3 & 4 \\ 2 & 3 & 4 & 5 \\ 4 & 4 & 5 &…

【補題】CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes!) D. K-good

題意&#xff1a;給一個n&#xff0c;如果能被k個數整除&#xff0c;要求這k個數%k后不相同&#xff0c;問如果可以&#xff0c;任意k是多少&#xff0c;如果不可以輸出-1 思路&#xff1a; D. K-good_牛客博客 從來沒見過&#xff0c;太詭異了&#xff0c;做題做少了 1.…

LLM推理框架的“權力的游戲”:vLLM之后的群雄逐鹿

既然我們已經深入探討了本地與云端的兩大代表Ollama和vLLM&#xff0c;是時候將視野拓寬&#xff0c;檢視一下在高性能推理這片“高手如云”的競技場中&#xff0c;還有哪些重量級的玩家。vLLM的出現點燃了戰火&#xff0c;但遠非終點。 歡迎來到LLM推理框架的“后vLLM時代”—…

TDengine IDMP 背后的技術三問:目錄、標準與情景

過去十年&#xff0c;#工業 和#物聯網 場景經歷了快速的#數字化 建設&#xff1a;傳感器接入、系統聯網、數據上云……數據平臺已能輕松承載每秒千萬級別的寫入&#xff0c;每天幾 TB 的存儲量。但今天再回頭看&#xff0c;這些看似“完成”的系統&#xff0c;實際上只解決了一…

MyBatis基礎操作完整指南

文章目錄MyBatis簡介環境搭建Maven依賴數據庫表結構核心配置MyBatis配置文件數據庫配置文件實體類基礎CRUD操作Mapper接口Mapper XML映射文件工具類測試類動態SQL常用標簽高級特性一對一關聯映射一對多關聯映射分頁查詢使用注解方式MyBatis簡介 MyBatis是Apache的一個開源項目…

go與grpc

目錄下載與安裝遇到的問題cmd中protoc找不到命令cmd中--go_out: protoc-gen-go: Plugin failed with status code 1.下載與安裝 下載protoc&#xff1a; https://github.com/protocolbuffers/protobuf/releases 點擊下載相應電腦版本即可&#xff0c;我是windows系統下載了pro…

2025年AI面試重構招聘新生態

當企業面臨業務擴張與人才競爭的雙重壓力&#xff0c;傳統招聘模式已難以滿足高效、精準、公平的人才篩選需求。尤其在校招季、藍領用工潮等關鍵節點&#xff0c;面試官超負荷運轉、跨地域協調困難、評估標準模糊等問題頻發。AI技術的深度介入正推動招聘行業從“經驗驅動”向“…

Rust進階-part5-trait

Rust進階[part5]_trait trait概述 在 Rust 中,trait 是一種定義共享行為的方式。它類似于其他語言中的接口,允許我們定義一組方法簽名,然后讓不同的類型去實現這些方法。通過 trait,我們可以實現多態性,即不同類型可以以統一的方式處理。 普通實現 使用 trait 關鍵字來…

【人工智能-18】機器學習:決策樹、隨機森林

上一期【人工智能-17】機器學習&#xff1a;KNN算法、模型選擇和調優、樸素貝葉斯分類 文章目錄一、決策樹1.使用理由2.技術二、隨機森林1.使用理由2.原理核心&#xff1a;Bagging 隨機特征子集3.優點和缺點一、決策樹 決策樹是一種監督學習算法&#xff0c;主要用于分類&…

RFID高頻讀寫器在工業生產線的使用優勢

在工業4.0浪潮下&#xff0c;智能制造對生產效率與精準度的要求日益提升。RFID技術憑借其獨特的技術優勢&#xff0c;成為工業場景中實現數據實時采集與流程優化的關鍵工具。本文主要從RFID高頻讀寫器出發&#xff0c;系統解析其在工業生產線中的使用優勢。RFID高頻讀寫器一、技…

大模型學習筆記

prompt 提示詞的構成&#xff1a; 指示&#xff1a;描述讓它做什么上下文&#xff1a;給出與任務相關的背景信息輸入&#xff1a; 任務的輸入信息輸出&#xff1a;輸出的格式 生成與檢索 生成&#xff1a; 優點&#xff1a;內容的多樣性、創造性缺點&#xff1a;存在不可控制 檢…