Kann ich eine Windows EXE-Datei unter Linux ausführen? [Duplikat]

12

Verwandte Frage:
Warum funktioniert Windows Exe unter Linux nicht?

Kann eine Windows- .exeDatei unter Linux ausgeführt werden?

Wenn dieselbe Architektur verwendet wird, ist dies möglich? Wenn beide Programme auf einer X86-Architektur ausgeführt werden, ist es dann möglich, Windows .exeunter Linux auszuführen ?

Varun Janga
quelle

Antworten:

13

Die exe-Datei wird entweder unter Linux oder Windows ausgeführt, jedoch nicht unter beiden.

Wird unter Windows ausgeführt

Wenn es sich bei der Datei um eine Windows-Datei handelt, wird sie nicht alleine unter Linux ausgeführt. Wenn dies der Fall ist, können Sie versuchen, es unter einer Windows-Kompatibilitätsebene (Wine) auszuführen. Wenn es nicht mit Wein kompatibel ist, können Sie es unter Linux nicht ausführen.

Bevor Sie beginnen können, müssen Sie Wine installieren. Die Schritte, die Sie zur Installation von Wine benötigen, hängen von der Linux-Plattform ab, auf der Sie sich befinden. Sie können wahrscheinlich Google "Ubuntu install wine" verwenden, wenn Sie beispielsweise Ubuntu installieren.

Sobald Sie Wine installiert haben, können Sie diese Befehle ausführen.

wine xxx.exe

Unter Linux ausführen

Wenn Sie wissen, dass diese Datei unter Linux ausgeführt werden soll, sollten Sie die folgenden Befehle ausführen:

Sie wollen Berechtigungen ändern alle Benutzer e ermöglichen x ecute dieser Datei (a + x). Sie könnte auch nur den Benutzer e erlauben x ecute (u + x)

chmod a+x xxx.exe

