99国产精品欲av蜜臀,可以直接免费观看的AV网站,gogogo高清免费完整版,啊灬啊灬啊灬免费毛片

網易首頁 > 網易號 > 正文 申請入駐

鏈接器是如何一步步發明出來的?

0
分享至

在計算機編程的早期年代,你面臨一個揮之不去的的噩夢。。。

你找了一個剛剛運行成功的程序仔細看了看:

; main.asm - 主程序 start:     ; 初始化     mov cx, 10     mov dx, 20     ; 調用math.asm中的add函數     call 0x1234  ; 這里的0x1234是add函數在內存中的絕對地址     ; 退出     mov ax, 0     int 21h

; math.asm - 數學函數模塊 add:     ; 加法函數     mov ax, cx     add ax, dx     ret

你一眼就注意到main.asm中的那些數字了,0x12340x5678

這些是函數在最終內存中的絕對地址,也是所有程序員的噩夢,因為這些地址都是程序員手動計算出來的!

例如,如果math.asm被加載到內存地址0x1000,而add函數在模塊內的偏移是0x234,那么add的絕對地址就是0x1234

這個過程不僅繁瑣,而且極易出錯,更糟糕的是維護問題。

牽一發而動全身

你清楚地知道,如果程序員在math.asm的開頭添加了一個新函數,會發生什么!

; math.asm - 修改后 new_function:  ; 新增的函數     ; 一些代碼     ret add:  ; 位置改變了!     mov ax, cx     add ax, dx     ret

這個看似無害的修改會導致add函數的位置發生變化!它的偏移量增加了,絕對地址也隨之改變。現在,main.asm中的call 0x1234指令將跳轉到錯誤的位置!

程序員必須重新計算add函數的新地址并修改所有調用add的地方。

如果程序有數十個模塊,數百個函數調用,這個過程將變成一場噩夢,每次修改代碼,都可能引發一連串的地址更新工作。

于是你的開始思索,需要一種機制,能夠自動處理這些地址綁定,讓程序員們專注于代碼邏輯而非地址計算,為實現這種機制就決不能在程序中使用絕對內存地址!

窮則思變

不使用內存地址使用啥呢?

此時你想到當你找喊一個人的時候直呼其名而不是喊這個人的經緯度坐標,對了!這里也可以使用名字而不是地址來引用函數和變量,想到這里符號(Symbol)概念誕生了。

是啊,為啥要用內存地址硬編碼,程序員可以使用符號啊:

; main.asm - 使用符號名 start:     ; 初始化     mov cx, 10     mov dx, 20     ; 使用符號名而非硬編碼地址     call add      ; 使用符號名"add"而非0x1234     ; 退出     mov ax, 0     int 21h

這種方法的核心思想是:程序員只需關心名字(如add、print),而不必關心這些函數最終在內存中的確切位置。

這是一個巨大的抽象飛躍!

你設計的符號概念帶來了2個關鍵優勢:

  1. 減少錯誤:不再需要手動計算和更新地址,消除了一大類潛在錯誤。

  2. 簡化維護:當函數位置變化時,只需保持符號名不變,調用代碼無需修改。

最重要的是,符號為自動化解決依賴關系奠定了基礎。

遺留問題

符號概念是很優雅,但問題是:如何確定符號名最終的內存地址呢?

顯然這次需要有一個能夠自動確定符號最終內存地址的工具,讓程序員徹底擺脫地址計算的負擔,到底該怎么做到呢?

要達到這個目的就不能讓編譯器直接生成機器碼,而是把這個過程拆成兩步:

  • 編譯器處理各個模塊,但不必關心跨模塊引用

  • 根據各個模塊提供的信息來確定符號最終的內存地址并合并所有的模塊為一個最終可執行文件

就這樣在你的設想中你把整個編程過程拆成了兩步,第一步是編譯、第二步你將其稱之為鏈接,link。

第二步中各個模塊提供的信息還是比較模糊,這個信息是什么,該怎么提供?

目標文件的誕生

既然編譯器不直接生成最終的機器碼,那么就需要一種文件來承接這一階段編譯器的輸出,這個用來記錄編譯器第一階段輸出的文件就是所謂的目標文件,Object File。

這個文件包含機器碼,但不去確定引用的外部符號的內存地址:

call print

你把所有這樣的符號收集起來記錄來目標文件中,這就是所謂的重定位表(Relocation Table),標記代碼中需要在鏈接時填充正確地址的位置,這就是所謂的重新定位,重定位。

同時這個文件記錄模塊定義的所有符號(函數、變量)及其相對位置,這就是所謂符號表(Symbol Table):記錄模塊定義的所有符號(函數、變量)及其相對位置。

它們可能長這樣:

-- main.obj -- 代碼段:   偏移 0x03: mov dx, 20   偏移 0x06: call ???  (需要重定位,調用add)   偏移 0x0B: mov bx, ax   偏移 0x0D: call ???  (需要重定位,調用print) 符號表:   start -> 偏移 0x00 (本模塊定義,"我能提供什么") 重定位表:   偏移 0x07: 需要add的地址     偏移 0x0E: 需要print的地址 未解析引用:   add   (外部符號,“我需要什么”) print (外部符號,“我需要什么”)
目標文件的意義

目標文件的出現是一個關鍵突破,因為它:

  1. 分離了編譯和鏈接:編譯器只需關注單個模塊的翻譯,不必處理跨模塊引用。

  2. 明確記錄了依賴關系:每個模塊清楚地表達了"我提供什么"(符號表)和"我需要什么"(未解析引用)。

  3. 為自動化鏈接提供了數據結構:重定位表明確標記了需要修正的地址位置。

現在, 你的任務就變得明確了:讀取多個目標文件,解析它們的符號和依賴關系,然后將它們正確地"鏈接"在一起。

但如何實現這個鏈接過程?很明顯,你需要實現兩個核心算法:符號解析和重定位。

符號解析與重定位

符號解析解決一個基本問題:將每個模塊的"需求"與其他模塊的"供給"匹配起來。

具體來說,你需要:

  1. 收集所有符號:遍歷每個目標文件的符號表,建立一個全局符號字典,記錄每個符號的定義位置。

  2. 檢查未解析引用:對每個模塊的未解析引用,在全局符號字典中查找其定義。

  3. 處理沖突和錯誤:如果一個符號有多個定義(沖突)或沒有定義(未解析),生成適當的錯誤信息。

如果所有未解析引用都能在全局符號表中找到對應的定義,符號解析就成功了。否則,你的算法會生成一個錯誤,這就是后來的程序員熟悉的"undefined reference to..."。

符號解析解決了"符號供需匹配"問題,重定位的任務是:確定每個模塊和符號在最終內存中的確切位置。

重定位過程包括:

  1. 內存布局規劃:決定各個模塊在最終內存空間中的排列順序和基址。

  2. 地址計算:根據模塊基址和符號在模塊內的偏移,計算每個符號的最終絕對地址。

  3. 填充重定位條目:遍歷每個模塊的重定位表,將正確的地址填充到代碼中的相應位置。

符號解析和重定位這兩個步驟解決了模塊化編程中最核心的問題:如何讓分散在不同文件中的代碼片段正確地找到并調用彼此。

鏈接器的誕生

至此,這兩個核心算法的實現徹底解放了程序員,讓他們不再需要手動計算和修改地址。

來源:碼農的荒島求生

編輯:未

轉載內容僅代表作者觀點

不代表中科院物理所立場

如需轉載請聯系原公眾號

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
上任不足4個月,巡視組進駐后,吳揚落馬

上任不足4個月,巡視組進駐后,吳揚落馬

魯中晨報
2025-07-25 13:15:04
兩岸代表團爆發沖突,大陸人員受傷,國民黨大難臨頭卻附和民進黨

兩岸代表團爆發沖突,大陸人員受傷,國民黨大難臨頭卻附和民進黨

小陸搞笑日常
2025-07-25 18:58:30
廣東名嘴陳維聰分享自己出獄后的生活,花幾十萬帶家人出國旅行

廣東名嘴陳維聰分享自己出獄后的生活,花幾十萬帶家人出國旅行

TVB的四小花
2025-07-26 00:02:16
全是反轉!《掃毒風暴》大結局,是我今年看過最震撼的大結局!

全是反轉!《掃毒風暴》大結局,是我今年看過最震撼的大結局!

古木之草記
2025-07-25 22:11:59
兩大司令部被炸毀,柬軍敗局已定?中方及時開金口,送泰柬一句話

兩大司令部被炸毀,柬軍敗局已定?中方及時開金口,送泰柬一句話

影孖看世界
2025-07-25 22:31:43
宮魯鳴學著點!中國女籃蕩氣回腸,掀翻美國奪冠,這夜熬得太值了

宮魯鳴學著點!中國女籃蕩氣回腸,掀翻美國奪冠,這夜熬得太值了

格斗一點通
2025-07-26 03:40:09
得不到就毀掉?宗馥莉親叔叔太狠了,直接曝光宗馥莉的婚姻是真的

得不到就毀掉?宗馥莉親叔叔太狠了,直接曝光宗馥莉的婚姻是真的

鯨探所長
2025-07-23 07:55:29
母女遭出租車司機辱罵繞路甩客?交通執法部門:擬吊銷司機從業資格證

母女遭出租車司機辱罵繞路甩客?交通執法部門:擬吊銷司機從業資格證

