Warum läuft Windows nicht unter Linux?

29

Ich frage nicht , wie man eine Windows-Exe unter Linux zum Laufen bringt.

Ich frage, warum es nicht funktioniert.

Was ist anders an der Art und Weise, wie Windows eine ausführbare Datei und Linux eine ausführbare Datei ausführt? Warum mussten sie anders sein? Warum haben ausführbare Linux-Dateien keine Dateierweiterung?

Nav
quelle
1
Ähnliche Frage zur Informatik : Warum kann ich ein Mac-Programm nicht nativ unter Windows ausführen?
Gilles 'SO - hör auf böse zu sein'

Antworten:

45

Ausführbare Dateien für Linux und Windows verwenden unterschiedliche Formate. Linux verwendet auf den meisten Architekturen das ELF- Format, während Windows das PE- Format verwendet. ELF eignet sich besser für die Verwaltung von gemeinsam genutzten Bibliotheken durch Linux, und PE eignet sich besser für die Verwaltung von gemeinsam genutzten Bibliotheken durch Windows. Es gibt jedoch keinen fundamentalen Grund, warum Linux keine ausführbaren PE- oder Windows ELF-Dateien ausführen konnte. Tatsächlich kann Linux ausführbare PE-Dateien über Wine ausführen .

Die Schwierigkeit besteht darin, dass Windows und Linux völlig unterschiedliche APIs haben : Sie haben unterschiedliche Kernel-Schnittstellen und Bibliotheksgruppen. Um eine Windows-Anwendung tatsächlich auszuführen, müsste Linux alle API-Aufrufe emulieren, die die Anwendung vornimmt. Das ist viel Arbeit. Wein tut es bis zu einem gewissen Grad, aber es ist sehr schwer, zumal der Hersteller von Windows nicht kooperiert. Sie können es mit dem Lernen von Englisch vergleichen, wenn Ihre Muttersprache Chinesisch ist: Das ausführbare Format ist das Alphabet (nicht so schwer zu beherrschen), die API ist das Vokabular (es dauert Jahre, bis Sie anfangen können, Literatur zu lesen) ).

Gilles 'SO - hör auf böse zu sein'
quelle
9
"Wortschatz" ist eine hervorragende Analogie.
Bis auf weiteres angehalten.
Ich denke du meintest das ganz anders .
Mircea Chirea
Android unterstützt auch Linux-Bnaries (keine Pakete), wenn diese für ARM kompiliert wurden, da sie auf Linux basieren
Suici Doga 20.02.16
@SuiciDoga Irgendwie, aber es ist komplizierter. Der Android-Kernel kann Linux-Binärdateien ausführen (wenn sie für das richtige Kernel-ABI kompiliert wurden, z. B. für die Verwendung von NEON-Registern). Wenn Sie jedoch dynamisch verknüpfte Programme ausführen möchten, müssen Sie auch alle Bibliotheken installieren. (Und wenn Sie das tun, können Sie auch einen Paketmanager installieren, sodass "Binärdateien, aber kein Paket" nicht wirklich zutreffen.)
Gilles 'SO - hören Sie auf, böse zu sein'
Ja, ich weiß, dass Sie den Bibliothekspfad usw. ändern müssen
Suici Doga
14

Windows-Binärdateien haben eine andere ABI und verwenden eine andere API als Linux-Binärdateien.

Linux-Binärdateien benötigen keine Erweiterung, da * nix anstelle der Erweiterung Berechtigungsbits verwendet , um eine ausführbare Datei zu identifizieren.

Ignacio Vazquez-Abrams
quelle
1
Stimmen Sie der Antwort zu ... zusätzliche Daten, die relevant sein könnten: ELF ( en.wikipedia.org/wiki/Executable_and_Linkable_Format ) vs PE ( en.wikipedia.org/wiki/PE_executable )
RobotHumans 11.11.10
Ah ja, es braucht auch einen anderen Lader. en.wikipedia.org/wiki/Loader_%28computing%29
Ignacio Vazquez-Abrams
Mir gefällt besonders die zweite Information, die in der Antwort von @Gilles fehlt.
Timothy Gu
@ IgnacioVazquez-Abrams Das ist sehr interessant. Was wäre, wenn ich dir sagen würde, dass ich nur ein Windows-Spiel PlantsVsZombies.exe auf Ubuntu 16.04 Linux nativ laufen lasse? Ich tat das nur aus Langeweile, weil ich wusste, dass es nicht starten würde, aber es tat es und ich konnte es perfekt spielen. Das ist unmöglich, denn für dieses Spiel muss zuerst die Steam-API ausgeführt werden, und das war eindeutig nicht der Fall. Wie ist es gelaufen ??? Soll ich dafür eine neue Frage stellen?
Nikos
@ RestlessC0bra: Wein und Mono sind Dinge.
Ignacio Vazquez-Abrams
0

So hörte ich die Fensterseite von Programmierern in Laiensprache erklären.

In Windows gibt es Hooks in Programmen und das Betriebssystem, das von Exe aufgerufen wird, ist in Linux einfach nicht vorhanden. Wegen der Unterschiede in beiden Umgebungen. Anfänglich sucht Linux nach Berechtigungen, Windows sucht zuerst nach einem verknüpfbaren Format, indem es die Erweiterung untersucht, Eigenschaften ansieht und dann in die Exe-Datei schaut usw.

Es gibt Anwendungen wie Netbackup, die unter Linux gestartet wurden und so modifiziert wurden, dass sie in einer Windows-Umgebung ohne Wine laufen. Häufig sind dies einige der stabilsten Windows-Apps, die sich am besten verhalten.

Bei Windows Apps. Unruhig wird es in der Regel, weil einige der von der Anwendung gehaltenen Hooks nicht vollständig freigegeben wurden und Windows dies für möglich hält (Memory Leaks). Wenn Windows diesen nicht freigegebenen Speicherplatz an eine andere Anwendung abgibt, können Sie abstürzen und brennen.

Rechnung
quelle
2
Irgendwie würde ich gerne glauben, dass Bill Gates meine Frage beantwortet hat ;-)
Nav