OSXとLinuxには多くの違いがあることは知っていますが、何がそれらをまったく違うものにし、根本的に互換性がないのですか?
OSXとLinuxには多くの違いがあることは知っていますが、何がそれらをまったく違うものにし、根本的に互換性がないのですか?
回答:
sepp2kが述べたように、バイナリ形式(Mach-O対ELF)だけでなく、ABI全体が異なります。
たとえば、LinuxとDarwin / XNU(OS Xのカーネル)は両方ともsc
PowerPCで使用し、x86ではsyscallエントリにint 0x80
/ sysenter
/ syscall
を使用しますが、それ以降はあまり共通点はありません。
Darwinは、Machマイクロカーネルで負のシステムコール番号を指示し、BSDモノリシックカーネルで正のシステムコール番号を指示します。xnu/ osfmk / mach / syscall_sw.hおよびxnu / bsd / kern / syscalls.masterを参照してください。Linuxのシステムコール番号はアーキテクチャによって異なります— linux / arch / powerpc / include / asm / unistd.h、linux / arch / x86 / include / asm / unistd_32.h、およびlinux / arch / x86 / include / asm / unistd_64.hを参照してください —ただし、すべて非負です。したがって、明らかに、システムコール番号、システムコール引数、およびどのシステムコールが存在するかは異なります。
標準のCランタイムライブラリも異なります。DarwinはほとんどがFreeBSDのlibcを継承しますが、Linuxは通常glibcを使用します(ただし、eglibcとdietlibc、uclibcとBionicなどの代替手段があります)。
言うまでもなく、グラフィックスタック全体が異なります。Cocoa Objective-Cライブラリ全体を無視して、OS XのGUIプログラムはMachポートを介してWindowServerと通信しますが、Linuxでは、GUIプログラムは通常X11プロトコルを使用してUNIXドメインソケットを介してXサーバーと通信します。もちろん例外もあります。DarwinでXを実行でき、LinuxでXをバイパスできますが、OS Xアプリケーションは間違いなくXと通信しません。
ワインのように、誰かが仕事をするなら
LinuxでOS Xプログラムを「ネイティブに」実行できる可能性があります。何年も前に、Kyle Moffetは最初の項目でいくつかの作業を行い、Linux用のプロトタイプbinfmt_mach-oを作成しましたが、完成したことはなく、他の同様のプロジェクトはありません。
(理論的にはこれは非常に可能であり、同様の努力が何度も行われています.Wineに加えて、Linux自体はHP-UXやTru64などの他のUNIXからのバイナリの実行をサポートしており、GlendixプロジェクトはPlan 9との互換性を目指していますLinux。)
誰かが Linux用のMach-OバイナリローダーとAPIトランスレーターを実装する努力をしています!
shinh / maloader-GitHubは、バイナリをロードし、ユーザー空間ですべてのライブラリ呼び出しをトラップ/変換するWineのようなアプローチを取ります。syscallとすべてのグラフィカル関連ライブラリを完全に無視しますが、多くのコンソールプログラムを機能させるには十分です。
Darlingはmaloaderに基づいて構築され、ライブラリおよびその他のサポートランタイムビットを追加します。
OSXアプリケーションがLinuxでネイティブに実行されない理由:
まずOSXはLinuxとは異なるバイナリ形式を使用するため、LinuxはOSX用にコンパイルされたバイナリを実行できません(WindowsまたはBSD用にコンパイルされたバイナリを実行できないのと同じ方法)。
第二に、GUIアプリケーションについてお話ししている場合、AppleのGUIツールキットCocoaはa)OSXでのみ利用可能で、b)X11の上では動作しません。
OSXアプリケーションに相当するワインがない理由:
ワインが半分でも使えるようになる前に、多くの仕事をしなければなりませんでした。OSXに相当するものに対する需要はそれほど多くないため、このようなプロジェクトに同じ量の労力を投入した人はいません。
OS XアプリがLinuxで実行されない最も重要な理由は、これらのOSが異なるsyscallを使用したためです。
以前の回答ではライブラリについて言及していましたが、一般的にはそうではありません-Core Foundationは主にCFLiteという名前でAppleによってオープンソース化されており、プラットフォームに簡単に移植できます(iTunesのWindowsバージョンは実際にはCore FoundationのWindowsポートの上にあり、いくつかのコンパイラーを調整し、Linuxディストリビューションでclangを使用してCFLiteを直接作成できます)、Objective-C環境、主にFoundationとAppKitをLinuxに移植するオープンソースの取り組みもあります。 AppleのCocoaよりも早く(NeXT Computerという会社がまだあったときに始まりました。)
誰かが決まれば、彼らはすべてのMach-O syscallをキャプチャして対応するLinux syscallに変換するローダーを設計し、適切なABI変換でそれらのオープンソースライブラリの「カウンターパート」をバイナリに動的にリンクします。
また、参考までに、Mach-Oアプリケーションのソースコードを入手できる場合は、移植を検討することもできますが、非常に単純であることがわかります。例として、OS X 10.6にバンドルされたTextEditアプリは、数行の(重要ではない)CFコードを削除した後、GNUstepにリンクして直接再コンパイルできます。したがって、Linuxですぐに利用できます(GNUstepに付属のTextEdit OS Xの前身であるNeXTSTEPからTextEditアプリを直接再コンパイルし、「©1995 NeXT」ラベルを保持します)。TextEditはBSDライセンスの下にあります。
2012年12月8日に、新しいプロジェクト-Darlingが開始されました。