典型的ELF可重定位目標檔案

來源:互聯網
上載者:User

夾在ELF頭節頭部表之間的都是節。一個典型的ELF可重定位目標檔案包含下面幾個節:

  • .text:已編譯器的機器代碼。
  • .rodata:唯讀資料,比如printf語句中的格式串和開關(switch)語句的跳轉表。
  • .data:已初始化的全域C變數。局部C變數在運行時被儲存在棧中,既不出現在.data中,也不出現在.bss節中。
  • .bss:未初始化的全域C變數。在目標檔案中這個節不佔據實際的空間,它僅僅是一個預留位置。目標檔案格式區分初始化未初始化變數是為了空間效率在:在目標檔案中,未初始設定變數不需要佔據任何實際的磁碟空間。
  • .symtab:一個符號表(symbol table),它存放在程式中被定義和引用的函數和全域變數的資訊。一些程式員錯誤地認為必須通過-g選項來編譯一個程式,得到符號表資訊。實際上,每個可重定位目標檔案在.symtab中都有一張符號表。然而,和編譯器中的符號表不同,.symtab符號表不包含局部變數的表目。
  • .rel.text:當連結噐把這個目標檔案和其他檔案結合時,.text節中的許多位置都需要修改。一般而言,任何調用外部函數或者引用全域變數的指令都需要修改。另一方面調用本地函數的指令則不需要修改。注意,可執行目標檔案中並不需要重定位資訊,因此通常省略,除非使用者顯式地指示連結器包含這些資訊。
  • .rel.data:被模組定義或引用的任何全域變數的資訊。一般而言,任何已初始化全域變數的初始值是全域變數或者外部定義函數的地址都需要被修改。
  • .debug:一個偵錯符號表,其有些表目是程式中定義的局部變數和類型定義,有些表目是程式中定義和引用的全域變數,有些是原始的C源檔案。只有以-g選項調用編譯驅動程式時,才會得到這張表。
  • .line:原始C來源程式中的行號和.text節中機器指令之間的映射。只有以-g選項調用編譯驅動程式時,才會得到這張表。
  • .strtab:一個字串表,其內容包括.symtab和.debug節中的符號表,以及節頭部中的節名字。字串表就是以null結尾的字串序列。

旁註:為什麼未初始化的資料稱為.bss?

        用術語.bss來表示未初始化的資料是很普遍的。它起始於IBM 704組合語言(大約在1957年)中”Block Storage開始(Block Storage Start)“指令的首字母縮寫,並沿用至今。一個記住區分.data和.bss節的簡單方法是把“bss”看成是“更好地節省空間的(Better Save Space)!“的縮寫。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.