ELF 之 Program Loading 教學文件, #1: Segment 的觀念

jollen 發表於 March 5, 2007 12:05 PM

「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 的「BSS Section Concepts」專欄。

此外,在 text segment 與 data segment 裡,包含了 4 個與 dynamic linking 有關的 section,整理如下圖。

dynamic_linking_sections.JPG

與 dynamic linking 有關的 4 個 section 並非另外組成所謂的 dynamic segment,這只是我們在研究 dynamic linking 時邏輯上的用語。

到這裡,我們了解了一個相當重要的一個觀念:當程式載入後,是以 "segment" 的觀念存在於記憶體中,並且也是以 segment 的觀念被 Linux kernel 管理。ELF 執行檔被載入到記憶體的過程中,最重要的資訊就是前導專欄裡所提到的「Program Header Table」;就 ELF execution view 來說,program header table 是必要的,下篇日記會針對此議題做介紹。

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw