OSXプログラムをLinuxで実行できないのはなぜですか?


40

OSXとLinuxには多くの違いがあることは知っていますが、何がそれらをまったく違うものにし、根本的に互換性がないのですか?


5
さて、なぜあなたはOSXプログラムがLinux上で実行可能であると期待するのでしょうか?これら2つの特定のOSについては、質問でそれらについて言及していますが、OSXプログラムを実行できない他のOSについては言及していませんか?
wrosecrans

6
それは基本的に私の質問です。OSXはUNIXカーネルで実行されます。私は他のUNIX / linuxesに比べて、それが特別なのはそれについて何思っていた
Falmarri

6
バイナリ内には秘密の小さなリンゴがあり、Macマシンだけが見ることができます– bobobobo 14
1

一般的に、異なるOSは互いのバイナリを実行できません。これが、ソフトウェアをソースtarballとして配布する慣習がUnixを中心に成長した理由です。この点でMacOSもLinuxも特別なものではありません。どちらか相手のバイナリを実行できれば、特別なものになります。wrosecransのコメントに返信する、より支持されたコメントには、そのポイントがまったくありません。:/
ピーターコーデス

回答:


56

sepp2kが述べたように、バイナリ形式(Mach-O対ELF)だけでなく、ABI全体が異なります。

たとえば、LinuxとDarwin / XNU(OS Xのカーネル)は両方ともscPowerPCで使用し、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.hlinux / 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と通信しません。

ワインのように、誰かが仕事をするなら

  • Mach-O用のバイナリローダーの実装
  • すべてのXNUシステムコールをトラップし、適切なLinuxシステムコールに変換する
  • 必要に応じてCoreFoundationなどのOS Xライブラリの代替を書く
  • 必要に応じて、WindowServerなどのOS 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に基づいて構築され、ライブラリおよびその他のサポートランタイムビットを追加します。


新しい努力は、独自のカーネルコードを使用するよりも、binfmt_miscを使用する可能性がはるかに高いでしょう。
SamB

@SamB:chrootでbinfmt_miscハンドラーを設定しようとしたことがありますか?カーネル内の他のUNIXライクシステムのバイナリ形式を処理するのはかなり合理的だと思います。
一時的な

1
私の質問は OS XバイナリをLinuxで実行できるようにした場合、なぜOS Xライブラリとサービスを書き直す必要があるのでしょうか?その時点でLinuxで変更せずに実行しませんか?法的問題だけですか?
ウブロ

20

OSXアプリケーションがLinuxでネイティブに実行されない理由:

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

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

OSXアプリケーションに相当するワインがない理由:

ワインが半分でも使えるようになる前に、多くの仕事をしなければなりませんでした。OSXに相当するものに対する需要はそれほど多くないため、このようなプロジェクトに同じ量の労力を投入した人はいません。


ご存知のように、OSX / unixが同じバイナリ形式を使用していないことすら知りませんでした。それに関する詳細情報へのリンクはありますか?
ファルマーリ

Falmarri:OSXはMach-O形式を使用し、LinuxはELFを使用します。
sepp2k

1
@FalmarriすべてのUNIXが同じバイナリ形式を使用するわけではありません。また、現代のほとんどすべてがELFを使用していても、通常は1つのUNIXから別のUNIXにバイナリを実行できません。ちなみに、FreeBSDは、8.xで7.xのプログラムを実行できることを保証しているとは思いませんが、1.0のLinuxプログラムは2.6.xで実行する必要があります。
一時的な

5

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ライセンスの下にあります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.