Posso executar um arquivo .exe do Windows no Linux? [duplicado]

12

Pergunta relacionada:
Por que o windows exe não funciona no Linux?

Um .exearquivo do Windows pode ser executado no Linux?

Se a mesma arquitetura for usada, será possível? Como se os dois programas rodassem na arquitetura X86, seria possível executar um Windows .exeno Linux?

Varun Janga
fonte

Respostas:

13

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
Thariama
fonte
11

O sistema operacional (Windows ou Linux) fornece serviços para aplicativos. Por exemplo, Windows e Linux terão funções que o aplicativo pode chamar para acessar arquivos, acessar a rede, exibir itens na tela etc.

Os diferentes sistemas operacionais fornecem maneiras diferentes de fazer essas coisas; portanto, um aplicativo que faz isso da maneira Windows não funciona no Linux e vice-versa, mesmo que a arquitetura da CPU seja a mesma.

Angus
fonte
2
Esta resposta está correta. Não é o único motivo (os diferentes carregadores e formatos executáveis ​​também são essenciais), mas é um deles.
Matthew Flaschen
2
Esse é um dos principais motivos pelos quais você não pode executar o mesmo executável nativamente em diferentes sistemas operacionais.
1
@Let_Me_Be: Na verdade, seu comentário não está correto.
0xA3
1
@ 0xA3 Se você estiver acessando a API específica da plataforma, sim. Mas, na maioria das vezes, isso não é verdade. Reimplementar a biblioteca padrão C ou C ++ é realmente muito simples, basta reimplementar os bugs e redirecionar as chamadas. O que exige muito trabalho é um formato de arquivo diferente (e APIs específicas da plataforma, pois elas precisam ser reimplementadas do zero).
Let_Me_Be
2
@ Vamos, eu nunca disse que você deveria. Eu estava apontando que você disse "na maior parte" que os programas não usam APIs específicas da plataforma; de fato, a maioria faz . Mesmo programas que usam bibliotecas de plataforma cruzada como o GTK ainda estão usando APIs específicas da plataforma indiretamente.
Matthew Flaschen
8

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.

Nico Huysamen
fonte
5

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.

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

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

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

Lie Ryan
fonte
1

É possível vinho de pesquisa

Paul Whelan
fonte
paul @ eu não quero vinho ... eu estou falando sobre programação ... depois que eu recebo um executável após a compilação. pode que executável executado em ambos janela e linux
1
O artigo da wikipedia fornece detalhes de alto nível sobre por que o WINE é necessário.
Paul Whelan
1

Somente se for um arquivo .Net .exe. Eu fiz um aplicativo no VS e compilei no Windows e depois o executei no Linux

mono myapp.exe

Eu sei que isso não é exatamente o que você está procurando, mas a resposta é que você pode executar alguns arquivos exe no Linux.

Lukasz Madon
fonte
1

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.

t3mujin
fonte