O arquivo exe será executado no Linux ou Windows, mas não nos dois.
Executa no Windows
Se o arquivo for um arquivo do Windows, ele não será executado sozinho no Linux. Portanto, se for esse o caso, você pode tentar executá-lo em uma camada de compatibilidade do Windows (Wine). Se não for compatível com o wine, você não poderá executá-lo no Linux.
Antes de começar, você precisará instalar o Wine. As etapas necessárias para instalar o Wine variam de acordo com a plataforma Linux em que você está. Você provavelmente pode usar o Google "Ubuntu install wine", se, por exemplo, estiver instalando o Ubuntu.
Depois de instalar o wine, você poderá executar esses comandos.
wine xxx.exe
Executar no Linux
Se você souber que esse arquivo é executado no linux, execute estes comandos:
Você vai querer alterar as permissões para permitir que todos os usuários e x ecute deste arquivo (a + x). você também pode permitir que apenas o usuário x ecute (u + x)
chmod a+x xxx.exe
Inicie o programa, ./
informa à linha de comando para procurar o caminho atual para a execução do arquivo (se o diretório 'current' não estiver na variável de ambiente $ PATH.
./xxx.exe
Não, diferentes sistemas operacionais usam formatos diferentes (por exemplo, o Windows usa PE enquanto o linux usa ELF). Além disso, quando compilado, seu programa faz chamadas para métodos nativos do SO. Como mencionado, você pode usar o WINE . Ele fornece a maior funcionalidade para executar binários do Windows no Linux.
fonte
Há três razões principais pelas quais os arquivos .exe não são executados diretamente no Linux e por que um executável do Linux não é executado diretamente no Windows.
O primeiro são as chamadas do sistema. As chamadas do sistema são, quase por definição, específicas da plataforma. No entanto, nem todas as chamadas do sistema são feitas da mesma forma. Existem chamadas de sistema portáteis (por exemplo, definidas pela biblioteca padrão C / C ++) e chamadas de sistema não portáteis (por exemplo, definidas por POSIX ou Microsoft). Os aplicativos estaticamente vinculados no momento da compilação com as bibliotecas do sistema descobririam que a parte do código estaticamente incluído provavelmente não teria chance de executar corretamente na plataforma de destino devido ao design muito diferente da plataforma. Os aplicativos que são vinculados dinamicamente no tempo de execução têm a chance de serem executados com algumas condições: se forem chamadas de sistema portáteis, há uma tabela de conversão entre as chamadas de sistema dos binários originais e as chamadas de sistema da plataforma de destino; se for uma chamada não portátil do sistema,1 , plataformas diferentes têm um conjunto diferente de recursos, e algum recurso não faz sentido na outra plataforma 2 ).
Solução: Para executar o programa Windows no Linux, o Wine fornece uma implementação de Chamadas de Sistema e Bibliotecas de Sistemas Windows, além de reconhecer o formato PE; O Wine pode executar o programa Windows no Linux sem recompilar. Para o programa Linux no Windows, o Cygwin fornece uma implementação de chamadas do sistema POSIX no Windows e permite que o programa escrito para Linux seja recompilado usando o Cygwin GCC para executar no sistema Windows sem alterações no código-fonte. Devido à natureza de código aberto da maioria dos programas Linux, é mais fácil recompilar, em vez de seguir a maneira do Wine de fornecer camada compatível com binários. Não é impossível fornecer uma camada de compatibilidade semelhante a um vinho, no entanto, o caminho do Cygwin é mais robusto e não há muito esforço para permitir que o programa Linux não de código aberto seja facilmente portado para o Windows.
O outro é o formato executável. O Windows usa o formato PE (Portable Executable) e o Linux usa o ELF (Executable and Linkable Format). O formato do executável contém metadados e define como o executável deve ser carregado e executado pela plataforma.
Solução: É totalmente possível escrever um conversor PE -> ELF ou ELF -> PE; e provavelmente não deve ser muito difícil fazê-lo (aviso: não estou familiarizado com o formato real de nenhum dos dois). Outra maneira é escrever um carregador executável que possa entender arquivos PE (por exemplo, o Wine fornece um) ou um carregador executável que possa entender arquivos ELF (acredito que o design do Windows limita a possibilidade de um arquivo clicável duas vezes em execução nativamente como executável)
O sistema chama convenção de chamada. O Linux e o Windows não têm apenas um conjunto diferente de chamadas de sistema disponíveis, mas também uma convenção de chamadas de sistema muito diferente. No Linux, para fazer uma chamada do sistema, você passa o número syscall no registro eax / rax e argumentos no restante dos registros e, em seguida, solicita a interrupção 0x80. No DOS, você também passa argumentos no registro, no entanto, há um número de solicitação de interrupção diferente para cada serviço do sistema, para não passar o número de chamada do sistema no eax / rax. O Windows NT é mais semelhante ao Linux; no entanto, em vez de 0x80, você solicita a interrupção de 0x2E; no entanto, o número de chamada do sistema ainda é diferente (portanto, você precisa de uma tabela de conversão de números syscall e possivelmente de uma camada de compatibilidade).
Solução: Mesmo quando você não tem um código auto-modificável ou tenta executar dados como código ou faz outros códigos complicados, ainda é muito difícil (tão difícil quanto resolver o Problema de Parar) analisar um executável, procurar todos os sistemas solicitações de interrupção e converta-as nas chamadas do sistema da plataforma de destino. Uma maneira mais fácil é fornecer um serviço de tempo de execução que lide com as solicitações de interrupção do programa e as redirecione para as chamadas de sistema da plataforma de destino 3 .
Existem várias outras razões, mas acredito que esses três são os grandes obstáculos.
1 segurança do sistema de arquivos vem à mente, não há como traduzir entre os bits de segurança do Linux e a NTFS ACL do Windows.
2 O Windows não pode bifurcar um processo; O CreateProcess pode um pouco ser usado para emular a bifurcação, mas perde a semântica de copiar na gravação. Não há como criar um processo de cópia na gravação no Windows.
3 Eu acredito que o vinho faz isso
fonte
É possível vinho de pesquisa
fonte
Somente se for um arquivo .Net .exe. Eu fiz um aplicativo no VS e compilei no Windows e depois o executei no Linux
Eu sei que isso não é exatamente o que você está procurando, mas a resposta é que você pode executar alguns arquivos exe no Linux.
fonte
A única maneira de executar executáveis no Win, Linux (ou mesmo Mac) é ter algum tipo de "camada virtual" entre as diretivas assembly e OS, a opção do lukas de executá-lo no Mono é um caminho a percorrer, assim como construir um Java arquivo (ou mesmo um Adobe Air).
A criação de binários que executam o que é executado em várias arquiteturas não é possível porque o código da máquina está altamente ligado ao sistema operacional e até ao hardware, talvez seja necessário executar várias construções para cada sistema / sistema operacional.
fonte