靜態鏈接過程發生了什么?

在靜態鏈接過程中主要發生了兩件事。一是空間與地址分配,鏈接器掃描所有輸入文件的段,合并相似段并且重新計算段長度和在虛擬內存中的映射關系,收集所有的符號放到全局符號表中。二是符號解析與重定位,鏈接器收集所有的段信息和重定位信息并且進行符號解析和重定位、調整代碼中的地址等。

1. 空間與地址分配

我們用一個簡單的例子來分析一下靜態鏈接過程中的空間與地址分配情況。

/* a.c */
extern int shared;int main()
{int a = 100;swap(&a, &shared);
}
/* b.c */
int shared = 1;void swap(int* a, int* b)
{*a ^= *b ^= *a ^= *b;
}
gcc -c a.c b.c #獲取a.o 和 b.o
ld a.o b.o -e main -o ab -lc #將a.o b.o鏈接生成ab

輸入目標文件的同名段將會被合并

a.o的段結構--------------->
在這里插入圖片描述
b.o 的段結構------------>
在這里插入圖片描述

ab的段結構---------------->
在這里插入圖片描述

對比一下a.o b.o和ab的.text .data段size,我們可以發現ab文件的段是a.o文件和b.o文件同名段的組合。

字段\文件a.ob.oab
.textsize: 0x00000058sze: 0x0000004fsize: 0x000000a7
.datasize: 0x00000000size: 0x00000004size: 0x00000004

鏈接后文件才會有VMA

觀察上述a.o b.o 和 ab 文件.text段的VMA地址可以發現,a.o和b.o文件中的.text的VMA地址都是0,只有ab文件的.text段的VMA地址不是0而是0x00401030。為什么是0x00401030?正常ELF可執行文件會被加載到0x400000開始的內存中,最開始加載的是程序頭等段,然后才是代碼數據段。
在這里插入圖片描述

確定無需重定位的符號地址

在目標文件中,無需重定位的符號地址都是相對與段地址的偏移。那么掃描所有輸入文件符號表的時候,會為所有的符號偏移加上重新計算出的段虛擬地址就是符號的新的虛擬地址。例如,上面的例子中a.o文件中main函數相對.text段的偏移是X,而經過計算后.text的虛擬地址是0x401030,那么main函數符號的虛擬地址就是0x401030+X。

2. 符號解析與重定位

鏈接器首先會掃描所有目標文件的符號表,將所有符號進行虛擬地址換算。然后掃描所有的重定位表,根據重定位表中的符號項名稱在符號表中找到,再根據對應符號表中符號項的地址定位到需要替換的符號位置進行符號地址替換。

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

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

相關文章

? 一次有趣的經歷

📆2025年3月17日 | 周一 | ??晴 📍今天路過學院樓7,見到了滿園盛開的花🌺,心情瞬間明朗! 📌希望接下來的日子也能像這些花一樣,充滿活力🔥! &#x1…

docker安裝redis

第一步:docker拉取redis鏡像 這種命令如果沒有指定版本則是最新版本:docker pull redis 成功了 docker images 查詢已經拉取成功鏡像 然后因為在容器內部我們修改redis的配置不好修改,所以我們可以進行掛載配置文件 這個配置文件可以方便…

C語言學習筆記(第三部份)

