Binärkompatibilität zwischen Mac OS X und Linux

27

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.

zec
quelle
das Äquivalent von Wine für OS X-Binärdateien ist Darling: darling.dolezel.info
strugee

Antworten:

25

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.

Thorbjørn Ravn Andersen
quelle
5
Dies ist grundsätzlich korrekt, was das Problem betrifft, aber das Problem sind nicht wirklich Bibliotheken (die mitgeschleppt werden könnten), sondern Systemaufrufe, die Anforderungen an den Betriebssystemkern sind. Wenn das Betriebssystem keine kompatible Systemaufrufschnittstelle bietet, haben Sie Pech.
Mattdm
1
Aah, das ist ausgezeichnet. Dies ist genau die Art von konstruktiver Korrektur, auf die ich gehofft hatte. Vielen Dank: D Können Sie mir mehr über diese angeblichen Systemaufrufe erzählen oder mich an einen Ort weiterleiten, an dem ich mehr über sie erfahren kann?
zec
3
Sie sind nicht "vermeintlich", sie sind tatsächlich. :) Hier ist ein guter Anfang: ibm.com/developerworks/linux/library/l-system-calls
mattdm
7
Das heißt, Ihre "verrückte" Idee ist nicht ganz unmöglich. Nur viel Arbeit. Das Wine-Projekt ist im Wesentlichen für die Ausführung von MS Windows-Binärdateien unter Linux (oder OS X) gedacht. Es bietet eine Übersetzungsschicht für Systemaufrufe. wiki.winehq.org/…
mattdm
1
Nun, ich dachte, es wäre nicht ganz unmöglich, aber ich hätte auch nicht erwartet, dass es annähernd so einfach ist, wie ich es beschrieben habe. Ich habe die Frage mit der Absicht geschrieben, korrigiert zu werden. Dies scheint zuweilen eine effizientere Methode zu sein, um die Sache auf den Punkt zu bringen, als eine direkte Frage wie "Wie konvertiere ich eine Linux-Binärdatei für die Ausführung unter Mac OS" zu stellen. Auch ich habe von Zeit zu Zeit Wein getrunken, aber ich hatte noch nie darüber nachgedacht, wie es funktioniert hat. Ich denke, ich werde es mir irgendwann einmal ansehen.
zec
17

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, lxrundas in etwa so funktioniert sudo: 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.

Warren Young
quelle
2
Einer der Gründe, warum dies für Linux-Programme und andere Plattformen keine große Rolle spielt, ist, dass es keine wichtigen Linux-Apps gibt, für die keine Quelle verfügbar ist. Sie möchten Ihr Programm unter OS X oder Solaris ausführen, es neu kompilieren und loslegen. Möglicherweise gibt es eine kleine Portierung, bei der der Code Linux-spezifisch geschrieben wurde, aber im Allgemeinen ist das nicht viel Arbeit, insbesondere im Vergleich zur Aufrechterhaltung der Kompatibilitätsebene. Die Linux-Kompatibilität von FreeBSD war schon eine große Sache, als Netscape eine Binärdatei war, die nur für Linux vertrieben wurde und wahrscheinlich immer noch für Adobe Flash Player verwendet wird.
Mattdm
@ Jörg W Mittag - außerdem mussten die Systembibliotheken der anderen Plattform verfügbar sein. Dies könnte die Grundlage für ihre Klage gegen AutoZone gewesen sein. Aber ehrlich gesagt vergesse ich die Details und kümmere mich kaum noch darum. :)
mattdm
Was Sie also sagen, ist im Wesentlichen, dass, wenn Betriebssystem X die gleichen Dienste wie Betriebssystem Y bereitstellt, eine Binärdatei unter beiden ausgeführt werden kann. Dies ist wahr, erfordert aber einen bewussten Aufwand für System X. Mir ist nicht bekannt, dass ein Betriebssystem auf diese Weise mit OS X kompatibel ist.
Thorbjørn Ravn Andersen
bitrotten? Ich werde mich zeigen.
GnP
3

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.

Joe
quelle
1

Es ist technisch in macOS machbar, aber nicht ohne nennenswerten Aufwand, obwohl ein Teil des Aufwands bereits für uns erledigt ist.

  • Sowohl für macOS als auch für ein umbenanntes Red Hat Enterprise Linux wurde UNIX 03 zertifiziert. Dies bedeutet, dass POSIX-Aufrufe im Prinzip dieselbe API haben sollten.
  • Sowohl macOS als auch Linux verwenden System V ABI für die amd64-Plattform. Dies bedeutet, dass für amd64 MacOS und Linux kompatibles ABI und API haben sollten.
  • macOS verwendet Mach-O als systemeigenes ausführbares Format, während Linux ELF verwendet. Dies erleichtert die Arbeit, da anhand des ausführbaren Dateiformats unterschieden werden kann, ob die Kompatibilitätsebene aufgerufen werden soll. Dies würde allerdings so etwas erfordern binfmt_misc.
  • Es gibt eine MacOS-Kernel-Erweiterung von Drittanbietern, die genau das bietet. Jetzt haben wir eine Möglichkeit, macOS vom Laden von ELF zu überzeugen. Wir benötigen unser Special, ld-linux.sodas 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:

  • Sei ein Mach-O-Programm oder sich dyldselbst,
  • Kann Linux ELF-Dateien an der richtigen Adresse in den Speicher laden,
  • Hoffentlich hat man die Möglichkeit, Linux-Sonamen auf MacOS-Sonamen abzubilden (Beispiel /lib/libc.so.6dazu /lib/libSystem.B.dylib) und das entsprechende Mach-O zu laden, wenn kein passendes ELF gefunden wird, sodass wir MacOS-Bibliotheken wiederverwenden können

Mit 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.frameworkund abzubilden Metal.framework.

Maxthon Chan
quelle
0

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.

Daniel Wisehart
quelle