小結 Program Loading 觀念

jollen 發表於 March 23, 2007 10:56 AM

由「Program Loading」專欄所得到的觀念如下。

外部程式(stored program)的執行是透過 fork system call,先將 current process 複製一份成為他的 child process。接著再透過 exec system call 將外部程式的 ELF image 載入,並取代原來的 process。Kernel ELF loader 會讀取 ELF image,並將 text segment 與 data segment 重新 mapping,接著再找到程式的 program interpreter。

外部程式的最初執行是由 program interpreter 開始,program interpreter 透過 dynamic segment 完成 dynamic linking,此時完整的 process image 已建立完成;program interpreter 再跳到程式的進入點,也就是 C run-time library(crt?.o)。

以上二段文字說明了 program loading 的核心觀念,每一句子觀念都能做出一份不算短的分析報告;此階段只整理出 program loading 的主要重點,接著再把「dynamic linking」的主要觀念做研究後,大家應該就可以大致掌握「程式執行」的系統行為了。

另外,補充 program interpreter 的幾個觀念:

  • program interpreter(ld.so)的存在形式有 shared object 與獨立執行檔二種。
  • 當 program interpreter 是以獨立執行檔執行時,表示將 program interpreter 當成 dynamic loader/linker 來使用;通常是經由使用者直接下指令的方式來執行,program interpreter 在發展與測試階段時也使用這種方式。
  • 當 program interpreter 是以 shared object 形式存在時,表示 program interpreter 是經由 kernel 來取得控制權;這種方式是將 program interpreter 當成 dynamic linker 來使用,這是較常見的做法。

以下是將 program interpreter 當做獨立執行檔的使用範例:

$ ldd hello
        libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$ /lib/ld-linux.so.2 ./hello
Hello, World!

關於 program loading 的分享到此做個小結,接下來將會整理有關 dynamic linking 的日記。

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

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