說明:由于所有內容放在一個md文件中會非常卡頓,本文件將接續C_1.md文件的第三部分 整型存儲和大小端 引例: int main(void) {// printf("%d\n", SnAdda(2, 5));// PrintDaffodilNum(10000);// PrintRhombus(3);int i 0;int arr[…

Cortical Labs公司CL1人腦芯片:開啟生物智能計算新時代

Cortical Labs公司CL1人腦芯片:開啟生物智能計算新時代 在科技飛速發展的今天,人工智能已經深入到我們生活的各個角落,但隨著其發展,也面臨著能耗高、效率有限等諸多挑戰。為了突破這些瓶頸,科學家們開始探索將生物學…

Python學習第十八天

Django模型 定義:模型是 Django 中用于定義數據庫結構的 Python 類。每個模型類對應數據庫中的一張表,類的屬性對應表的字段。 作用:通過模型,Django 可以將 Python 代碼與數據庫表結構關聯起來,開發者無需直接編寫 S…

Windows 圖形顯示驅動開發-WDDM 3.0功能- 硬件翻轉隊列(一)

WDDM 3.0 之前的翻轉隊列模型 許多新式顯示控制器支持對按順序顯示的多個幀排隊的能力。 從 WDDM 2.1 開始,OS 支持將在下一個 VSync 中顯示的多個未完成的翻轉覆蓋請求。 顯示微型端口驅動程序 (KMD) 通過 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVS…

《Python深度學習》第二講:深度學習的數學基礎

本講來聊聊深度學習的數學基礎。 深度學習聽起來很厲害,其實它背后是一些很有趣的數學原理。本講會用簡單的方式解釋這些原理,還會用一些具體的例子來幫助你理解。 2.1 初識神經網絡 先從一個簡單的任務開始:識別手寫數字。 想象一下,你有一堆手寫數字的圖片,你想讓計算…

車載DoIP測試 --- CANoe DoIP中如何配置路由激活請求中的 OEM 特定場(RoutingActivationWithOEMSpecific)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

JDBC數據庫連接池技術詳解——從傳統連接方式到高效連接管理

1. 引言 在開發數據庫應用時,我們通常需要與數據庫建立連接并執行SQL語句。傳統的JDBC連接方式雖然簡單直接,但在高并發場景下容易帶來性能問題,甚至導致系統崩潰。因此,引入數據庫連接池(Connection Pool&#xff09…

【工具類】PDF文件轉圖片

PDF文件轉文件 1. 引入Maven依賴 主要使用了 pdfbox 包與 hutool 包。 pdfbox 負責 pdf 到圖片的轉換&#xff1b; hutool 負責文件讀取轉換。 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version…

使用DeepSeek,優化斐波那契數函數,效果相當不錯

下面這段代碼定義了一個遞歸函數 fibonacci&#xff0c;用于計算第 n 個斐波那契數。 def fibonacci(n):if n < 1:return nelse:return fibonacci(n - 1) fibonacci(n - 2)雖然代碼邏輯正確&#xff0c;但其性能較差&#xff0c;尤其是對于較大的 n 值&#xff0c;其復雜度…

Forward Looking Radar Imaging by Truncated Singular Value Decomposition 論文閱讀

Forward Looking Radar Imaging by Truncated Singular Value Decomposition and Its Application for Adverse Weather Aircraft Landing 1. 論文的研究目標與意義1.1 研究目標1.2 實際問題與意義2. 論文的創新方法與公式解析2.1 信號建模與問題轉化2.2 截斷奇異值分解(TSVD)…

provide/inject源碼實現

在 Vue 3 中&#xff0c;provide 和 inject 是通過 Vue 的響應式系統和組件實例機制實現的&#xff0c;底層是依賴 Vue 3 中的 Proxy 和 Reactive 來實現跨層級的數據傳遞和響應式綁定。以下是一個簡化版的實現邏輯&#xff0c;幫助理解 Vue 3 中 provide 和 inject 是如何實現…

Unix時間戳BKP備份寄存器RTC實時時鐘

Unix時間戳 Unix時間戳&#xff0c;也稱為POSIX時間或Epoch時間&#xff0c;是一種在Unix和類Unix操作系統中使用的時間表示方法。它表示的是自1970年1月1日00:00:00 UTC&#xff08;協調世界時&#xff09;至當前時間經過的秒數&#xff0c;不考慮閏秒。Unix時間戳通常以秒為…

【Linux內核系列】:進程板塊與文件板塊的綜合

&#x1f525; 本文專欄&#xff1a;Linux &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 人生中成功只是一時的&#xff0c;失敗卻是人生的主旋律&#xff0c;但是如何面對失敗卻把人分成了不同的樣子&#xff0c;有的人會被…

CellOracle|基因擾動研究基因功能|基因調控網絡+虛擬干預

在gzh“生信小鵬”同步文章 論文來源: 發表期刊:Nature發表時間:2023年2月23日論文題目:Dissecting cell identity via network inference and in silico gene perturbation研究團隊:Kenji Kamimoto 等,華盛頓大學醫學院1. 研究背景與問題提出 細胞身份(Cell Identit…

專線、云 和 物聯網(IoT)

專線、云 和 物聯網&#xff08;IoT&#xff09; 是現代信息與通信技術&#xff08;ICT&#xff09;領域的三大重要組成部分&#xff0c;它們在企業和個人的數字化轉型中扮演著關鍵角色。以下是對這三者的詳細介紹及其相互關系&#xff1a; 1. 專線&#xff08;Leased Line&…

[Lc14_priority_queue] 最后一塊石頭重量 | 數據流中的第 K 大元素 | 前K個高頻單詞 | 數據流的中位數

目錄 1.最后一塊石頭的重量 題解 2.數據流中的第 K 大元素 題解 3.前K個高頻單詞 題解 代碼 ?4.數據流的中位數 題解 在C中&#xff0c;使用標準庫中的priority_queue&#xff0c;默認情況下它是一個最大堆&#xff08;即大堆排序&#xff09;&#xff0c;這意味著最…

XSS漏洞靶場---(復現)

XSS漏洞靶場—&#xff08;復現&#xff09; 反射型 XSS 的特點是攻擊者誘導用戶點擊包含惡意腳本的 URL&#xff0c;服務器接收到請求后將惡意腳本反射回響應頁面&#xff0c;瀏覽器執行該腳本從而造成攻擊&#xff0c;惡意腳本不會在服務器端存儲。 Level 1(反射型XSS) 此漏…

2025/3.17 郭院安排會議與南京銀行參訪

目錄 *郭院會議&#xff1a;服務外包*1.會遇到的問題以及解決方案2.考慮行業目前會碰到的瓶頸3.后端應該呈現處理圖像的過程4.記得做報告、文檔說明和視頻等工作 *南京銀行&#xff08;鑫合易家&#xff09;參訪記錄*1. 風險評分業務流程筆記![在這里插入圖片描述](https://i-b…