訂閱
糾錯
加入自媒體

技術(shù)分析:從字節(jié)碼的粒度來探索ELF文件

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

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

ELF header(ELF 頭)

頭部內(nèi)容,就相當(dāng)于是一個總管,它決定了這個完整的 ELF 文件內(nèi)部的所有信息,比如:

這是一個 ELF 文件;

一些基本信息:版本,文件類型,機(jī)器類型;

Program header table(程序頭表)的開始地址,在整個文件的什么地方;

Section header table(節(jié)頭表)的開始地址,在整個文件的什么地方;

你是不是有點(diǎn)納悶,好像沒有說 Sections(從鏈接器角度看) 或者 Segments(從加載器角度看) 在 ELF 文件的什么地方。

為了方便描述,我就把 Sections 和 Segments 全部統(tǒng)一稱為 Sections 啦!

其實(shí)是這樣的,在一個 ELF 文件中,存在很多個 Sections,這些 Sections 的具體信息,是在 Program header table 或者 Section head table 中進(jìn)行描述的。

就拿 Section head table 來舉例吧:

假如一個 ELF 文件中一共存在 4 個 Section: .text、.rodata、.data、.bss,那么在 Section head table 中,將會有 4 個 Entry(條目)來分別描述這 4 個 Section 的具體信息(嚴(yán)格來說,不止 4 個 Entry,因?yàn)檫存在一些其他輔助的 Sections),就像下面這樣:

在開頭我就說了,我要用字節(jié)碼的粒度,扒開來給你看!

為了不耍流氓,我還是用一個具體的代碼示例來描述,只有這樣,你才能看到實(shí)實(shí)在在的字節(jié)碼。

程序的功能比較簡單:

// 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);

從剛才的描述中可以知道:動態(tài)庫文件 libmymath.so, 目標(biāo)文件 main.o 和 可執(zhí)行文件 main,它們都是 ELF 文件,只不過屬于不同的類型。

這里就以可執(zhí)行文件 main 來拆解它!

我們首先用指令 readelf -h(huán) main 來看一下 main 文件中,ELF header 的信息。

readelf 這個工具,可是一個好東西。∫欢ㄒ煤玫睦盟。

這張圖中顯示的信息,就是 ELF header 中描述的所有內(nèi)容了。這個內(nèi)容與結(jié)構(gòu)體 Elf32_Ehdr 中的成員變量是一一對應(yīng)的!

有沒有發(fā)現(xiàn)圖中第 15 行顯示的內(nèi)容:Size of this header: 52 (bytes)。

也就是說:ELF header 部分的內(nèi)容,一共是 52 個字節(jié)。那么我就把開頭的這 52 個字節(jié)碼給你看一下。

這回,我用 od -Ax -t x1 -N 52 main 這個指令來讀取 main 中的字節(jié)碼,簡單解釋一下其中的幾個選項(xiàng):

-Ax: 顯示地址的時候,用十六進(jìn)制來表示。如果使用 -Ad,意思就是用十進(jìn)制來顯示地址;

-t -x1: 顯示字節(jié)碼內(nèi)容的時候,使用十六進(jìn)制(x),每次顯示一個字節(jié)(1);

-N 52:只需要讀取 52 個字節(jié);

這 52 個字節(jié)的內(nèi)容,你可以對照上面的結(jié)構(gòu)體中每個字段來解釋了。

首先看一下前 16 個字節(jié)。

在結(jié)構(gòu)體中的第一個成員是 unsigned char e_ident[EI_NIDENT];,EI_NIDENT 的長度是 16,代表了 EL header 中的開始 16 個字節(jié),具體含義如下:

0 - 15 個字節(jié)

怎樣樣?我以這樣的方式徹底暴露自己,向你表白,足以表現(xiàn)出我的誠心了吧?!

如果被感動了,別忘記在文章的最底部,點(diǎn)擊一下在看和收藏,也非常感謝您轉(zhuǎn)發(fā)給身邊的小伙伴。贈人玫瑰,手留余香!

為了權(quán)威性,我把官方文檔對于這部分的解釋也貼給大家看一下:

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

那么再來看一下大端格式:

<上一頁  1  2  3  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評論

暫無評論

    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標(biāo)題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號