Starten Sie das Programm und ./weist die Befehlszeile an, im aktuellen Pfad nach der auszuführenden Datei zu suchen (wenn sich das 'aktuelle' Verzeichnis nicht in der Umgebungsvariablen $ PATH befindet.

./xxx.exe
Thariama
quelle
11

Das Betriebssystem (Windows oder Linux) bietet Dienste für Anwendungen. Beispielsweise verfügen Windows und Linux über Funktionen, die die Anwendung aufrufen kann, um auf Dateien zuzugreifen, auf das Netzwerk zuzugreifen, Dinge auf dem Bildschirm anzuzeigen usw.

Die verschiedenen Betriebssysteme bieten verschiedene Möglichkeiten, um diese Dinge zu tun, sodass eine Anwendung, die dies auf Windows-Weise tut, unter Linux nicht funktioniert und umgekehrt, obwohl die CPU-Architektur dieselbe ist.

Angus
quelle
2
Diese Antwort ist richtig. Dies ist nicht der einzige Grund (die verschiedenen Lader und ausführbaren Formate sind ebenfalls von entscheidender Bedeutung), aber es ist einer von ihnen.
Matthew Flaschen
2
Dies ist einer der Hauptgründe, warum nicht dieselbe ausführbare Datei nativ auf verschiedenen Betriebssystemen ausgeführt werden kann.
1
@Let_Me_Be: Eigentlich ist dein Kommentar nicht korrekt.
0xA3
1
@ 0xA3 Wenn Sie auf eine plattformspezifische API zugreifen, dann ja. Aber zum größten Teil ist das eigentlich nicht wahr. Die Neuimplementierung der C- oder C ++ - Standardbibliothek ist eigentlich sehr einfach. Sie müssen lediglich die Fehler erneut implementieren und Aufrufe umleiten. Was viel Arbeit erfordert, ist ein anderes Dateiformat (und plattformspezifische APIs, da diese von Grund auf neu implementiert werden müssen).
Let_Me_Be
2
@Lass, ich habe nie gesagt, dass du solltest. Ich habe darauf hingewiesen, dass Sie "größtenteils" gesagt haben, dass Programme keine plattformspezifischen APIs verwenden. in der Tat tun die meisten . Selbst Programme, die plattformübergreifende Bibliotheken wie GTK verwenden, verwenden immer noch indirekt plattformspezifische APIs.
Matthew Flaschen
8

Nein, verschiedene Betriebssysteme verwenden unterschiedliche Formate (dh Windows verwendet PE, während Linux ELF verwendet). Außerdem kompiliert Ihr Programm beim Kompilieren native Betriebssystemmethoden. Wie bereits erwähnt, können Sie sich mit WINE befassen . Es bietet die meisten Funktionen zum Ausführen von Windows-Binries unter Linux.

Nico Huysamen
quelle
5

Es gibt drei Hauptgründe, warum EXE-Dateien nicht direkt unter Linux ausgeführt werden und warum eine ausführbare Linux-Datei nicht direkt unter Windows ausgeführt wird.

  1. Der erste ist Systemaufrufe. Systemaufrufe sind fast per Definition plattformspezifisch. Es werden jedoch nicht alle Systemaufrufe gleich ausgeführt. Es gibt tragbare Systemaufrufe (z. B. definiert durch die C / C ++ - Standardbibliothek) und nicht tragbare Systemaufrufe (z. B. definiert durch POSIX oder Microsoft). Anwendungen, die zur Kompilierungszeit statisch mit den Systembibliotheken verknüpft sind, stellen fest, dass der statisch enthaltene Teil des Codes aufgrund des stark unterschiedlichen Designs der Plattform wahrscheinlich keine Chance hat, auf der Zielplattform korrekt ausgeführt zu werden. Anwendungen, die zur Laufzeit dynamisch verknüpft sind, können unter bestimmten Bedingungen ausgeführt werden: Wenn es sich um tragbare Systemaufrufe handelt, gibt es eine Übersetzungstabelle zwischen den Systemaufrufen der ursprünglichen Binärdateien und den Systemaufrufen der Zielplattform. Wenn es sich um einen nicht tragbaren Systemaufruf handelt,1 , verschiedene Plattformen haben unterschiedliche Funktionen, und einige Funktionen sind auf der anderen Plattform nicht sinnvoll. 2 ).

    Lösung: Zum Ausführen eines Windows-Programms unter Linux bietet Wine eine Implementierung von Windows-Systemaufrufen und Windows-Systembibliotheken und erkennt auch das PE-Format. Wine kann Windows-Programme unter Linux ausführen, ohne sie neu zu kompilieren. Für das Linux-Programm unter Windows bietet Cygwin eine Implementierung von POSIX-Systemaufrufen unter Windows und ermöglicht die Neukompilierung von für Linux geschriebenen Programmen mit Cygwin GCC, um auf Windows-Systemen ohne Änderungen des Quellcodes ausgeführt zu werden. Aufgrund der Open-Source-Natur der meisten Linux-Programme ist es einfacher, sie neu zu kompilieren, als die Methode von Wine zur Bereitstellung einer binärkompatiblen Schicht zu wählen. Es ist nicht unmöglich, eine weinähnliche Kompatibilitätsschicht bereitzustellen, jedoch ist Cygwins Weg robuster und es gibt einfach nicht viel Antrieb, um nicht-Open-Source-Linux-Programme einfach auf Windows portieren zu können.

  2. Das andere ist das ausführbare Format. Windows verwendet das PE-Format (Portable Executable) und Linux das ELF-Format (Executable and Linkable Format). Das ausführbare Format enthält Metadaten und definiert, wie die ausführbare Datei von der Plattform geladen und ausgeführt werden soll.

    Lösung: Es ist durchaus möglich, einen PE -> ELF oder ELF -> PE-Wandler zu schreiben. und es sollte wahrscheinlich nicht zu schwer sein, dies zu tun (Warnung: Ich bin mit dem tatsächlichen Format von beiden nicht vertraut). Eine andere Möglichkeit besteht darin, einen ausführbaren Loader zu schreiben, der PE-Dateien verstehen kann (z. B. Wine bietet eine an), oder einen ausführbaren Loader, der ELF-Dateien verstehen kann (ich glaube, das Design von Windows schränkt die Möglichkeit ein, dass eine doppelklickbare Datei nativ als ausführbare Datei ausgeführt wird).

  3. System ruft Aufrufkonvention auf. Linux und Windows verfügen nicht nur über unterschiedliche Systemaufrufe, sondern auch über eine ganz andere Konvention zum Aufrufen von Systemaufrufen. Unter Linux übergeben Sie für einen Systemaufruf die Syscall-Nummer im eax / rax-Register und die Argumente in den übrigen Registern und stellen dann eine 0x80-Interrupt-Anforderung. Unter DOS übergeben Sie auch Argumente im Register. Es gibt jedoch für jeden Systemdienst eine andere Interrupt-Anforderungsnummer, sodass Sie die Systemanrufnummer nicht in eax / rax übergeben. Windows NT ähnelt eher Linux. Anstelle von 0x80 wird jedoch eine 0x2E-Interruptanforderung ausgelöst. Die Systemaufrufnummer unterscheidet sich jedoch weiterhin (daher benötigen Sie eine Syscall-Nummer-Übersetzungstabelle und möglicherweise eine Kompatibilitätsebene).

    Lösung: Selbst wenn Sie keinen sich selbst ändernden Code haben oder versuchen, Daten als Code auszuführen oder andere knifflige Codes auszuführen, ist es immer noch sehr schwierig (so schwierig wie das Lösen des Halteproblems), eine ausführbare Datei zu analysieren und nach allen Systemen zu suchen ruft Interrupt-Anforderungen auf und übersetzt sie in Systemaufrufe der Zielplattform. Eine einfachere Möglichkeit besteht darin, einen Laufzeitdienst bereitzustellen, der die Interrupt-Anforderungen des Programms verarbeitet und an die Systemaufrufe der Zielplattform umleitet 3 .

