技術(shù)分析:從字節(jié)碼的粒度來(lái)探索ELF文件
初次見(jiàn)面
大家好,我是 ELF 文件,大名叫 Executable and Linkable Format。
經(jīng)常在 Linux 系統(tǒng)中開(kāi)發(fā)的小伙伴們,對(duì)于我肯定是再熟悉不過(guò)了,特別是那些需要了解編譯、鏈接的家伙們,估計(jì)已經(jīng)把我研究的透透的。
為了結(jié)識(shí)更多的小伙伴,今天呢,就是我的開(kāi)放日,我會(huì)像洋蔥一樣,一層一層地?fù)荛_(kāi)我的心,讓更多的小伙伴來(lái)了解我,歡迎大家前來(lái)圍觀。
以前啊,我看到有些小伙伴在研究我的時(shí)候,看一下頭部的匯總信息,然后再瞅幾眼 Section 的布局,就當(dāng)做熟悉我了。
從科學(xué)的態(tài)度上來(lái)說(shuō),這是遠(yuǎn)遠(yuǎn)不夠的,未達(dá)究竟。
當(dāng)你面對(duì)編譯、鏈接的詳細(xì)過(guò)程時(shí),還是會(huì)一臉懵逼。
今天,我會(huì)從字節(jié)碼的顆粒度,毫無(wú)保留、開(kāi)誠(chéng)布公、知無(wú)不言、言無(wú)不盡、赤膽忠心、一片丹心、鞠躬盡瘁、死而后已的把自己剖析一遍,讓各位看官大開(kāi)眼界、大飽眼福。
您了解這些知識(shí)之后呢,在今后繼續(xù)學(xué)習(xí)編譯、鏈接的底層過(guò)程,以及一個(gè)可執(zhí)行程序在從硬盤(pán)加載到內(nèi)存、一直到 main 函數(shù)的執(zhí)行,心中就會(huì)非常的敞亮。
也就是說(shuō),掌握了 ELF 文件的結(jié)構(gòu)和內(nèi)容,是理解編譯、鏈接和程序執(zhí)行的基礎(chǔ)。
你們不是有一句俗話嘛:磨刀不誤砍柴工!
好了,下面我們就開(kāi)始吧!
文件很單純,復(fù)雜的是人
作為一種文件,那么肯定就需要遵守一定的格式,我也不例外。
從宏觀上看,可以把我拆卸成四個(gè)部分:
圖中的這幾個(gè)概念,如果不明白的話也沒(méi)關(guān)系,下面我會(huì)逐個(gè)說(shuō)明的。
在 Linux 系統(tǒng)中,一個(gè) ELF 文件主要用來(lái)表示 3 種類(lèi)型的文件:
既然可以用來(lái)表示 3 種類(lèi)型的文件,那么在文件中,肯定有一個(gè)地方用來(lái)區(qū)分這 3 種情況。
也許你已經(jīng)猜到了,在我的頭部?jī)?nèi)容中,就存在一個(gè)字段,用來(lái)表示:當(dāng)前這個(gè) ELF 文件,它到底是一個(gè)可執(zhí)行文件?是一個(gè)目標(biāo)文件?還是一個(gè)共享庫(kù)文件?
另外,既然我可以用來(lái)表示 3 種類(lèi)型的文件,那么就肯定是在 3 種不同的場(chǎng)合下被使用,或者說(shuō)被不同的家伙來(lái)操作我:
可執(zhí)行文件:被操作系統(tǒng)中的加載器從硬盤(pán)上讀取,載入到內(nèi)存中去執(zhí)行;
目標(biāo)文件:被鏈接器讀取,用來(lái)產(chǎn)生一個(gè)可執(zhí)行文件或者共享庫(kù)文件;
共享庫(kù)文件:在動(dòng)態(tài)鏈接的時(shí)候,由 ld-linux.so 來(lái)讀。
就拿鏈接器和加載器來(lái)說(shuō)吧,這兩個(gè)家伙的性格是不一樣的,它們看我的眼光也是不一樣的。
鏈接器在看我的時(shí)候,它的眼睛里只有 3 部分內(nèi)容:
也就是說(shuō),鏈接器只關(guān)心 ELF header, Sections 以及 Section header table 這 3 部分內(nèi)容。
加載器在看我的時(shí)候,它的眼睛里是另外的 3 部分內(nèi)容:
加載器只關(guān)心 ELF header, Program header table 和 Segment 這 3 部分內(nèi)容。
對(duì)了,從加載器的角度看,對(duì)于中間部分的 Sections, 它改了個(gè)名字,叫做 Segments(段)。換湯不換藥,本質(zhì)上都是一樣一樣的。
可以理解為:一個(gè) Segment 可能包含一個(gè)或者多個(gè) Sections,就像下面這樣:
這就好比超市里的貨架上擺放的商品:有礦泉水、可樂(lè)、啤酒,巧克力,牛肉干,薯片。
從理貨員的角度看:它們屬于 6 種不同的商品;但是從超市經(jīng)理的角度看,它們只屬于 2 類(lèi)商品:飲料和零食。
怎么樣?現(xiàn)在對(duì)我已經(jīng)有一個(gè)總體的印象了吧?
其實(shí)只要掌握到 2 點(diǎn)內(nèi)容就可以了:
一個(gè) ELF 文件一共由 4 個(gè)部分組成;
鏈接器和加載器,它們?cè)谑褂梦业臅r(shí)候,只會(huì)使用它們感興趣的部分;
還有一點(diǎn)差點(diǎn)忘記給你提個(gè)醒了:在 Linux 系統(tǒng)中,會(huì)有不同的數(shù)據(jù)結(jié)構(gòu)來(lái)描述上面所說(shuō)的每部分內(nèi)容。
我知道有些小伙伴比較性急,我先把這幾個(gè)結(jié)構(gòu)體告訴你。
初次見(jiàn)面,先認(rèn)識(shí)一下即可,千萬(wàn)不要深究哦。
描述 ELF header 的結(jié)構(gòu)體:

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-
機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹(shù)機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-
存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-
長(zhǎng)安汽車(chē)母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-
豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-
字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-
員工持股爆雷?廣汽埃安緊急回應(yīng)
-
中國(guó)“智造”背后的「關(guān)鍵力量」
-
小米汽車(chē)研發(fā)中心重磅落地,寶馬家門(mén)口“搶人”
最新活動(dòng)更多
-
即日-9.1立即下載>> 【限時(shí)下載】ADI中國(guó)三十周年感恩回饋助力企業(yè)升級(jí)!
-
即日-9.16點(diǎn)擊進(jìn)入 >> 【限時(shí)福利】TE 2025國(guó)際物聯(lián)網(wǎng)展·深圳站
-
10月23日立即報(bào)名>> Works With 開(kāi)發(fā)者大會(huì)深圳站
-
10月24日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
11月27日立即報(bào)名>> 【工程師系列】汽車(chē)電子技術(shù)在線大會(huì)
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
- 1 阿里首位程序員,“掃地僧”多隆已離職
- 2 先進(jìn)算力新選擇 | 2025華為算力場(chǎng)景發(fā)布會(huì)暨北京xPN伙伴大會(huì)成功舉辦
- 3 宇樹(shù)機(jī)器人撞人事件的深度剖析:六維力傳感器如何成為人機(jī)安全的關(guān)鍵屏障
- 4 清華跑出具身智能獨(dú)角獸:給機(jī)器人安上眼睛和大腦,融資近20億
- 5 特朗普要求英特爾首位華人 CEO 辭職
- 6 踢館大廠和微軟,剖析WPS靈犀的AI實(shí)用主義
- 7 騰訊 Q2 財(cái)報(bào)亮眼:AI 已成第二增長(zhǎng)曲線
- 8 谷歌吹響AI沖鋒號(hào),AI還有哪些機(jī)會(huì)
- 9 蘋(píng)果把身家押在Siri上:一場(chǎng)輸不起的自我革命
- 10 共探合作新機(jī)遇!江門(mén)市新會(huì)區(qū)(深圳)“AI + 機(jī)器人” 產(chǎn)業(yè)對(duì)接會(huì)成功舉辦