Posso eseguire un file .exe di Windows su Linux? [duplicare]


12

Domanda correlata:
perché Windows Exe non funziona su Linux?

È possibile .exeeseguire un file Windows su Linux?

Se viene utilizzata la stessa architettura sarà possibile? Come se entrambi i programmi fossero eseguiti su architettura X86, sarà possibile eseguire Windows .exesu Linux?

Risposte:


13

Il file exe verrà eseguito su Linux o Windows, ma non su entrambi.

Esegue in Windows

Se il file è un file Windows, non verrà eseguito da solo su Linux. Quindi, in tal caso, puoi provare a eseguirlo in un livello di compatibilità di Windows (Wine). Se non è compatibile con Wine, non sarai in grado di eseguirlo su Linux.

Prima di poter iniziare, dovrai installare Wine. I passaggi necessari per installare Wine varieranno con la piattaforma Linux su cui ti trovi. Probabilmente puoi Google "Ubuntu install wine", se per esempio stai installando Ubuntu.

Una volta installato wine, sarai in grado di eseguire questi comandi.

wine xxx.exe

Eseguire su Linux

Se conosci questo file per essere eseguito su Linux, ti consigliamo di eseguire questi comandi:

Ti consigliamo di modificare le autorizzazioni per consentire a tutti gli utenti di posta x ecute questo file (a + x). potresti anche consentire solo all'utente di e x ecute (u + x)

chmod a+x xxx.exe

Avviare il programma, ./indica alla riga di comando di cercare nel percorso corrente l'esecuzione del file (se la directory 'corrente' non si trova nella variabile di ambiente $ PATH.

./xxx.exe

11

Il sistema operativo (Windows o Linux) fornisce servizi alle applicazioni. Ad esempio, Windows e Linux avranno funzioni che l'applicazione può chiamare per accedere ai file, per accedere alla rete, per visualizzare cose sullo schermo, ecc.

I diversi sistemi operativi forniscono modi diversi di fare queste cose, quindi un'applicazione che lo fa in modo Windows non funzionerà su Linux, e viceversa, anche se l'architettura della CPU è la stessa.


2
Questa risposta è corretta Non è l'unico motivo (anche i diversi caricatori e formati eseguibili sono fondamentali), ma è uno di questi.
Matthew Flaschen,

2
È uno dei motivi principali per cui non è possibile eseguire lo stesso eseguibile in modo nativo su sistemi operativi diversi.

1
@Let_Me_Be: in realtà il tuo commento non è corretto.
0xA3,

1
@ 0xA3 Se si accede all'API specifica della piattaforma, sì. Ma per la maggior parte, in realtà non è vero. La reimplementazione della libreria standard C o C ++ è in realtà molto semplice, è sufficiente implementare nuovamente i bug e reindirizzare le chiamate. Ciò che richiede molto lavoro è un diverso formato di file (e API specifiche della piattaforma poiché devono essere reimplementate da zero).
Let_Me_Be

2
@Lascia, non ho mai detto che dovresti. Stavo sottolineando che hai detto "per la maggior parte", i programmi non usano API specifiche della piattaforma; infatti, molti lo fanno . Anche i programmi che utilizzano librerie multipiattaforma come GTK utilizzano indirettamente API specifiche per piattaforma.
Matthew Flaschen,

8

No, diversi sistemi operativi usano formati diversi (es. Windows usa PE mentre linux usa ELF). Inoltre, una volta compilato, il programma effettua chiamate ai metodi del SO nativo. Come accennato, puoi esaminare l'utilizzo di WINE . Fornisce la maggior parte delle funzionalità per eseguire i binari di Windows su Linux.


5