澎湃新聞
2025-07-25 09:08:28
央視:印度全力申辦2036年奧運會,主要對手有卡塔爾、土耳其等國

央視:印度全力申辦2036年奧運會,主要對手有卡塔爾、土耳其等國

直播吧
2025-07-25 11:24:46
最后3天,沉默兩個月后,李嘉誠恐將賣國,中方出手將軍

最后3天,沉默兩個月后,李嘉誠恐將賣國,中方出手將軍

星辰夜語
2025-07-25 19:20:07
泰柬邊境交火升級:佩通坦罕見發聲,中國三部門連夜出手

泰柬邊境交火升級:佩通坦罕見發聲,中國三部門連夜出手

起喜電影
2025-07-26 03:20:27
陶喆再一次證明,娶妻要娶年紀小的,等你老了她還美得賞心悅目

陶喆再一次證明,娶妻要娶年紀小的,等你老了她還美得賞心悅目

情感大頭說說
2025-07-25 09:18:05
許婧與新老公同框!坐游艇出海游玩,38歲活成少女,手上婚戒亮了

許婧與新老公同框!坐游艇出海游玩,38歲活成少女,手上婚戒亮了

娛樂皮皮醬
2025-07-26 05:10:16
成群老人占店蹭空調,大喇叭驅趕無果,逼得老板開30度熱風攆人

成群老人占店蹭空調,大喇叭驅趕無果,逼得老板開30度熱風攆人

振華觀史
2025-07-25 17:27:09
洪森統治柬埔寨38年,給窮人帶來了什么樣的生活?

洪森統治柬埔寨38年,給窮人帶來了什么樣的生活?

現代小青青慕慕
2025-07-25 08:53:26
宿遷市紀委監委通報:涉嫌嚴重違紀違法,汪育才被查!

宿遷市紀委監委通報:涉嫌嚴重違紀違法,汪育才被查!

魯中晨報
2025-07-25 19:54:08
40度天女孩被困豪車內,環衛工砸爛車窗救人,車主:這車送你了

40度天女孩被困豪車內,環衛工砸爛車窗救人,車主:這車送你了

凱裕說故事
2025-07-24 17:02:55
多讀書還是有用啊!張碧晨自認唯一原唱,汪蘇瀧一招就終結紛爭!

多讀書還是有用啊!張碧晨自認唯一原唱,汪蘇瀧一招就終結紛爭!

青青子衿
2025-07-25 17:07:08
6名大學生溺亡事件更多細節披露 車間主任:校企都沒做過專項安全檢查

6名大學生溺亡事件更多細節披露 車間主任:校企都沒做過專項安全檢查

上游新聞
2025-07-25 14:32:26
砍18+7+6+4,火箭隊終獲2號位替補!手握雙向合同,或力壓謝潑德

砍18+7+6+4,火箭隊終獲2號位替補!手握雙向合同,或力壓謝潑德

熊哥愛籃球
2025-07-25 22:19:45
2025-07-26 05:59:00
中科院物理所 incentive-icons
中科院物理所
愛上物理,改變世界。
9211文章數 136264關注度
往期回顧 全部

科技要聞

36款熱門車高危智駕場景測試,“團滅”!

頭條要聞

8旬翁下葬前墓地被人埋死狗沿路埋鐵釘暗器 官方介入

頭條要聞

8旬翁下葬前墓地被人埋死狗沿路埋鐵釘暗器 官方介入

體育要聞

3年過去了,她還是歐洲杯上最酷的姐

娛樂要聞

汪蘇瀧不忍了 !張碧晨痛失《年輪》演唱權

財經要聞

劉煜輝:當下重要不是找確定性而是轉折點

汽車要聞

李斌一口氣講了近3個小時樂道L90 原因是為啥?

態度原創

本地
親子
時尚
教育
公開課

本地新聞

換個城市過夏天|風拂鹽湖,躲進格爾木的盛夏清涼

親子要聞

小宸哥歷險記之門外有人:不要給陌生人開門

今年夏天一定要有這件衣服,好看又復古!

教育要聞

考生高考674分上民辦高校被罵!了解學校背景后,才知他有多明智

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 三台县| 璧山县| 昌宁县| 衡阳市| 卓资县| 若尔盖县| 紫云| 安陆市| 襄汾县| 浮梁县| 渭南市| 芜湖市| 崇阳县| 改则县| SHOW| 安徽省| 梁山县| 镇远县| 芮城县| 江都市| 商城县| 彭阳县| 广宗县| 武川县| 凌源市| 交口县| 道真| 准格尔旗| 澳门| 垣曲县| 仙游县| 阿拉善左旗| 广南县| 丁青县| 大新县| 阳西县| 大渡口区| 深州市| 瑞丽市| 从化市| 阳信县|