• 訂閱
    糾錯
    加入自媒體

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

    2021-05-25 17:44
    道哥分享
    關注

    初次見面

    大家好,我是 ELF 文件,大名叫 Executable and Linkable Format。

    經常在 Linux 系統(tǒng)中開發(fā)的小伙伴們,對于我肯定是再熟悉不過了,特別是那些需要了解編譯、鏈接的家伙們,估計已經把我研究的透透的。

    為了結識更多的小伙伴,今天呢,就是我的開放日,我會像洋蔥一樣,一層一層地撥開我的心,讓更多的小伙伴來了解我,歡迎大家前來圍觀。

    以前啊,我看到有些小伙伴在研究我的時候,看一下頭部的匯總信息,然后再瞅幾眼 Section 的布局,就當做熟悉我了。

    從科學的態(tài)度上來說,這是遠遠不夠的,未達究竟。

    當你面對編譯、鏈接的詳細過程時,還是會一臉懵逼。

    今天,我會從字節(jié)碼的顆粒度,毫無保留、開誠布公、知無不言、言無不盡、赤膽忠心、一片丹心、鞠躬盡瘁、死而后已的把自己剖析一遍,讓各位看官大開眼界、大飽眼福。

    您了解這些知識之后呢,在今后繼續(xù)學習編譯、鏈接的底層過程,以及一個可執(zhí)行程序在從硬盤加載到內存、一直到 main 函數的執(zhí)行,心中就會非常的敞亮。

    也就是說,掌握了 ELF 文件的結構和內容,是理解編譯、鏈接和程序執(zhí)行的基礎。

    你們不是有一句俗話嘛:磨刀不誤砍柴工!

    好了,下面我們就開始吧!

    文件很單純,復雜的是人

    作為一種文件,那么肯定就需要遵守一定的格式,我也不例外。

    從宏觀上看,可以把我拆卸成四個部分:

    圖中的這幾個概念,如果不明白的話也沒關系,下面我會逐個說明的。

    在 Linux 系統(tǒng)中,一個 ELF 文件主要用來表示 3 種類型的文件:

    既然可以用來表示 3 種類型的文件,那么在文件中,肯定有一個地方用來區(qū)分這 3 種情況。

    也許你已經猜到了,在我的頭部內容中,就存在一個字段,用來表示:當前這個 ELF 文件,它到底是一個可執(zhí)行文件?是一個目標文件?還是一個共享庫文件?

    另外,既然我可以用來表示 3 種類型的文件,那么就肯定是在 3 種不同的場合下被使用,或者說被不同的家伙來操作我:

    可執(zhí)行文件:被操作系統(tǒng)中的加載器從硬盤上讀取,載入到內存中去執(zhí)行;

    目標文件:被鏈接器讀取,用來產生一個可執(zhí)行文件或者共享庫文件;

    共享庫文件:在動態(tài)鏈接的時候,由 ld-linux.so 來讀;

    就拿鏈接器和加載器來說吧,這兩個家伙的性格是不一樣的,它們看我的眼光也是不一樣的。

    鏈接器在看我的時候,它的眼睛里只有 3 部分內容:

    也就是說,鏈接器只關心 ELF header, Sections 以及 Section header table 這 3 部分內容。

    加載器在看我的時候,它的眼睛里是另外的 3 部分內容:

    加載器只關心 ELF header, Program header table 和 Segment 這 3 部分內容。

    對了,從加載器的角度看,對于中間部分的 Sections, 它改了個名字,叫做 Segments(段)。換湯不換藥,本質上都是一樣一樣的。

    可以理解為:一個 Segment 可能包含一個或者多個 Sections,就像下面這樣:

    這就好比超市里的貨架上擺放的商品:有礦泉水、可樂、啤酒,巧克力,牛肉干,薯片。

    從理貨員的角度看:它們屬于 6 種不同的商品;但是從超市經理的角度看,它們只屬于 2 類商品:飲料和零食。

    怎么樣?現在對我已經有一個總體的印象了吧?

    其實只要掌握到 2 點內容就可以了:

    一個 ELF 文件一共由 4 個部分組成;

    鏈接器和加載器,它們在使用我的時候,只會使用它們感興趣的部分;

    還有一點差點忘記給你提個醒了:在 Linux 系統(tǒng)中,會有不同的數據結構來描述上面所說的每部分內容。

    我知道有些小伙伴比較性急,我先把這幾個結構體告訴你。

    初次見面,先認識一下即可,千萬不要深究哦。

    描述 ELF header 的結構體:

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

    發(fā)表評論

    0條評論,0人參與

    請輸入評論內容...

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

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

    暫無評論

    暫無評論

      掃碼關注公眾號
      OFweek人工智能網
      獲取更多精彩內容
      文章糾錯
      x
      *文字標題:
      *糾錯內容:
      聯系郵箱:
      *驗 證 碼:

      粵公網安備 44030502002758號