Ich weiß, dass es viele Unterschiede zwischen OSX und Linux gibt, aber was macht sie so unterschiedlich, dass sie grundlegend inkompatibel sind?
Akzeptierte Antwort:
Die ganze ABI ist anders, nicht nur das binäre Format (Mach-O versus ELF), wie von sepp2k erwähnt.
Zum Beispiel verwenden sowohl Linux als auch Darwin/XNU (der Kernel von OS X) sc
auf PowerPC und int 0x80
/sysenter
/syscall
auf x86 für den Syscall-Eintrag, von da an gibt es nicht mehr viel gemeinsam.
Darwin leitet negative Syscall-Nummern an den Mach-Mikrokernel und positive Syscall-Nummern an den monolithischen BSD-Kernel – siehe xnu/osfmk/mach/syscall_sw.h und xnu/bsd/kern/syscalls.master. Die Syscall-Nummern von Linux variieren je nach Architektur – siehe linux/arch/powerpc/include/asm/unistd.h, linux/arch/x86/include/asm/unistd_32.h und linux/arch/x86/include/asm/unistd_64.h – sind aber alle nichtnegativ. Also offensichtlich Syscall-Nummern, Syscall-Argumente und sogar welche Systemaufrufe existieren, sind unterschiedlich.
Die Standard-C-Laufzeitbibliotheken sind ebenfalls anders; Darwin erbt hauptsächlich die libc von FreeBSD, während Linux typischerweise glibc verwendet (aber es gibt Alternativen, wie eglibc und dietlibc und uclibc und Bionic).
Ganz zu schweigen davon, dass der gesamte Grafikstapel anders ist; Abgesehen von den gesamten Cocoa Objective-C-Bibliotheken kommunizieren GUI-Programme unter OS X mit WindowServer über Mach-Ports, während GUI-Programme unter Linux normalerweise über UNIX-Domain-Sockets mit dem X-Server unter Verwendung des X11-Protokolls kommunizieren. Natürlich gibt es Ausnahmen; Sie können X unter Darwin ausführen und X unter Linux umgehen, aber OS X-Anwendungen sprechen definitiv kein X.
Wie Wine, wenn jemand die Arbeit in
steckt- Implementierung eines Binärladers für Mach-O
- Jeden XNU-Systemaufruf abfangen und in geeignete Linux-Systemaufrufe umwandeln
- Schreiben von Ersatz für OS X-Bibliotheken wie CoreFoundation nach Bedarf
- Schreiben von Ersatz für OS X-Dienste wie WindowServer nach Bedarf
dann könnte es möglich sein, ein OS X-Programm „nativ“ unter Linux auszuführen. Vor Jahren hat Kyle Moffet an dem ersten Element gearbeitet und einen Prototyp binfmt_mach-o für Linux erstellt, aber er wurde nie fertiggestellt, und mir sind keine anderen ähnlichen Projekte bekannt.
(Theoretisch ist dies durchaus möglich, und ähnliche Bemühungen wurden viele Male unternommen; neben Wine unterstützt Linux selbst die Ausführung von Binärdateien von anderen UNIXen wie HP-UX und Tru64, und das Glendix-Projekt zielt darauf ab, Plan 9-Kompatibilität zu erreichen Linux.)
Jemand hat sich die Mühe machen, einen Mach-O-Binärlader und API-Übersetzer für Linux zu implementieren!
shinh/maloader – GitHub verfolgt den Wine-ähnlichen Ansatz, die Binärdatei zu laden und alle Bibliotheksaufrufe im Userspace abzufangen/zu übersetzen. Es ignoriert Systemaufrufe und alle grafikbezogenen Bibliotheken vollständig, reicht aber aus, um viele Konsolenprogramme zum Laufen zu bringen.
Verwandte:Linux – Wie zeigt man eine Willkommensnachricht in Unix an??Darling baut auf Maloader auf und fügt Bibliotheken und andere unterstützende Laufzeitbits hinzu.