Esistono tre ragioni principali per cui i file .exe non verranno eseguiti direttamente su Linux e perché un eseguibile Linux non verrà eseguito direttamente su Windows.

  1. Il primo è Chiamate di sistema. Le chiamate di sistema sono, quasi per definizione, specifiche della piattaforma. Tuttavia, non tutte le chiamate di sistema sono uguali. Esistono chiamate di sistema portatili (ad esempio definite dalla libreria standard C / C ++) e chiamate di sistema non portatili (ad esempio definite da POSIX o Microsoft). Le applicazioni che sono staticamente collegate in fase di compilazione con le librerie di sistema troverebbero che la parte del codice inclusa staticamente probabilmente non avrebbe alcuna possibilità di essere eseguita correttamente nella piattaforma di destinazione a causa del design molto diverso della piattaforma. Le applicazioni collegate dinamicamente in fase di runtime hanno la possibilità di funzionare con alcune condizioni: se si tratta di chiamate di sistema portatili, esiste una tabella di traduzione tra le chiamate di sistema dei binari originali alle chiamate di sistema della piattaforma di destinazione; se si tratta di una chiamata di sistema non portatile,1 , piattaforme diverse hanno diversi set di funzionalità e alcune funzionalità non hanno senso nell'altra piattaforma 2 ).

    Soluzione: per l'esecuzione del programma Windows in Linux, Wine fornisce un'implementazione di Chiamate di sistema di Windows e Librerie di sistema di Windows, inoltre riconosce il formato PE; Wine può eseguire il programma Windows in Linux senza ricompilare. Per il programma Linux in Windows, Cygwin fornisce un'implementazione delle chiamate di sistema POSIX in Windows e consente di ricompilare il programma scritto per Linux utilizzando Cygwin GCC per l'esecuzione sul sistema Windows senza modifiche al codice sorgente. A causa della natura open source della maggior parte dei programmi Linux, è più facile ricompilare piuttosto che seguire il modo di Wine di fornire un livello binario compatibile. Non è impossibile fornire un livello di compatibilità simile al vino, tuttavia il modo in cui Cygwin è più robusto e non c'è molto disco per consentire il facile porting su Windows del programma Linux non open-source.

  2. L'altro è il formato eseguibile. Windows utilizza il formato PE (Portable Executable) e Linux utilizza ELF (Executable e Linkable Format). Il formato eseguibile contiene metadati e definisce il modo in cui l'eseguibile deve essere caricato ed eseguito dalla piattaforma.

    Soluzione: è del tutto possibile scrivere un convertitore PE -> ELF o ELF -> PE; e probabilmente non dovrebbe essere troppo difficile farlo (attenzione: non ho familiarità con il formato effettivo di uno dei due). Un altro modo è quello di scrivere un caricatore eseguibile in grado di comprendere i file PE (ad es. Wine ne fornisce uno) o un caricatore eseguibile in grado di comprendere il file ELF (credo che il design di Windows limiti la possibilità di un file a doppio clic eseguibile nativamente come eseguibile)

  3. Il sistema chiama la convenzione di chiamata. Linux e Windows non hanno solo un diverso set di chiamate di sistema disponibili, ma hanno anche una convenzione di chiamata delle chiamate di sistema molto diversa. In Linux, per effettuare una chiamata di sistema si passa il numero di syscall nel registro eax / rax e gli argomenti nel resto dei registri, quindi si effettua una richiesta di interruzione 0x80. In DOS, si passano anche argomenti nel registro, tuttavia esiste un numero di richiesta di interruzione diverso per ciascun servizio di sistema, quindi non si passa il numero di chiamata di sistema in eax / rax. Windows NT è più simile a Linux, tuttavia invece di 0x80 si genera una richiesta di interruzione 0x2E, tuttavia il numero di chiamata del sistema è ancora diverso (quindi è necessaria una tabella di traduzione dei numeri di syscall e possibilmente un livello di compatibilità).

    Soluzione: anche quando non si dispone di un codice che si modifica da solo o si tenta di eseguire i dati come codice o di eseguire altri codici complicati, è ancora molto difficile (tanto difficile come risolvere il problema dell'arresto) analizzare un file eseguibile, cercare tutto il sistema le chiamate interrompono le richieste e le traducono nelle chiamate di sistema della piattaforma di destinazione. Un modo più semplice è fornire un servizio di runtime che gestisca le richieste di interruzioni del programma e le reindirizzi alle chiamate di sistema della piattaforma di destinazione 3 .

Ci sono varie altre ragioni, ma credo che questi tre siano i grandi ostacoli.

Viene in mente 1 sicurezza del filesystem, non c'è modo di tradurre tra i bit di sicurezza di Linux e l'ACL NTFS di Windows.

2 Windows non può eseguire il fork di un processo; CreateProcess può essere in qualche modo utilizzato per emulare fork, tuttavia perde la semantica di copia su scrittura. Non è possibile eseguire un processo di copia su scrittura in Windows.

3 Credo che Wine faccia questo


1

È possibile cercare vino


paolo @ Non voglio vino ... Sto parlando di programmazione ... dopo aver ottenuto un eseguibile dopo la compilazione. quell'eseguibile può essere eseguito sia su Windows sia su Linux

1
L'articolo di Wikipedia fornisce dettagli di alto livello sul perché è richiesto WINE.
Paul Whelan,

1

Solo se si tratta di un file .Net .exe. Ho creato un'app in VS e compilata in Windows, quindi la eseguo su Linux

mono myapp.exe

So che questo non è esattamente quello che stai cercando, ma la risposta è che puoi eseguire alcuni file exe su Linux.


1

L'unico modo per eseguire eseguibili su Win, Linux (o anche Mac) è avere una sorta di "livello virtuale" tra l'assemblaggio e le direttive del sistema operativo, l'opzione di lukas di eseguirlo sotto Mono è un modo per andare, proprio come costruire un Java file (o persino un Adobe Air).

Non è possibile creare binari che eseguano, così come sono, per l'esecuzione su più architetture poiché il codice macchina è fortemente vincolato al sistema operativo e persino all'hardware, potrebbe essere necessario eseguire diverse build per ciascun sistema / sistema operativo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.