GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Was macht Osx-Programme unter Linux nicht lauffähig?

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.


Linux
  1. Was Linux zum nachhaltigen Betriebssystem macht

  2. Was macht die Linux-Community besonders?

  3. Was ist ein Linux-Benutzer?

  4. Was ist JingOS Linux?

  5. Was ist wie pbcopy von OSX für Linux

Was ist umask unter Linux?

Was ist die Shell unter Linux?

Was ist die Login-Shell in Linux?

Was ist Load Average in Linux?

Was ist eine .bashrc-Datei unter Linux?

Was macht eine GNU-Distribution aus und gibt es Linux-Distributionen, die nicht GNU sind?