Sempre me perguntei como os arquivos binários executáveis realmente funcionam. A compilação é sempre declarada como
pegando o código-fonte e traduzindo-o para linguagem de máquina
Mas o que isso realmente significa? Nomeadamente:
- Posso mover um arquivo binário do computador A para o computador B e esperar que funcione? (assumindo que eu também movo as bibliotecas apropriadas)
- Todo arquivo binário executável é feito para funcionar com um processador específico?
- Que tipo de informação está dentro de um arquivo binário executável?
- Como é que os arquivos executáveis do Windows podem ser iniciados em qualquer versão do Windows? (É uma outra história se eles funcionarem)
- Por que não consigo executar um executável Linux no Windows? Isso tem a ver com o kernel (não com o processador)?
Lembre-se de que tenho conhecimento limitado em processadores e compiladores e nenhum em assembly.
Responder1
- Não necessariamente. Se for construído para portabilidade e as plataformas forem compatíveis, então sim (por exemplo, as edições de 64 bits do Windows são capazes de executar executáveis do Windows de 32 e 64 bits, mas não mais os de 16 bits).
- Não necessariamente. Eles são feitos para um conjunto de instruções específico. Como essas são normalmente extensões e há compatibilidade com versões anteriores, você pode executar arquivos mais antigos em processadores mais novos, mas não necessariamente o contrário. Por exemplo, um programa compilado para o Windows 95 provavelmente ainda será executado no hardware atual, mas você não pode executar um programa compilado para o hardware atual em uma máquina antiga com Windows 95. Entretanto, se duas máquinas executarem instruções completamente diferentes, os executáveis não serão compatíveis (por exemplo, Intel vs. ARM).
- Isso depende da plataforma, existem vários formatos com diferentes cabeçalhos e outras coisas, mas basicamente sempre há algum tipo de cabeçalho funcionando como índice, informando ao sistema operacional onde encontrar coisas específicas (como o ponto de entrada principal).
- Na verdade, eles não podem (veja o item 2 acima).
- Em primeiro lugar, o Windows e o Linux usam formatos diferentes para seus arquivos executáveis. Mas mesmo assim existem diferenças, por exemplo, todo o ambiente e APIs/bibliotecas da plataforma fornecida. Por exemplo, um executável do Linux normalmente tentaria se comunicar com um gerenciador de janelas como o X11, enquanto um programa do Windows tentaria chamar a API do Windows. No entanto, existem maneiras de fazer essas coisas funcionarem. Versões mais antigas do Windows (NT?) Na verdade tinham extensões POSIX para que você pudesse executar um conjunto limitado de programas Linux, até onde eu sei, embora eu nunca tenha tentado isso ou tenha olhado mais de perto. Por outro lado, para Linux existem ferramentas como o Wine, que tentarão emular o ambiente Windows, disponibilizando os arquivos API, conversões de caminhos, etc. Não é uma emulação completa (como no uso de uma máquina virtual).
Responder2
Somente sob circunstâncias muito controladas: Ambos os computadores devem ter processador e sistema operacional compatíveis.
Não é um processador específico, mas um conjunto de processadores compatíveis. Por exemplo, um arquivo compilado para compatibilidade com x86 e sem extensões funcionará em todos os processadores Intel ou AMD x86 ou x64, assumindo que o sistema operacional seja compatível.
Em primeiro lugar, o código de máquina da etapa de compilação. Além disso, algumas outras chamadas "seções" terão, por exemplo, recursos (já se perguntou por que um executável tem um ícone dedicado no Windows, mesmo que não esteja em execução, mas apenas mostrado no explorer), a descrição da compatibilidade binária e mais.
Este é um efeito colateral de 1.: Sempre que o sistema operacional fornecer compatibilidade com o formato executável, ele poderá ser iniciado. As versões modernas do Windows oferecem uma variedade de compatibilidade: DOS, Win16, Win32, Win64, dotnet são os mais importantes.
O SO fornece ao executável um ambiente indispensável para a execução. Esses ambientes diferem muito entre Linux e Windows. Isso significa que você não pode executar executáveis diretamente um do outro. Existem projetos em andamento para preencher essa lacuna: o projeto WINE visa permitir o lançamento de executáveis do Windows no Linux (e outros sistemas operacionais), enquanto o projeto Cygwin visa tornar possível a execução de software Linux no Windows. O Cygwin não visa compatibilidade binária, mas permite a recompilação de fontes não modificadas.
É importante entender que o executável (por exemplo, o .exe) énãoo resultado do processo de compilação - é o resultado dovinculandoprocesso, que combina o resultado da compilação com os outros ingredientes necessários para criar o que descrevi em 3.