Como o bash executa um arquivo ELF?

6

Quando estou no meu Linux Box eu uso o bash como um shell. Agora me perguntei como o bash manipula a execução de um arquivo ELF, ou seja, quando eu digito ./program e program é um arquivo ELF. Eu grepped o bash-4.3.tar.gz, não parece haver algum tipo de analisador de número mágico para descobrir se o arquivo é um ELF nem encontrei um syscall exec ().

Como funciona o processo? Como o bash passa a execução do ELF para o SO?

    
por JohnnyFromBF 24.08.2014 / 09:23

1 resposta

10

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.)

    
por 24.08.2014 / 09:35