Bash não sabe nada sobre o ELF. Ele simplesmente vê que você pediu para executar um programa externo, então ele passa o nome que você deu como é para execve(2)
. Conhecimento de coisas como formatos de arquivo executáveis, linhas shebang , e executar permissões de vida por trás dessa syscall , no kernel.
(É o mesmo para outros shells, embora eles possam optar por usar outra função no exec(3)
família.)
No Bash 4.3, isso acontece na linha 5195 do execute_cmd.c
na função shell_execve()
.
Se você quiser entender o Linux no nível do código-fonte, recomendo fazer o download de uma cópia do Pesquise Unix V6 ou V7 , e passe por isso ao invés de toda a complexidade que está nos sistemas Linux modernos. O livro do Lions é um bom guia para o código.
V7 é onde o Bourne shell fez sua estréia. Seu código-fonte C inteiro é um pouco mais da metade do tamanho daquele arquivo C no Bash. O shell Thompson da V6 tem quase a metade do tamanho do shell Bourne original. No entanto, ambos os shells mais simples fazem o mesmo tipo de coisa que o Bash, e pela mesma razão. (Parece ser uma chamada execv(2)
de texec()
no shell Thompson e uma chamada execve()
de execs()
no módulo service.c
do shell Bourne.)