Que registradores devem instalar o carregador executável antes de iniciar um programa?

5

Por exemplo, eu tenho programa C simples que tem apenas a função main que apenas retorna 0. O que registra o loader (eu executo o carregador exec do Linux) instalar antes de iniciar um programa? Não encontrei informações sobre isso, exceto o registro de ponteiro da pilha.

    
por YourJest 24.01.2018 / 05:23
fonte

1 resposta

5

Essa funcionalidade que você atribui ao carregador é geralmente chamada de crt0 ou crt0.o. Geralmente tem um ponto de entrada chamado __start , que o sistema operacional irá transferir o controle inicial para.

É parte do código básico da biblioteca C e assume o controle do novo processo, para finalmente invocar seu main . Dependendo do ambiente em que é executado, ele pode ter que abrir stdin & stdout e colete os parâmetros da linha de comando em um array argv para passar para o seu main. Inicialmente, como você suspeitar, ele pode estabelecer o registro de ponteiro de pilha, no entanto, isso pode ser feito já por exec, dependendo do curso. Ele também pode estabelecer um ponteiro de dados (global) novamente dependendo da arquitetura (se usar um) e do sistema operacional (se já fez isso ou não).

Como o C main é uma função C 100% normal, os argumentos serão passados para ele usando a mesma convenção de chamada e o uso de registro como a maioria das outras funções com a mesma assinatura. A convenção de chamadas varia em diferentes compiladores e sistemas operacionais, então uma boa aposta é descompilar seu C main e ver como ele acessa são parâmetros.

    
por 24.01.2018 / 06:13
fonte