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,可在程式執行時動態載入到任意記憶體位址,讓多個程式共用同一份 printfmalloc 等常用函數的程式碼。

會在被需要使用的時候載入到 heap 和 stack 之間 (mmap region)

Structure

D-SP-Ch7ba-ELF_Structure

Relocating Object Files