Executable and Linkable Format (ELF)
Introduction
Executable and Linkable Format (ELF) 是 Unix 和類 Unix 系統(包括 Linux)中使用的標準二進制檔案格式。它定義了可執行檔、目的檔(object files)、共享函式庫和 core dumps 的結構
Types
Relocatable Object Files (.o)
Relocatable object file 是編譯器編譯單一原始碼後產生的 .o 檔,包含機器碼但無法直接執行。原因是其中的符號引用(如外部函數、全域變數)尚未解析,且使用的是相對位址而非絕對位址,因此稱為「relocatable」。連結器會將多個這類檔案組合,解析符號並分配記憶體位址後,才能產生可執行檔。
其中定義的函數會被完整的複製一份到 executable object file 中
Executable Object Files
Executable object file 是最終可執行的程式檔案(Linux 無特定副檔名,Windows 為 .exe),由連結器整合多個 relocatable object files 和函式庫而成。所有符號引用已完成解析,程式碼和資料都配置在固定的虛擬記憶體位址,作業系統可直接載入執行。
Shared Object Files (.so)
Shared object file 是可供多個程式共享的特殊檔案(Linux 為 .so,Windows 為 .dll),用來避免每個程式都包含相同函式庫造成空間浪費。它採用 position-independent code,可在程式執行時動態載入到任意記憶體位址,讓多個程式共用同一份 printf、malloc 等常用函數的程式碼。
會在被需要使用的時候載入到 heap 和 stack 之間 (mmap region)
Structure
Relocating Object Files
