OSXプログラムがLinuxで実行されないのはなぜですか?

OSXプログラムがLinuxで実行されないのはなぜですか?

OSXとLinuxの間に多くの違いがあることを知っていますが、基本的に互換性がないほど違いがあるのはなぜですか?

答え1

全体的なABIsepp2kが述べたように、バイナリ形式(Mach-O対ELF)だけでなく、違います。

たとえば、LinuxとDarwin / XNU(OS Xカーネル)はどちらもscPowerPCと/ / int 0x80x86でシステムコールエントリを使用しますが、それ以降は共通点はほとんどありませんでした。sysentersyscall

Darwinは、Machマイクロカーネルでは負のシステムコール番号を表し、BSDモノリシックカーネルでは正のシステムコール番号を表します。xnu/osfmk/mach/syscall_sw.hそしてxnu/bsd/kern/syscalls.master。 Linux のシステムコールの数は、アーキテクチャによって異なります。Linux/アーチ/powerpc/include/asm/unistd.hLinux/アーチ/x86/include/asm/unistd_32.hLinux/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に基づいてライブラリやその他のサポートランタイムビットを追加します。

答え2

OSXアプリケーションがLinuxでデフォルトで実行されない理由:

まず、OSXはLinuxとは異なるバイナリ形式を使用するため、LinuxはOSX用にコンパイルされたバイナリを実行できません(WindowsまたはBSD用にコンパイルされたバイナリを実行できないかのように)。

第二に、GUIアプリケーションについて話している場合、AppleのGUIツールキットCocoaはa)OSXでのみ動作し、b)X11では実行されません。

OSXアプリケーションにワインと同等の機能がない理由:

ワインが半分利用可能な状態に達する前に実行する必要がある多くの作業があります。 OSXに対応する製品に対する需要があまりないため、まだそのようなプロジェクトに多くの努力を払っている人はいません。

答え3

OS X アプリケーションが Linux で実行されない最も重要な理由は、これらのオペレーティングシステムが別のシステムコールを使用するためです。

いくつかの以前の答えはライブラリに言及していましたが、一般的にそうではありません。 Core Foundationは、主にCFLiteという名前でAppleからオープンソースで提供され、すべてのプラットフォームに簡単に移植できます(iTunesのWindowsバージョンは実際にCoreのWindowsポートの上にあります)。 Foundationで、いくつかのコンパイラを修正しました。Linuxディストリビューションでclangを使用してCFLiteを直接作成できます。 Objective-C環境(主にFoundationとAppKit)をLinuxに移植するオープンソースの努力もあります。特にOpenStep AであるGNUstepがあります。 Apple Cocoa以前のGNUの実装

誰かが気に入ったら、すべてのMach-Oシステムコールをキャプチャして対応するLinuxシステムコールに変換し、適切なABI変換を介してこれらのオープンソースライブラリ「相対部分」をバイナリに動的にリンクするローダを設計できます。

ちなみに、Mach-Oアプリケーションのソースコードを入手できれば、移植を検討してもかなり簡単かもしれません。たとえば、OSにバンドルされているTextEditアプリケーションは、NeXTSTEP(OS Xの全身)でTextEditアプリケーションを再コンパイルし、「©1995 NeXT」というラベルも保持します。 TextEditはBSDに従ってライセンスされています。

答え4

2012年12月8日、新しいプロジェクトであるDarlingがリリースされました。

http://www.darlinghq.org/

関連情報