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

11

Related Question:
Why won't windows exe's work on Linux?

Um arquivo do Windows .exe pode ser executado no Linux?

Se a mesma arquitetura for usada, será possível? Como se os dois programas fossem executados na arquitetura X86, será possível executar um Windows .exe no Linux?

    
por Varun Janga 30.11.2010 / 10:41

7 respostas

13

O arquivo exe será executado no Linux ou no Windows, mas não em ambos.

Executa no Windows

Se o arquivo for do Windows, ele não será executado no Linux por conta própria. Então, se esse for 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. Os passos que você precisa para instalar o Wine variam com a plataforma Linux em que você está. Você provavelmente pode usar o Google "Ubuntu install wine", por exemplo, se estiver instalando o Ubuntu.

Depois de ter o vinho instalado, você poderá executar esses comandos.

wine xxx.exe

Executar sob o Linux

Se você conhece este arquivo para rodar no linux, então você vai querer executar estes comandos:

Você desejará alterar as permissões para permitir que todos os usuários efetuem ecute esse arquivo (a + x). você também pode permitir que apenas o usuário e x ecute (u + x)

chmod a+x xxx.exe

Lançar o programa, o ./ diz à linha de comando para procurar no caminho atual para o arquivo executar (se o diretório 'atual' não estiver na variável de ambiente $ PATH.

./xxx.exe
    
por 30.11.2010 / 10:49
11

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

Os diferentes sistemas operacionais fornecem maneiras diferentes de fazer essas coisas, portanto, um aplicativo que faça isso do jeito do Windows não funcionará no Linux, e vice-versa, mesmo que a arquitetura da CPU seja a mesma.

    
por 30.11.2010 / 10:46
8

Não, sistemas operacionais diferentes usam formatos diferentes (ou seja, o Windows usa o PE, enquanto o Linux usa o ELF). Além disso, quando compilado, seu programa faz chamadas para métodos nativos do sistema operacional. Como mencionado, você pode investigar o WINE . Ele fornece a maioria das funcionalidades para executar binários do Windows no Linux.

    
por 30.11.2010 / 10:46
5

Existem três razões principais pelas quais os arquivos .exe não são executados diretamente no Linux e porque um executável Linux não é executado diretamente no Windows.

  1. A primeira é chamada 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 maneira. 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). Aplicativos que estão estaticamente vinculados em tempo de compilação com as bibliotecas do sistema descobrirão que a parte do código que está estaticamente incluída provavelmente não teria nenhuma chance de executar corretamente na plataforma de destino devido ao design muito diferente da plataforma. Os aplicativos que são dinamicamente vinculados em tempo de execução têm uma chance de executar com algumas condições: se forem chamadas de sistema portáteis, há uma tabela de conversão entre as chamadas do sistema dos binários originais para as chamadas de sistema da plataforma de destino; se for chamada de sistema não portátil, deve haver uma camada de compatibilidade que receba chamadas do sistema da plataforma original e encontre uma tradução equivalente na plataforma de destino (o que pode nem sempre ser possível 1 , plataformas diferentes conjunto diferente de recursos, e alguns recursos não fazem sentido na outra plataforma 2 ).

    Solução: Para executar o programa do Windows no Linux, o Wine fornece uma implementação de Chamadas do Sistema Windows e Bibliotecas de Sistema do Windows, também reconhece o formato PE; Wine pode executar o programa do Windows no Linux sem recompilar. Para o programa Linux no Windows, o Cygwin fornece uma implementação de chamadas POSIX System no Windows e permite que o programa escrito para Linux seja recompilado usando o Cygwin GCC para ser executado 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 do que seguir o caminho do Wine de fornecer camada compatível com binários. Não é impossível fornecer uma camada de compatibilidade semelhante à do vinho, mas o caminho do Cygwin é mais robusto e não há muita unidade para permitir que o programa Linux de código aberto seja facilmente transferido para o Windows.

  2. O outro é o formato executável. O Windows usa o formato PE (Portable Executable) e o Linux usa ELF (Executable and Linkable Format). O formato executável contém metadados e define como o executável deve ser carregado e executado pela plataforma.

    Solução: É perfeitamente possível escrever um PE - > ELF ou ELF - > Conversor PE; e provavelmente não deve ser muito difícil fazê-lo (aviso: não estou familiarizado com o formato atual de nenhum deles). Outra maneira é escrever um carregador executável que possa entender arquivos PE (por exemplo, Wine fornece um) ou carregador executável que possa entender o arquivo ELF (acredito que o design do Windows limita a possibilidade de um arquivo duplo clicável ser executado nativamente como um executável). / p>

  3. Sistema chama convenção de chamada. O Linux e o Windows não possuem apenas um conjunto diferente de chamadas do sistema disponíveis, mas também possuem uma convenção de chamada de chamada do sistema muito diferente. No Linux, para fazer uma chamada de sistema, você passa o número syscall no registrador eax / rax e os argumentos no resto dos registradores, e então você faz a requisição de interrupção 0x80. No DOS, você também passa argumentos no registrador, no entanto, há um número de solicitação de interrupção diferente para cada serviço do sistema, para que você não passe o número da chamada do sistema no eax / rax. O Windows NT é mais semelhante ao Linux, no entanto, em vez de 0x80, você gera 0x2E, mas o número da chamada do sistema ainda é diferente (então você precisa de uma tabela de conversão numérica syscall e possivelmente uma camada de compatibilidade).

    Solução: Mesmo quando você não tem um código de auto-modificação 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 Interrupção) analisar um executável, pesquisar para todas as solicitações de interrupção de chamadas do sistema e convertê-las em chamadas do sistema da plataforma de destino. Uma maneira mais fácil é fornecer um serviço de tempo de execução que manipule as solicitações de interrupções do programa e redirecione-as 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 maiores obstáculos.

A segurança do sistema de arquivos

1 vem à mente, não há como traduzir entre os bits de segurança do Linux e a ACL NTFS do Windows.

2 O Windows não pode bifurcar um processo; CreateProcess pode ser usado para emular o fork, mas perde a semântica de copy-on-write. Não há como criar um processo de cópia na gravação no Windows.

3 Eu acredito que o Wine faz isso

    
por 30.11.2010 / 13:02
1

É possível procurar vinho

    
por 30.11.2010 / 10:43
1

A única maneira de executar executáveis no Win, Linux (ou até mesmo Mac) é ter algum tipo de "camada virtual" entre as diretivas assembly e OS, lukas 'a opção de executá-lo em Mono é um caminho a percorrer, como construir um arquivo Java (ou até mesmo um Adobe Air).

Construir binários que rodem, como é, rodar em várias arquiteturas, não é possível porque o código da máquina é altamente ligado ao SO e até mesmo ao hardware, você pode ter que executar várias compilações para cada sistema / SO.

    
por 30.11.2010 / 12:57
0

Apenas se for um arquivo .Net .exe. Eu fiz um aplicativo no VS e compilado no Windows, então eu corro 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.

    
por 30.11.2010 / 12:17

Tags