当我使用 Linux Box 时,我使用 bash 作为 shell。现在我想知道 bash 如何处理 ELF 文件的执行,即当我输入 ./program 时,program 是一个 ELF 文件。我 grep bash-4.3.tar.gz,似乎没有某种幻数解析器来查明该文件是否是 ELF,也没有找到 exec() 系统调用。
整个进程如何运作? bash 如何将 ELF 的执行传递给操作系统?
答案1
Bash 对 ELF 一无所知。它只是看到您要求它运行外部程序,因此它将您按原样指定的名称传递给execve(2)
。了解可执行文件格式等知识,舍邦线,并且执行权限位于其后面系统调用,在内核中。
(对于其他 shell 来说也是一样的,尽管它们可能会选择使用exec(3)
而是家人。)
在 Bash 4.3 中,这发生在第 5195 行execute_cmd.c
在shell_execve()
函数中。
如果你想从源代码层面了解Linux,我建议下载一份研究 Unix V6 或 V7,并经过那而不是现代 Linux 系统中的所有复杂性。狮子之书是很好的代码指南。
V7 是哪里伯恩外壳首次亮相。它的整个 C 源代码只是 Bash 中的一个 C 文件大小的一半多一点。这汤普森壳V6 中的大小几乎是原始 Bourne shell 的一半。然而,这两个更简单的 shell 都做与 Bash 相同的事情,并且出于相同的原因。 (这似乎是来自 Thompson shell 的execv(2)
调用和来自 Bourne shell 模块的调用。)texec()
execve()
execs()
service.c