Vím, že mezi OSX a Linuxem je mnoho rozdílů, ale čím jsou tak úplně odlišné, že jsou zásadně nekompatibilní?
Přijatá odpověď:
Celé ABI je jiné, nejen binární formát (Mach-O versus ELF), jak bylo zmíněno sepp2k.
Například zatímco Linux i Darwin/XNU (jádro OS X) používají sc
na PowerPC a int 0x80
/sysenter
/syscall
na x86 pro vstup syscall, odtamtud toho není mnoho společného.
Darwin směruje záporná čísla systémových volání na mikrojádro Mach a kladná čísla systémových volání na monolitické jádro BSD – viz xnu/osfmk/mach/syscall_sw.h a xnu/bsd/kern/syscalls.master. Čísla systémových volání Linuxu se liší podle architektury — viz linux/arch/powerpc/include/asm/unistd.h, linux/arch/x86/include/asm/unistd_32.h a linux/arch/x86/include/asm/unistd_64.h — ale všechny jsou nezáporné. Takže evidentně čísla syscall, argumenty syscall a dokonce které existují různá systémová volání.
Standardní C runtime knihovny jsou také odlišné; Darwin většinou dědí libc FreeBSD, zatímco Linux obvykle používá glibc (ale existují alternativy, jako eglibc a dietlibc a uclibc a Bionic).
Nemluvě o tom, že celý grafický zásobník je jiný; ignorujíce celé knihovny Cocoa Objective-C, programy GUI na OS X komunikují s WindowServerem přes Mach porty, zatímco na Linuxu programy GUI obvykle komunikují se serverem X přes doménové sokety UNIX pomocí protokolu X11. Samozřejmě existují výjimky; můžete spustit X na Darwinu a můžete obejít X na Linuxu, ale aplikace OS X rozhodně nemluví X.
Jako Wine, pokud si někdo dal tu práci
- implementace binárního zavaděče pro Mach-O
- zachycení každého systémového volání XNU a jeho převedení na vhodná systémová volání Linuxu
- v případě potřeby zápis náhrad pro knihovny OS X, jako je CoreFoundation
- v případě potřeby napsání náhrad za služby OS X, jako je WindowServer
pak by bylo možné spustit program OS X „nativně“ na Linuxu. Před lety Kyle Moffet udělal nějakou práci na první položce, vytvořil prototyp binfmt_mach-o pro Linux, ale nikdy nebyl dokončen a neznám žádné další podobné projekty.
(Teoreticky je to docela možné a podobné snahy byly provedeny mnohokrát; kromě Wine má samotný Linux podporu pro spouštění binárních souborů z jiných UNIXů, jako je HP-UX a Tru64, a projekt Glendix má za cíl přinést kompatibilitu plánu 9 do Linux.)
Někdo má vynaložili úsilí na implementaci binárního zavaděče Mach-O a překladače API pro Linux!
shinh/malader – GitHub využívá Wineův přístup načítání binárního souboru a zachycení/přeložení všech volání knihovny v uživatelském prostoru. Zcela ignoruje systémová volání a všechny grafické knihovny, ale stačí k tomu, aby fungovalo mnoho konzolových programů.
Související:Linux – Jak zobrazit uvítací zprávu v unixu?Darling staví na maloaderu, přidává knihovny a další podpůrné běhové bity.