Por que uma especificação de formato binário é necessária para arquivos executáveis?

Por que uma especificação de formato binário é necessária para arquivos executáveis?

Entendo que um sistema operacional como Linux ou Windows é escrito em C/C++ e compilado para uma determinada arquitetura (por exemplo, AMD64) para produzir um código de máquina adequado para essa arquitetura.

Minhas perguntas -

  1. Por que uma especificação separada é necessária para o código binário - o Linux usa ELF e o Windows usa o Portable Executable Format?
  2. Um sistema operacional e um programa executado nesse sistema operacional podem ser criados sem essa especificação de formato binário?
  3. O formato binário é: dependente da arquitetura, do sistema operacional ou de ambos?
  4. O formato binário é aplicável apenas a arquivos executáveis ​​ou também ao código do sistema operacional?

Responder1

Como você deve ter adivinhado, os formatos executáveis ​​contêm mais do que apenas código de máquina. Por exemplo, eles podem:

  • Especifique os metadados do sistema operacional, por exemplo, para qual arquitetura o executável se destina. Esses metadados compreendem ocabeçalhodo arquivo.

  • Especifique o programalayoutem memória. Nos sistemas operacionais modernos, a maioria dos executáveis ​​não são carregados na memória em um único bloco - eles geralmente têm muitos arquivos separados.regiões/Seções/segmentos. Alguns desses segmentos conterão código executável. Alguns deles conterão dados imutáveis, como strings de texto. Alguns deles serão designados como memória gravável, para o(s) heap(s) do programa.

    Diferentes programas terão diferentes requisitos (solicitações) para o tamanho dessas seções. Tudo isso está especificado no cabeçalho.

  • Alguns formatos também permitirão que você incorpore umassinatura digital, que permite verificar de onde veio o binário.


  1. Por que uma especificação separada é necessária para o código binário - o Linux usa ELF e o Windows usa o Portable Executable Format?

As razões são principalmente históricas, e os sistemas operacionais tendem a manter seu formato 'nativo' (ou 'padrão') existente, a menos que haja uma razão convincente para mudar (como aconteceu, por exemplo, do formato DOS MZ para PE no NT 3.1, e de um formato DOS MZ para PE no NT 3.1, e de um .out para ELF no Linux 1.2, e de COFF para ELF em vários Unixes ao longo dos anos).

Deve-se notar que o código de máquina subjacente depende da arquitetura da CPU, mas é, por outro lado (syscalls e bibliotecas vinculadas à parte) amplamente portátil entre sistemas operacionais. Na verdade, o Windows e o Linux modernos podem executar ambos os formatos executáveis: os executáveis ​​ELF serão executados no Windows via WSL e os executáveis ​​PE serão executados no Linux via WINE.

  1. Um sistema operacional e um programa executado nesse sistema operacional podem ser criados sem essa especificação de formato binário?

Voltamos ao objetivo principal desses formatos. Sem os metadados informando ao sistema operacional onde carregar partes do programa, a maioria dos executáveis ​​modernos não pode ser executada. Alguns formatos muito antigos comoCOMpraticamente contêm código puro, mas não são particularmente flexíveis e caíram em desuso.

Na prática, não há necessidade de existir um sistema operacional. No nível do hardware, assumindo a existência de um BIOS (legado),o BIOS simplesmente começará a ser executado em um local específico do disco (MBR), que pode ser um código de máquina arbitrário que então assume o controle e inicia um sistema operacional ou faz qualquer outra coisa que desejar. (Você poderia ver o próprio MBR como um formato binário, embora não esteja diretamente relacionado ao código executável.) O UEFI mais moderno, entretanto, especifica um formato executável (PE) mais complexo.

  1. A arquitetura do formato binário depende do sistema operacional ou de ambos?

Depende do formato, na verdade. Alguns formatos assumem uma arquitetura específica. Outros permitem que você selecione a arquitetura em uma lista de "números mágicos" especificados no cabeçalho. Outros ainda são completamente independentes de arquitetura (por exemplo, bytecode Java e .NET/CIL).

Da mesma forma, o formato geralmente não impõe nenhuma restrição ao sistema operacional, embora o sistema operacional seja restrito em quais formatos ele pode reconhecer e executar (nativamente). É claro que as camadas de compatibilidade no topo do sistema operacional principal podem executar outros formatos (por exemplo, JVM, .NET/CLR, WSL&WINE, etc.) que o sistema operacional principal pode não reconhecer.

  1. O formato binário é aplicável apenas a arquivos executáveis ​​ou também ao código do sistema operacional?

Uma grande parte da maioria dos sistemas operacionais modernos é apenas uma coleção de arquivos executáveis ​​“normais”. No entanto, algumas partes do sistema operacional são “especiais” e não usarão necessariamente o mesmo formato que as demais. Normalmente, isso se aplica apenas ao bootloader e ao kernel.

Para obter um exemplo específico e muito comum, o bootloader legado do BIOS iránãoestar nos formatos ELF ou PE usados ​​pelo Linux e Windows. O kernel do Linux geralmente é construído em umFormato derivado de ELFque o gerenciador de inicialização GRUBpode carregar, mas pode estar em um formato diferente para ser compatível com o bootloader usado. O kernel Linux também suporta umEsboço EFImodo, que contém um cabeçalho PE/COFF mínimo para ser compatível com inicialização UEFI direta.

Responder2

A principal utilização do formato é carregar programas na memória, o que é feito por umcarregador.

  1. Por que uma especificação separada é necessária para o código binário - o Linux usa ELF e o Windows usa o Portable Execution Format?

Resposta educada: porque o sistema operacional é diferente e tem requisitos diferentes. Resposta do Unix: porque a Microsoft gosta de reinventar a roda (quadrada).

  1. Um sistema operacional e um programa executado nesse sistema operacional podem ser criados sem essa especificação de formato binário?

Sim, mas apenas os muito triviais, um sistema operacional bastante básico que executa programas triviais que não precisam ser "realocados" e não precisam ser vinculados a nenhum código externo.

  1. A arquitetura do formato binário depende do sistema operacional ou de ambos?

Nenhum, o formato ELF é usado com muitos sistemas operacionais e arquiteturas.

  1. O formato binário é aplicável apenas a arquivos executáveis ​​ou também ao código do sistema operacional?

No Linux, o kernel inicializável pode não ser ELF, mas os módulos do kernel usam o formato ELF.

informação relacionada