由「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 當做獨立執行檔的使用範例:
$ 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