Como os arquivos binários são executados em máquinas diferentes? [fechadas]

1

Eu sempre quis saber como os arquivos binários executáveis realmente funcionam. A compilação é sempre declarada como

taking the source code and translating it to machine language

Mas o que isso realmente significa? A saber:

  1. Posso mover um arquivo binário do computador A para o computador B e esperar trabalhar? (assumindo que também movo as bibliotecas apropriadas)
  2. Todo arquivo binário executável é feito para funcionar com um processador?
  3. Que tipo de informação está dentro de um arquivo binário executável?
  4. Como é possível iniciar arquivos executáveis no Windows em qualquer versão do Windows? (É uma outra história, se eles funcionam)
  5. Por que não posso executar um executável do Linux no Windows? Tem que fazer com o kernel (então não o processador)?

Lembre-se de que tenho conhecimento limitado sobre processadores e compiladores e nenhum em assembly.

    
por Pithikos 25.07.2014 / 11:29

2 respostas

1

  1. 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 podem executar executáveis do Windows de 32 e 64 bits, mas não de 16 bits).
  2. Não necessariamente. Eles são feitos para um conjunto de instruções específico. Como essas são tipicamente extensões e há compatibilidade com versões anteriores, você pode executar arquivos mais antigos em processadores mais recentes, 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 Windows 95 antiga. No entanto, se duas máquinas executarem instruções completamente diferentes, os executáveis não serão compatíveis (por exemplo, Intel vs. ARM).
  3. Isto depende da plataforma, existem vários formatos com cabeçalhos e coisas diferentes, mas basicamente há sempre algum tipo de cabeçalho funcionando como um índice, dizendo ao sistema operacional onde encontrar coisas específicas (como o ponto de entrada principal). / li>
  4. Eles na verdade não podem (ver # 2 acima).
  5. Antes de mais nada, 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 a API / bibliotecas da plataforma fornecidas. Por exemplo, um executável do Linux normalmente tentaria falar 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 com que essas coisas funcionem. Versões mais antigas do Windows (NT?) Na verdade possuíam extensões POSIX para que você pudesse executar um conjunto limitado de programas Linux até onde eu saiba, embora eu nunca tenha realmente tentado isso ou tenha visto mais de perto. Por outro lado, para o Linux existem ferramentas como o Wine, que tentará emular o ambiente Windows, fornecendo os arquivos de API, conversões de caminho, etc. Não há emulação completa (como no uso de uma máquina virtual).
por 25.07.2014 / 11:54
1
  1. Apenas sob circunstâncias muito controladas: Ambos os computadores devem ter um processador e sistema operacional compatíveis.

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

  3. Em primeiro lugar, o código da máquina a partir da etapa de compilação. Para além disso, algumas outras "secções" terão, e. recursos (já se perguntou, porque 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 muito mais.

  4. Este é um efeito colateral de 1 .: sempre que o sistema operacional fornece compatibilidade com o formato executável, ele pode ser iniciado. As versões modernas do Windows fornecem uma variedade de compatibilidade: DOS, Win16, Win32, Win64, dotnet são os mais importantes.

  5. O SO fornece ao executável um ambiente indispensável para a execução. Esses ambientes são muito diferentes entre o Linux e o Windows. Isso significa que você não pode executar diretamente executáveis de um no outro. Existem projetos em andamento para colmatar esta lacuna: O projeto WINE tem como objetivo permitir o lançamento de executáveis do Windows no Linux (e outros sistemas operacionais), enquanto o projeto Cygwin visa tornar possível rodar o software Linux no Windows. O Cygwin não aponta para compatibilidade binária, mas para permitir a recompilação de uma fonte não modificada.

É importante entender que o executável (por exemplo, o .exe) é não o resultado do processo de compilação - é o resultado do processo linking , que combina a saída da compilação com os outros ingredientes necessários para criar o que eu descrevi em 3.

    
por 25.07.2014 / 11:55