Es gibt verschiedene andere Gründe, aber ich glaube, diese drei sind die großen Stolpersteine.

1 Wenn Sie an die Sicherheit des Dateisystems denken, gibt es keine Möglichkeit, zwischen den Sicherheitsbits von Linux und der NTFS-ACL von Windows zu übersetzen.

2 Windows kann einen Prozess nicht verzweigen. CreateProcess kann etwas zum Emulieren von Fork verwendet werden, verliert jedoch die Semantik beim Kopieren beim Schreiben. In Windows gibt es keine Möglichkeit, einen Copy-on-Write-Prozess zu erstellen.

3 Ich glaube, dass Wein dies tut

Lie Ryan
quelle
1

Es ist möglich, Wein nachzuschlagen

Paul Whelan
quelle
paul @ ich will keinen Wein ... ich spreche von Programmierung ... nachdem ich nach dem Kompilieren eine ausführbare Datei bekommen habe. Kann diese ausführbare Datei sowohl unter Windows als auch unter Linux ausgeführt werden?
1
Der Wikipedia-Artikel enthält allgemeine Informationen darüber, warum WEIN benötigt wird.
Paul Whelan
1

Nur wenn es sich um eine .NET .exe-Datei handelt. Ich habe eine App in VS erstellt und unter Windows kompiliert und dann unter Linux ausgeführt

mono myapp.exe

Ich weiß, dass dies nicht genau das ist, wonach Sie suchen, aber die Antwort ist, dass Sie einige exe-Dateien unter Linux ausführen können .

Lukasz Madon
quelle
1

Die einzige Möglichkeit, ausführbare Dateien unter Win, Linux (oder sogar Mac) auszuführen, besteht darin, eine Art "virtuelle Schicht" zwischen der Assembly- und der Betriebssystemanweisung zu haben. Die Option von lukas , sie unter Mono auszuführen , ist eine Möglichkeit, genau wie beim Erstellen eines Java Datei (oder sogar eine Adobe Air).

Das Erstellen von Binärdateien, die so ausgeführt werden, wie sie auf mehreren Architekturen ausgeführt werden können, ist nicht möglich, da der Maschinencode stark an das Betriebssystem und sogar an die Hardware gebunden ist. Möglicherweise müssen Sie mehrere Builds für jedes System / Betriebssystem ausführen.

t3mujin
quelle