OSXとLinuxの間に多くの違いがあることを知っていますが、基本的に互換性がないほど違いがあるのはなぜですか?
ベストアンサー1
全体的なABIsepp2kが述べたように、バイナリ形式(Mach-O対ELF)だけでなく、違います。
たとえば、LinuxとDarwin / XNU(OS Xカーネル)はどちらもsc
PowerPCと/ / int 0x80
x86でシステムコールエントリを使用しますが、それ以降は共通点はほとんどありませんでした。sysenter
syscall
Darwinは、Machマイクロカーネルでは負のシステムコール番号を表し、BSDモノリシックカーネルでは正のシステムコール番号を表します。xnu/osfmk/mach/syscall_sw.hそしてxnu/bsd/kern/syscalls.master。 Linux のシステムコールの数は、アーキテクチャによって異なります。Linux/アーチ/powerpc/include/asm/unistd.h、Linux/アーチ/x86/include/asm/unistd_32.hとLinux/Arch/x86/include/asm/unistd_64.h- しかし、すべて負の数ではありません。したがって、明らかにシステムコール番号、システムコールパラメータ、さらにはどのシステムコールには違いがあります。
標準Cランタイムライブラリも異なります。 DarwinはほとんどFreeBSDのlibcを継承しますが、Linuxは通常glibcを使用します(ただし、eglibc、Dietlibc、uclibc、Bionicなどの代替手段もあります)。
OSサーバー通信のGUIプログラムであるCocoa Objective-Cライブラリ全体を無視すると、グラフィックススタック全体が異なることは言うまでもありません。もちろん例外もあります。 DarwinでXを実行でき、LinuxでXをバイパスすることができますが、OS Xアプリケーションは決してXと通信しません。
ワインのように誰かが努力している場合
- Mach-O用のバイナリローダの実装
- すべてのXNUシステムコールをキャプチャし、それを適切なLinuxシステムコールに変換します。
- 必要に応じて、CoreFoundationなどのOS Xライブラリの代替作成
- 必要に応じて、WindowServerなどのOS Xサービスの代替作成
さて、Linux上でOS Xプログラムを「基本的に」実行することが可能です。 Kyle Moffetは、数年前に最初のプロジェクトでいくつかの作業を行い、プロトタイプを作成しました。binfmt_mach-oLinuxでプロジェクトを進めましたが、完了しておらず、私が知っている限り、他の同様のプロジェクトはありません。
(これは理論上完全に可能であり、同様の努力が何度も行われています。Wineに加えて、Linux自体はHP-UXやTru64などの他のUNIXでのバイナリ実行をサポートしています。グランディックスこのプロジェクトは、LinuxにPlan 9互換性を提供することを目的としています。 )
誰持つLinux用のMach-OバイナリローダとAPIコンバータを実装するために一生懸命働いています!
shinh/maloader - GitHubバイナリをロードし、ユーザー空間ですべてのライブラリ呼び出しをキャプチャ/翻訳するために、Wineと同じアプローチをとります。システムコールとすべてのグラフィック関連ライブラリを完全に無視しますが、多くのコンソールプログラムを実行するのに十分です。
蜂蜜Maloaderに基づいてライブラリやその他のサポートランタイムビットを追加します。