GNU/Linux >> Znalost Linux >  >> Linux

Linux – Co dělá Osx programy nespustitelné v Linuxu?

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 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.


Linux
  1. Co dělá jádro Linux Server základním?

  2. Co je Red Hat Linux?

  3. Linuxový příkaz 'll' nefunguje

  1. V jakých případech nemusí být CLOCK_MONOTONIC k dispozici

  2. Co je jako pbcopy OSX pro Linux

  3. Proč může wine spouštět 64bitové programy na Linuxu, ale ne na Macu?

  1. Co dělá Linux udržitelným OS

  2. Čím je linuxová komunita výjimečná?

  3. Co je Umask v Linuxu