paulo1205
(usa Ubuntu)
Enviado em 04/12/2016 - 11:21h
Um arquivo não tem como ser PECOFF e ELF ao mesmo tempo. Então a questão possivelmente não é apenas um problema de API (ao menos não num nível da aplicação).
A chamada
execve() é a chamada ao kernel do Unix que cuida da execução de novos programas a partir de arquivos, e ela reconhece apenas alguns tipos de arquivos como prontamente executáveis pelo sistema. Para adicionar novos tipos de arquivos, como o PECOFF, você teria de mexer no kernel, acrescentando código para tratar um novo formato.
O Linux tem o mecanismo
binfmt_misc, que permite a você registrar formatos que o kernel deve aceitar como executáveis, mas submetendo a carga dos respectivos arquivos e o disparo de sua execução a algum interpretador, que executa fora do kernel. O WINE pode funcionar dessa maneira: você associa a assinatura de arquivos PECOFF ao interpretador
/usr/bin/wine (ou qualquer outro lugar em que ele esteja instalado). Também programas em Java podem ser configurados para trabalhar de modo semelhante (mas possivelmente usando o sufixo do nome do arquivo, em vez de assinatura).
Não se assuste com o nome “interpretador”. Não significa que você não possa executar código nativo diretamente no processador, nem que você estará dentro de uma máquina virtual ou coisa parecida; pode ser assim se você quiser (ou necessitar), mas nada o impede de, após carregar o arquivo para a memória e fazer os devidos ajustes, dar tão somente um
JUMP para um endereço mapeado do arquivo carregado.