Answers:
Bash对ELF一无所知。它只是看到您要求它运行一个外部程序,因此它将其原样传递给它execve(2)
。诸如可执行文件格式,shebang行和执行权限之类的知识都位于内核中的syscall后面。
(对于其他shell,这是相同的,尽管它们可能选择使用该exec(3)
系列中的另一个函数。)
在bash 4.3,这种情况对5195线execute_cmd.c
的shell_execve()
功能。
如果你想在源代码级一定要了解Linux,我建议下载的副本研究的Unix V6或V7,并通过去那,而不是所有的是现代的Linux系统的复杂性。狮子书是代码的良好指南。
V7是Bourne shell首次亮相的地方。它的整个C源代码只是Bash中一个C文件大小的一半多一点。V6中的Thompson外壳几乎是原始Bourne外壳的一半。但是,这两个较简单的Shell都执行与Bash相同的操作,并且出于相同的原因。(这似乎是execv(2)
来自texec()
Thompson shell的execve()
调用,而来自execs()
Bourne shell的service.c
模块的调用。)