Bash
bash 如何執行 ELF 文件?
當我在我的 Linux Box 上時,我使用 bash 作為 shell。現在我想知道 bash 如何處理 ELF 文件的執行,即當我鍵入 ./program 並且 program 是 ELF 文件時。我 grepped bash-4.3.tar.gz,似乎沒有某種幻數解析器來確定文件是否是 ELF,也沒有找到 exec() 系統呼叫。
整個程序如何運作?bash 如何將 ELF 的執行傳遞給作業系統?
Bash 對 ELF 一無所知。它只是看到你要求它執行一個外部程序,所以它把你給它的名字按原樣傳遞給
execve(2)
. 諸如執行檔格式、shebang 行和執行權限之類的知識存在於核心中的系統呼叫後面。(其他 shell 也是如此,儘管他們可能會選擇使用該
exec(3)
系列中的另一個功能。)在 Bash 4.3 中,這發生在函式的第 5195
execute_cmd.c
行shell_execve()
。如果您想從原始碼級別了解 Linux,我建議您下載Research Unix V6 或 V7的副本,然後仔細閱讀*,*而不是現代 Linux 系統中的所有復雜性。Lions Book是一本很好的程式碼指南。
V7 是Bourne shell首次亮相的地方。它的整個 C 原始碼只是 Bash 中一個 C 文件大小的一半多一點。V6 中的Thompson shell的大小幾乎是原始 Bourne shell 的一半。然而,這兩個更簡單的 shell 都與 Bash 做同樣的事情,並且出於同樣的原因。(這似乎是
execv(2)
來自texec()
Thompson shell 的execve()
呼叫和來自execs()
Bourne shellservice.c
模組的呼叫。)