Machen Sie sich keine Sorgen, diese Frage wird wahrscheinlich naiv und / oder dumm erscheinen, da ich relativ neu in der Funktionsweise von Unix-ähnlichen Systemen und der Programmierung im Allgemeinen bin.
Bereit? Okay! Ich werde ungefähr 3 Levels von Ludicrosity durchlaufen, die mit der Zeit zunehmen.
Wir haben zwei Systeme mit ähnlicher Hardware (hauptsächlich der Prozessor, sagen wir ein Standard Intel Core 2 Duo).
Eine läuft (fügen Sie Ihre Linux-Distribution hier ein: Ubuntu wird von nun an verwendet), und die andere läuft, sagen wir Mac OS X.
Man kompiliert ein äquivalentes Programm. Sagen wir so etwas wie:
int main()
{
int cat = 33;
int dog = 5*cat;
return dog;
}
Der Code ist extrem einfach, da ich die Auswirkungen von gemeinsam genutzten Bibliotheken noch nicht berücksichtigen möchte.
Bei der Kompilierung auf den jeweiligen Systemen. Ist der Hauptunterschied zwischen der Ausgabe nicht eine Frage von ELF und Mach-O? Wenn man jede Binärdatei von der Formatierung trennen und dabei eine flache Binärdatei belassen würde, wären die Anweisungen für die zerlegte Maschine dann nicht dieselben? (mit vielleicht ein paar Unterschieden, abhängig von den Gewohnheiten / Tendenzen des Compilers).
1.) Wenn man ein Programm entwickeln würde, um die flache Binärdatei, die von unserem Ubuntu-System erzeugt wird, in der Mach-O-Formatierung neu zu packen, würde es auf dem Mac OS X-System laufen? Wenn man dann nur die kompilierte Binärdatei des oben genannten vermeintlichen Programms und dieses mystische Tool zum erneuten Packen von Flat-Binaries hätte, könnten dann einfache Programme auf dem Mac OS X-System ausgeführt werden?
Lassen Sie es uns noch etwas weiter gehen.
Wir haben jetzt ein Programm mit Quellen wie:
#include <stdio.h>
int main()
{
printf("I like tortoises, but not porpoises");
return 0;
}
2.) Unter der Annahme, dass dieses Programm kompiliert und statisch verknüpft ist, könnte unser magisches Programm die rohe Binärdatei immer noch im Mach-O-Format neu packen und auf Mac OS X funktionieren? Da es sich nicht um andere Binärdateien handeln müsste (für die das Mac-System in diesem Fall keine benötigt)
Und jetzt zum letzten Level.
3.) Was wäre, wenn wir mit diesem vermeintlichen Programm alle erforderlichen gemeinsam genutzten Bibliotheken in das Mach-O-Format konvertieren und stattdessen das obige Programm mit dynamischer Verknüpfung kompilieren würden? Würde das Programm weiterhin erfolgreich ausgeführt?
Das sollte es vorerst sein, offensichtlich beruht jeder Schritt der Absurdität auf der vorherigen Basis, um überhaupt einen Sinn zu ergeben. Wenn also die allererste Säule zerstört wird, bezweifle ich, dass die verbleibenden Ebenen viel wert sind.
Ich würde definitiv nicht einmal so weit gehen, daran zu denken, wenn ich an Programme mit grafischer Benutzeroberfläche denke. Fenstersysteme würden wahrscheinlich ganz andere Kopfschmerzen bereiten. Gegenwärtig werden nur Befehlszeilenprogramme berücksichtigt.
Jetzt lade ich die Welt ein, mich zu korrigieren und mir alles zu sagen, was mit meiner absurden Denkweise nicht stimmt.
Antworten:
Sie vergessen eine entscheidende Sache, nämlich, dass Ihr Programm mit dem Betriebssystem interagieren muss, um etwas Interessantes zu tun.
Die Konventionen unterscheiden sich zwischen Linux und OS X, sodass dieselbe Binärdatei nicht wie sie ist ausgeführt werden kann, ohne dass im Wesentlichen ein Teil des betriebssystemabhängigen Codes vorhanden ist, um mit ihr interagieren zu können. Viele dieser Dinge sind in Bibliotheken verborgen, die Sie dann einbinden müssen. Das bedeutet, dass Ihr Programm einbindbar sein muss und die Verknüpfung auch zwischen den beiden Systemen unterschiedlich ist.
Und so geht es weiter und weiter. Was sich anhört, als würde man das Gleiche tun, ist im Detail sehr unterschiedlich.
quelle
Dies ist machbar, wenn jemand genügend Zeit aufwenden möchte, um dies zu erreichen. Das Darling-Projekt versucht dies, obwohl es sich zum jetzigen Zeitpunkt in einem ziemlich primitiven Zustand befindet.
Es wurde zuvor erfolgreich auf anderen Plattformen durchgeführt:
Solaris und UnixWare enthalten ein Hilfsprogramm namens,
lxrun
das in etwa so funktioniertsudo
: Sie übergeben dem Hilfsprogramm den Namen und die Parameter der ausführbaren Datei und es repariert die Dinge dynamisch, damit die ausführbare Datei mit dem Betriebssystem kommunizieren kann. Die offizielle Seite (unten, Archiv - Link ) sagt , dass es bitrotted .Der Linux-Kernel hatte einmal eine Funktion namens iBCS , die das Gegenteil bewirkte, außer dass sie keinen Helfer benötigte, da der Kernel die "fremden" Binärdateien direkt erkannte. Es verfiel während der Kernel 2.3-Entwicklungsserie , höchstwahrscheinlich, weil der kleine Unix-Server-Kampf im Wesentlichen vorbei war, sobald 2.4 herauskam.
Der FreeBSD-Kernel kann so konfiguriert werden, dass er Linux-Binärdateien erkennt und so ausführt, als ob sie nativ wären. Diese Funktion scheint besser in Form zu sein als die beiden oben genannten.
OpenBSD und NetBSD haben ähnliche Funktionen.
In OS X steckt viel FreeBSD , daher ist die Portierung der Linux-Unterstützung möglicherweise unkompliziert.
quelle
Ich stimme fast allen zu, aber ich möchte hinzufügen, dass dies zwar viel Zeit und Mühe kosten würde, aber nicht annähernd so viel Zeit in Anspruch nehmen würde, wie für die Entwicklung von Wein erforderlich war.
Das Schwierigste an der Wine-Entwicklung ist, dass sie ein Binärformat von einem Closed-Source-Betriebssystem portieren und VIELE der Systemaufrufe nicht dokumentiert sind. Sie mussten das Betriebssystem im Wesentlichen zurückentwickeln.
Wenn jemand dies von einem offenen Betriebssystem zu einem anderen offenen Betriebssystem tun würde, könnte er es wahrscheinlich in 1/10 der Zeit erledigen, da die Kompatibilitätsschicht durchaus denkbarerweise von dem anderen Betriebssystem kopiert / eingefügt werden könnte, wenn ein äquivalenter systemeigener Systemaufruf erfolgt existiert nicht. Natürlich wird in den meisten Fällen in der POSIX-Welt ein nativer Anruf verfügbar sein.
Ein weiteres bemerkenswertes Projekt ist ReactOS, bei dem im Wesentlichen eine binärkompatible Vollversion von Windows erstellt wird. Wine wird nicht benötigt.
quelle
Es ist technisch in macOS machbar, aber nicht ohne nennenswerten Aufwand, obwohl ein Teil des Aufwands bereits für uns erledigt ist.
binfmt_misc
.ld-linux.so
das selbst eine ausführbare Mach-O-Datei ist, mit der unser ELF geladen und ausgeführt werden kann.Was wir jetzt brauchen, ist zumindest ein Special
ld-linux.so
, das Folgendes kann:dyld
selbst,/lib/libc.so.6
dazu/lib/libSystem.B.dylib
) und das entsprechende Mach-O zu laden, wenn kein passendes ELF gefunden wird, sodass wir MacOS-Bibliotheken wiederverwenden könnenMit nur diesem Loader über ELF, der keine direkten Systemaufrufe durchführt, haben Sie gute Chancen zu arbeiten, aber ELF mit Systemaufrufen funktioniert möglicherweise nicht. Eine zweite Komponente, die nützlich sein könnte, wäre eine Kernel-Erweiterung, die diese Linux-Systemaufrufe abfängt und sie auf MacOS-Systeme abbildet. Bei Desktop-Anwendungen ist eine spezielle Mesa-Implementierung erforderlich, um Linux-Grafikaufrufe auf
OpenGL.framework
und abzubildenMetal.framework
.quelle
Es gibt eine Reihe spezialisierter Linux-Apps, für die dies eine große Hilfe wäre. Auf der FPGA-Seite sind Quartus und Vivado gute Beispiele für Programme, die unter Linux ausgeführt werden, und es ist unwahrscheinlich, dass Quellcode für sie oder ähnliche Programme verfügbar ist, die auf die neuesten FPGAs abzielen.
Ich denke, die einfache Antwort auf Ihre Frage lautet: Kompilieren Sie auf MacOS neu, wo Sie die Quelle haben, und bilden Sie eine Gruppe, um die Fähigkeit bereitzustellen, wenn Sie Zeit haben - und es wird eine zeitaufwendige Aufgabe sein.
quelle