Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

UNIX/Linux 執行檔格式演進史:a.out、COFF、ELF 深度對比

編輯:Linux 教學

三大格式演進脈絡

格式全稱時代關鍵特性
a.outAssembler and Link Editor Output早期 UNIX簡單、固定區段、無動態連結支援
COFFCommon Object File FormatSystem V UNIX引入區段表、支援更多區段、擴展性強
ELFExecutable and Linking Format現代標準 (SVR4, Linux, BSD)靈活區段、完整動態連結、跨平台、可擴展

ELF 載入流程核心

  1. 核心讀取 ELF 標頭,驗證魔數、架構、入口點
  2. 解析程式標頭表,載入 PT_LOAD 區段到記憶體
  3. 處理 PT_INTERP 載入動態連結器
  4. 建立堆疊環境,傳遞參數給動態連結器
  5. 動態連結器解析 .dynamic 區段,載入依賴庫
  6. 執行重定位 (Lazy/Now Binding)
  7. 執行 .init_array / .init 初始化
  8. 跳轉入口點 (_start → __libc_start_main → main)
  9. 三格式詳細對比

    a.out 格式

    • 固定標頭:exec 結構體
    • 固定區段:text、data、bss
    • 無區段表,擴展性極差
    • 符號表格式簡單,不支援動態連結

    COFF 格式

    • 檔案標頭 + 選擇性標頭 + 區段表
    • 選擇性標頭 (COFF_AOUTHDR) 包含:magic(0x107)、入口點、text/data/bss 基址
    • 區段表 (COFF_SCNHDR):名稱、虛擬/物理地址、大小、重定位/行號資訊
    • Linux 下選擇性標頭必須存在,magic=0413 表示可執行
    • 支援擴展:XCOFF (AIX)、ECOFF (MIPS)

    ELF 格式優勢

    • 雙重視圖:連結視圖 (區段表) + 執行視圖 (程式標頭表)
    • 區段屬性豐富:類型、標誌、地址、對齊、實體大小
    • 動態連結完整支援:.dynamic、.dynsym、.got/.plt
    • 跨架構支援:32/64位、大小端、多架構統一格式
    • 可擴展性:新區段類型、標誌位持續擴展

    ELF 標頭關鍵結構

    typedef struct {
        unsigned char e_ident[16];  // 魔數、類別、資料編碼、版本
        Elf32_Half    e_type;       // ET_EXEC, ET_DYN, ET_DYN...
        Elf32_Half    e_machine;    // EM_386, EM_X86_64, EM_ARM...
        Elf32_Word    e_version;    // EV_CURRENT
        Elf32_Addr    e_entry;      // 入口點虛擬地址
        Elf32_Off     e_phoff;      // 程式標頭表偏移
        Elf32_Off     e_shoff;      // 區段標頭表偏移
        Elf32_Word    e_flags;      // 處理器特定旗標
        Elf32_Half    e_ehsize;     // ELF 標頭大小
        Elf32_Half    e_phentsize;  // 程式標頭項大小
        Elf32_Half    e_phnum;      // 程式標頭項數
        Elf32_Half    e_shentsize;  // 區段標頭項大小
        Elf32_Half    e_shnum;      // 區段標頭項數
        Elf32_Half    e_shstrndx;   // 區段名字串表索引
    } Elf32_Ehdr;

    關鍵區段對比表

    功能a.outCOFFELF
    程式碼區段.text.text.text (SHT_PROGBITS, SHF_ALLOC|SHF_EXECINSTR)
    初始化資料.data.data.data (SHT_PROGBITS, SHF_ALLOC|SHF_WRITE)
    未初始化資料.bss.bss.bss (SHT_NOBITS, SHF_ALLOC|SHF_WRITE)
    符號表固定格式符號表區段.symtab/.dynsym (SHT_SYMTAB/DYNSYM)
    重定位資訊固定格式重定位區段.rela.* (SHT_RELA)
    動態連結資訊不支援需擴展 (XCOFF).dynamic, .dynsym, .got, .plt
    區段表無有 (固定格式)靈活區段表 (SHT_*)

    總結

    ELF 以靈活的區段架構、完整的動態連結支援、跨平台能力成為現代標準。區段表的引入是 COFF 相對 a.out 最大突破,ELF 進一步將區段機制一般化、標準化,實現連結視圖與執行視圖分離,成為現代系統軟體基礎設施基石。

Copyright © Windows教程網 All Rights Reserved