Bash não sabe nada sobre ELF. Ele simplesmente vê que você pediu para executar um programa externo e, portanto, passa o nome que você deu como está execve(2)
. O conhecimento de coisas como formatos de arquivo executável, linhas de shebang e permissões de execução está por trás desse syscall , no kernel.
(É o mesmo para outras cascas, embora elas possam optar por usar outra função na exec(3)
família.)
Em Bash 4.3, isso acontece na linha 5195 de execute_cmd.c
na shell_execve()
função.
Se você deseja entender o Linux no nível do código-fonte, recomendo fazer o download de uma cópia do Research Unix V6 ou V7 e passar por isso em vez de toda a complexidade existente nos sistemas Linux modernos. O Livro Leonístico é um bom guia para o código.
V7 é onde a Bourne shell fez sua estréia. Todo o seu código-fonte C possui pouco mais da metade do tamanho daquele arquivo C no Bash. O shell Thompson na V6 é quase metade do tamanho do shell Bourne original. No entanto, essas duas conchas mais simples fazem o mesmo tipo de coisa que Bash, e pelo mesmo motivo. (Parece ser uma execv(2)
chamada do texec()
shell Thompson e uma execve()
chamada do módulo execs()
do shell Bourne service.c
.)