ELF 可運行文件格式
ELF(Executable and Linkable Format)是一種用于可執行文件、目標文件、共享庫和核心轉儲文件的標準文件格式,被廣泛應用于類 Unix 系統,如 Linux 等。下面將詳細解析 ELF 格式文件的結構和組成部分。
ELF 文件的總體結構
ELF 文件主要由以下幾個部分組成:
- ELF 頭部(ELF Header):包含文件的基本信息,如文件類型、目標架構、入口地址等,用于標識文件是否為 ELF 文件以及文件的基本屬性。
- 程序頭表(Program Header Table):可選部分,主要用于描述可執行文件或共享庫在內存中的布局,包含了如何將文件加載到內存中的信息。
- 節頭表(Section Header Table):可選部分,描述了文件中各個節(Section)的信息,節是文件中具有特定用途的數據塊,如代碼節、數據節等。
- 節(Sections):文件中實際的數據塊,包含了程序的代碼、數據、符號表、重定位信息等。
ELF 頭部(ELF Header)
ELF 頭部位于文件的起始位置,通常大小為 52 字節(32 位系統)或 64 字節(64 位系統)。以下是一些重要字段的解釋:
- 魔數(Magic Number):用于標識文件是否為 ELF 文件,通常為
0x7F 'E' 'L' 'F'。 - 文件類(File Class):指定文件是 32 位還是 64 位,值為
ELFCLASS32或ELFCLASS64。 - 數據編碼(Data Encoding):指定文件使用的字節序,值為
ELFDATA2LSB(小端序)或ELFDATA2MSB(大端序)。 - 文件類型(File Type):指定文件的類型,如可重定位文件(
ET_REL)、可執行文件(ET_EXEC)、共享目標文件(ET_DYN)等。 - 目標架構(Machine):指定文件所針對的目標架構,如
EM_X86_64(x86-64 架構)、EM_ARM(ARM 架構)等。 - 入口地址(Entry Point):指定程序的入口點地址,即程序開始執行的地址。
程序頭表(Program Header Table)
程序頭表是一個數組,每個元素稱為一個程序頭(Program Header),描述了可執行文件或共享庫在內存中的一個段(Segment)。常見的程序頭類型包括:
- PT_LOAD:表示需要加載到內存中的段,包含了代碼和數據。
- PT_DYNAMIC:表示動態鏈接信息。
- PT_INTERP:表示程序解釋器的路徑,通常用于動態鏈接的可執行文件。
每個程序頭包含以下重要字段:
- 類型(Type):指定段的類型。
- 偏移量(Offset):指定段在文件中的偏移量。
- 虛擬地址(Virtual Address):指定段在內存中的虛擬地址。
- 文件大小(File Size):指定段在文件中的大小。
- 內存大小(Memory Size):指定段在內存中的大小。
節頭表(Section Header Table)
節頭表也是一個數組,每個元素稱為一個節頭(Section Header),描述了文件中一個節的信息。常見的節類型包括:
- .text:代碼節,包含程序的指令。
- .data:已初始化的數據節,包含已初始化的全局變量和靜態變量。
- .bss:未初始化的數據節,包含未初始化的全局變量和靜態變量。
- .symtab:符號表,包含程序中定義和引用的符號信息。
- .rel.text:代碼節的重定位信息。
- .rel.data:數據節的重定位信息。
每個節頭包含以下重要字段:
- 名稱(Name):指定節的名稱。
- 類型(Type):指定節的類型。
- 標志(Flags):指定節的屬性,如可執行、可寫等。
- 地址(Address):指定節在內存中的地址。
- 偏移量(Offset):指定節在文件中的偏移量。
- 大小(Size):指定節的大小。
節(Sections)
節是文件中實際的數據塊,根據節頭表的描述進行組織。不同的節包含不同類型的數據,例如:
- .text 節:包含程序的機器指令,通常是只讀和可執行的。
- .data 節:包含已初始化的全局變量和靜態變量,通常是可讀寫的。
- .bss 節:不占用文件空間,只在內存中分配空間,用于存儲未初始化的全局變量和靜態變量。
- .symtab 節:包含程序中定義和引用的符號信息,如函數名、變量名等。
- .rel.text 和 .rel.data 節:包含重定位信息,用于在鏈接和加載時調整符號的地址。
使用工具解析 ELF 文件
在 Linux 系統中,可以使用以下工具來解析 ELF 文件:
- readelf:用于顯示 ELF 文件的詳細信息,包括 ELF 頭部、程序頭表、節頭表等。例如,使用
readelf -h命令可以顯示 ELF 文件的頭部信息:
readelf -h /bin/ls
- objdump:用于反匯編 ELF 文件,顯示程序的機器指令和符號信息。例如,使用
objdump -d命令可以反匯編 ELF 文件的代碼節:
objdump -d /bin/ls
通過以上工具,可以深入了解 ELF 文件的結構和內容,對于開發、調試和分析程序都非常有幫助。


浙公網安備 33010602011771號