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
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.
quelle
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.
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.
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).
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
quelle
Es ist möglich, Wein nachzuschlagen
quelle
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
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 .
quelle
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.
quelle