Melhor resposta
Executável portátil
O formato Portable Executable é um formato de arquivo para executáveis, código-objeto, DLLs, arquivos de fonte FON e outros usados em versões de 32 bits e 64 bits dos sistemas operacionais Windows. O formato PE é uma estrutura de dados que encapsula as informações necessárias para o carregador do sistema operacional Windows gerenciar o código executável empacotado.
Isso inclui referências de biblioteca dinâmica para vinculação, tabelas de exportação e importação de API, dados de gerenciamento de recursos e thread – dados de armazenamento local (TLS). Em sistemas operacionais NT, o formato PE é usado para EXE, DLL, SYS (driver de dispositivo) e outros tipos de arquivo. A especificação Extensible Firmware Interface (EFI) afirma que PE é o formato executável padrão em ambientes EFI.
Resposta
Portabilidade do código-fonte C significa que, desde que sua plataforma de destino desejada tem um compilador C funcional disponível, você pode mover seu código-fonte C para a plataforma de destino, recompilando-o, sem ter que modificá-lo. Como quase toda plataforma de destino tem um compilador C disponível para ela, C é considerada uma linguagem de programação muito portátil.
Dito isso, simplesmente escrever código em C não garante portabilidade. Você precisa exercer disciplina para evitar escrever código que não seja portátil. Por exemplo, escrever um código que execute qualquer uma das seguintes ações resultará em um código não portátil:
- Faz suposições sobre os tamanhos de quaisquer tipos de dados, exceto char.
- Faz suposições sobre como os dados estão alinhados na memória e dentro das estruturas.
- Faz suposições sobre como os dados são compactados / preenchidos dentro das estruturas.
- Faz suposições sobre a ordenação de bytes (big endian vs little endian) .
- Usa uma extensão de compilador não padrão, que pode não estar disponível em todas as implementações de compilador.
- Usa uma extensão de biblioteca não padrão, que pode não estar disponível em todas as plataformas.
- Depende de qualquer comportamento definido pela implementação, que pode funcionar de maneira diferente em uma implementação de compilador diferente.
- Contém qualquer comportamento indefinido, que pode parecem funcionar em um ambiente, mas podem se comportar de maneira imprevisível em outro ambiente.
- Faz qualquer chamada de API (interface de programação de aplicativo) para o sistema, que pode não estar disponível em todos os ambientes.
- Faz suposições sobre endereços de memória específicos (por exemplo, que um endereço de memória específico é mapeado para um registro de dispositivo de hardware, etc.).
- Faz suposições sobre o tamanho de um ponteiro ou que um ponteiro tem o mesmo tamanho de um int.
- Faz suposições sobre como os argumentos são passados (na pilha ou em registradores específicos).
- Contém qualquer código-fonte de linguagem assembly inline.
- Usa um recurso mais recente e melhor da linguagem C que pode ainda não ser suportado por algumas implementações de compilador (e, em alguns casos, pode nunca ser suportado).
- Depende de uma biblioteca que faz qualquer uma das opções acima.
Esta não é uma lista completa.
Se você puder Para evitar o uso de código não portátil, sua melhor aposta é isolar esse código não portátil em um arquivo de origem separado. Então, quando você precisa mover o código para uma nova plataforma de destino, fica muito claro qual subconjunto do código-fonte deve ser modificado.