Como o bash executa um arquivo ELF?

8

Quando estou no meu Linux Box, uso o bash como um shell. Agora eu me perguntava como o bash lida com a execução de um arquivo ELF, ou seja, quando digito ./program e program é um arquivo ELF. Pesquisei 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 sistema operacional?

JohnnyFromBF
fonte

Respostas:

15

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

Warren Young
fonte