夾在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)!“的縮寫。