技術(shù)分析:從字節(jié)碼的粒度來(lái)探索ELF文件
描述 Program header table 的結(jié)構(gòu)體:

描述 Section header table 的結(jié)構(gòu)體:

ELF header(ELF 頭)
頭部?jī)?nèi)容,就相當(dāng)于是一個(gè)總管,它決定了這個(gè)完整的 ELF 文件內(nèi)部的所有信息,比如:
這是一個(gè) ELF 文件;
一些基本信息:版本,文件類型,機(jī)器類型;
Program header table(程序頭表)的開始地址,在整個(gè)文件的什么地方;
Section header table(節(jié)頭表)的開始地址,在整個(gè)文件的什么地方;
你是不是有點(diǎn)納悶,好像沒(méi)有說(shuō) Sections(從鏈接器角度看) 或者 Segments(從加載器角度看) 在 ELF 文件的什么地方。
為了方便描述,我就把 Sections 和 Segments 全部統(tǒng)一稱為 Sections 啦!
其實(shí)是這樣的,在一個(gè) ELF 文件中,存在很多個(gè) Sections,這些 Sections 的具體信息,是在 Program header table 或者 Section head table 中進(jìn)行描述的。
就拿 Section head table 來(lái)舉例吧:
假如一個(gè) ELF 文件中一共存在 4 個(gè) Section: .text、.rodata、.data、.bss,那么在 Section head table 中,將會(huì)有 4 個(gè) Entry(條目)來(lái)分別描述這 4 個(gè) Section 的具體信息(嚴(yán)格來(lái)說(shuō),不止 4 個(gè) Entry,因?yàn)檫存在一些其他輔助的 Sections),就像下面這樣:

在開頭我就說(shuō)了,我要用字節(jié)碼的粒度,扒開來(lái)給你看!
為了不耍流氓,我還是用一個(gè)具體的代碼示例來(lái)描述,只有這樣,你才能看到實(shí)實(shí)在在的字節(jié)碼。
程序的功能比較簡(jiǎn)單:

// mymath.c
int my_add(int a, int b)
{
return a + b;
}
// main.c
#include <stdio.h>
extern int my_add(int a, int b);
int main()
{
int i = 1;
int j = 2;
int k = my_add(i, j);
printf("k = %d ", k);
}
從剛才的描述中可以知道:動(dòng)態(tài)庫(kù)文件 libmymath.so, 目標(biāo)文件 main.o 和 可執(zhí)行文件 main,它們都是 ELF 文件,只不過(guò)屬于不同的類型。
這里就以可執(zhí)行文件 main 來(lái)拆解它!
我們首先用指令 readelf -h(huán) main 來(lái)看一下 main 文件中,ELF header 的信息。
readelf 這個(gè)工具,可是一個(gè)好東西啊!一定要好好的利用它。

這張圖中顯示的信息,就是 ELF header 中描述的所有內(nèi)容了。這個(gè)內(nèi)容與結(jié)構(gòu)體 Elf32_Ehdr 中的成員變量是一一對(duì)應(yīng)的!
有沒(méi)有發(fā)現(xiàn)圖中第 15 行顯示的內(nèi)容:Size of this header: 52 (bytes)。
也就是說(shuō):ELF header 部分的內(nèi)容,一共是 52 個(gè)字節(jié)。那么我就把開頭的這 52 個(gè)字節(jié)碼給你看一下。
這回,我用 od -Ax -t x1 -N 52 main 這個(gè)指令來(lái)讀取 main 中的字節(jié)碼,簡(jiǎn)單解釋一下其中的幾個(gè)選項(xiàng):
-Ax: 顯示地址的時(shí)候,用十六進(jìn)制來(lái)表示。如果使用 -Ad,意思就是用十進(jìn)制來(lái)顯示地址;
-t -x1: 顯示字節(jié)碼內(nèi)容的時(shí)候,使用十六進(jìn)制(x),每次顯示一個(gè)字節(jié)(1);
-N 52:只需要讀取 52 個(gè)字節(jié);

這 52 個(gè)字節(jié)的內(nèi)容,你可以對(duì)照上面的結(jié)構(gòu)體中每個(gè)字段來(lái)解釋了。
首先看一下前 16 個(gè)字節(jié)。
在結(jié)構(gòu)體中的第一個(gè)成員是 unsigned char e_ident[EI_NIDENT];,EI_NIDENT 的長(zhǎng)度是 16,代表了 EL header 中的開始 16 個(gè)字節(jié),具體含義如下:
0 - 15 個(gè)字節(jié)

怎樣樣?我以這樣的方式徹底暴露自己,向你表白,足以表現(xiàn)出我的誠(chéng)心了吧?!
如果被感動(dòng)了,別忘記在文章的最底部,點(diǎn)擊一下在看和收藏,也非常感謝您轉(zhuǎn)發(fā)給身邊的小伙伴。贈(zèng)人玫瑰,手留余香!
為了權(quán)威性,我把官方文檔對(duì)于這部分的解釋也貼給大家看一下:

關(guān)于大端、小端格式,這個(gè) main 文件中顯示的是 1,代表小端格式。啥意思呢,看下面這張圖就明白了:

那么再來(lái)看一下大端格式:

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-

落地?zé)o錫!京東首個(gè)物流機(jī)器人超級(jí)工廠來(lái)了
-

OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-

長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
最新活動(dòng)更多
-
即日-5.20立即下載>> 【限時(shí)免費(fèi)】物理場(chǎng)仿真助力生物醫(yī)學(xué)領(lǐng)域技術(shù)創(chuàng)新
-
精彩回顧立即查看>> 【直播】 智測(cè)未來(lái)·2026海克斯康春季產(chǎn)品創(chuàng)新日
-
精彩回顧立即查看>> 【線下論壇】新唐科技×芯唐南京 2026 年度研討會(huì)
-
精彩回顧立即查看>> OFweek 2026(第十五屆)中國(guó)機(jī)器人產(chǎn)業(yè)大會(huì)
-
精彩回顧立即查看>> 維科杯· OFweek 2025中國(guó)機(jī)器人行業(yè)年度評(píng)選
-
精彩回顧立即查看>> 【在線會(huì)議】液冷服務(wù)器信號(hào)完整性及冷卻液關(guān)鍵電參數(shù)測(cè)試
推薦專題
- 1 AI狂歡遇上油價(jià)破百,全球股市還能漲多久? | 產(chǎn)聯(lián)看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實(shí)測(cè):中文穩(wěn)、細(xì)節(jié)炸,設(shè)計(jì)師慌了
- 3 6000億美元估值錨定:字節(jié)跳動(dòng)的“去單一化”突圍與估值重構(gòu)
- 4 Tesla AI5芯片最新進(jìn)展總結(jié)
- 5 連夜測(cè)了一波DeepSeek-V4,我發(fā)現(xiàn)它可能只剩“審美”這個(gè)短板了
- 6 熱點(diǎn)丨AI“瑜亮之爭(zhēng)”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤:9秒刪庫(kù)跑路,全員被封號(hào),還繼續(xù)扣錢!
- 8 2026,人形機(jī)器人只贏了面子
- 9 DeepSeek降價(jià)90%:價(jià)格屠夫不是身份,是戰(zhàn)略
- 10 AI Infra產(chǎn)業(yè)鏈卡在哪里了?
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市


分享





