Joh*_*mBF 8 bash kernel executable elf exec
当我在 Linux Box 上时,我使用 bash 作为 shell。现在我想知道 bash 如何处理 ELF 文件的执行,即当我输入 ./program 并且 program 是一个 ELF 文件时。我搜索了 bash-4.3.tar.gz,似乎没有某种幻数解析器来确定文件是否为 ELF,也没有找到 exec() 系统调用。
整个进程如何运作?bash 如何将 ELF 的执行传递给操作系统?
War*_*ung 16
Bash 对 ELF 一无所知。它只是看到您要求它运行一个外部程序,因此它将您给它的名称按原样传递给execve(2)。诸如可执行文件格式、shebang 行和执行权限之类的知识存在于内核中的syscall后面。
(其他 shell 也是如此,尽管它们可能会选择使用exec(3)家族中的另一个函数。)
在 Bash 4.3 中,这发生在函数execute_cmd.c中的第 5195 行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模块的调用。)