「Program Loading」的議題在討論「如何將程式載入記憶體」,以便後續的「執行」。在「ELF(Executable and Linking Format)格式教學文件」第 1~8 篇文章裡,我們了解基本的 ELF 觀念,並建立所謂的「節區」知識。
本系列日記「ELF 之 Program Loading 教學文件」將會介紹有關程式載入(program loading)的核心主題,在此之前,請先閱讀 Jollen 的「Executable and Linking Format」專欄,以基本基礎的先備知識。
Segments
由 "execution view" 的角度來看程式(即 process),所謂的節區(section)已經被進化成區段(segment)的觀念了。廣義來說,section 可被分為以下 3 種 segment:
- Text segment - 指存放唯讀(read-only)程式碼與資料的所有 section 。
- Data segment - 指存放可寫(writable data)程式碼與資料的所有 section。
- BSS segment - 即 .bss section。
另外,還有一類的 segment:
- Dynamic segment - 用來存放 dynamic linking 資訊的 section。
不過,當我們講到「process segment」時,指的是 text segment、data segment 與 BSS segment;process address space 就是由這三種 segment 所構成。
Text segment 是由以下的 section 組成:
- .text
- .rodata
- .hash
- .dynsym
- .dynstr
- .plt
- .rel.got
Data segment 是由以下的 section 組成:
- .data
- .dynamic
- .got
- .bss
依照 SystemV ABI 規格,我們看到 .bss section 被放到 data segment 裡,但嚴格來說,我們應把 .bss section 另外獨立出來討論。基本的 .bss section 觀念,可參考 Jollen 的「」專欄。
此外,在 text segment 與 data segment 裡,包含了 4 個與 dynamic linking 有關的 section,整理如下圖。
與 dynamic linking 有關的 4 個 section 並非另外組成所謂的 dynamic segment,這只是我們在研究 dynamic linking 時邏輯上的用語。
到這裡,我們了解了一個相當重要的一個觀念:當程式載入後,是以 "segment" 的觀念存在於記憶體中,並且也是以 segment 的觀念被 Linux kernel 管理。ELF 執行檔被載入到記憶體的過程中,最重要的資訊就是前導專欄裡所提到的「Program Header Table」;就 ELF execution view 來說,program header table 是必要的,下篇日記會針對此議題做介紹。