Mac OS XとLinuxのバイナリ互換性


27

私自身、システムのようなUNIXの内部動作やプログラミング全般については比較的新しいので、この質問は素朴で愚かに見えるでしょう。

準備はいい?OK!私は約3レベルの滑らかさを経験します。


同様のハードウェアを備えた2つのシステムがあります(主要なポイントはプロセッサです。標準のIntel Core 2 Duoとしましょう)。

1つは実行中です(ここにLinuxディストリビューションを挿入します:以降はUbuntuを使用します)。もう1つは実行中です。たとえば、Mac OS Xです。

同等のプログラムをコンパイルします。次のように言いましょう。

int main()
{
    int cat = 33;
    int dog = 5*cat;
    return dog;
}

共有ライブラリの影響をまだ考慮したくないため、コードは非常に単純です。

それぞれのシステムでコンパイルされた場合。出力の主な違いはELFとMach-Oの問題ではありませんか?フォーマットの各バイナリを削除し、フラットなバイナリを残した場合、逆アセンブルされたマシン命令は同じになりませんか?(おそらく、コンパイラの習慣/傾向に応じていくつかの違いがあります)。

1.) Ubuntuシステムから生成されたフラットバイナリをMach-Oフォーマットで再パッケージ化するプログラムを開発する場合、Mac OS Xシステムで実行されますか?次に、上記の想定プログラムのコンパイル済みバイナリのみがあり、フラットバイナリを再パッケージ化するためのこの神秘的なツールがある場合、単純なプログラムはMac OS Xシステムで実行できますか?


それでは、もう少し詳しく見てみましょう。

現在、次のようなソースを備えたプログラムがあります。

#include <stdio.h>
int main()
{
    printf("I like tortoises, but not porpoises");
    return 0;
}

2.)このプログラムがコンパイルされ、静的にリンクされていると仮定すると、魔法のプログラムは未加工のバイナリをMach-O形式で再パッケージし、mac os Xで動作させることができますか?他のバイナリに依存する必要がないように見える(この場合、macシステムにはありません)


そして今、最終レベルです。

3.)この想定プログラムを使用して、必要なすべての共有ライブラリをMach-O形式に変換し、代わりに上記のプログラムを動的リンクでコンパイルした場合はどうなりますか。プログラムはまだ実行に成功しますか?

それは今のところそれであるはずです、明らかに、不合理の各ステップは、意味をなすために前のベースに依存しています。そのため、最初の柱が破壊された場合、残りの層に多くのメリットがあるとは思いません。

GUIを念頭に置いたプログラムでこれについて考えることは絶対にありません。ウィンドウシステムは、おそらくまったく別の頭痛の種になるでしょう。この段階では、コマンドラインプログラムのみを検討しています。

今、私は世界を私に修正するように招き、私の不条理な考え方に誤りがあることをすべて教えてくれます。


Wine for OS Xバイナリに相当するものはDarling:darling.dolezel.info
strugee

回答:


25

1つの重要なこと、つまり、プログラムがオペレーティングシステムとやり取りして興味深いことをする必要があるということを忘れます。

慣習はLinuxとOS Xで異なるため、オペレーティングシステムに依存するコードのチャンクが本質的に相互作用できるため、同じバイナリをそのまま実行することはできません。これらの多くはライブラリに隠されているため、リンクする必要があります。つまり、プログラムはリンク可能である必要があり、リンクも2つのシステム間で異なります。

そしてそれは延々と続く。表面上は同じことをしているように聞こえますが、実際の詳細は大きく異なります。


5
これは問題が何であるかについて基本的に正しいですが、問題は実際にはライブラリ(これは一緒にドラッグされる可能性があります)ではなく、OSカーネルへの要求であるシステムコールです。OSが互換性のあるシステムコールインターフェイスを提供しない場合、運が悪い。
mattdm

1
ああ、これは素晴らしい。これはまさに私が望んでいた建設的な修正の一種です。たくさんのありがとう:Dこれらの想定されるシステムコールについて詳しく教えてください。
ZEC

3
それらは「想定」ではなく、実際のものです。:)これは良いスタートです:ibm.com/developerworks/linux/library/l-system-calls
mattdm

7
とは言っても、「クレイジー」なアイデアは完全に不可能ではありません。たくさんの仕事。Wineプロジェクトは基本的に、Linux(またはOS X)上でMS Windowsバイナリを実行するためのものです。システムコールの翻訳層を提供します。wiki.winehq.org/...
mattdm

1
まあ、私はそれが完全に不可能ではないだろうと思ったが、それは私がそれを説明したほどに単純であるとは思わなかった。私は修正されるつもりで質問を書きました。これは、「LinuxバイナリをMac OSで実行できるように変換するにはどうすればよいですか」などの直接的な質問をするよりも、問題の核心を突き止めるより効率的な方法のように思えます。また、私は時々ワインを使用しましたが、私はそれが前にどのように働いたかについて本当に本当に考えたことがありませんでした、私はいつかそれを調べに行くと思います。
-zec

17

誰かがそれを実現するのに十分な時間を費やしたい場合、これは実行可能です。ダーリンプロジェクトは、これを書いているとして、それはかなり原始的な状態でありますけれども、これをしようとしています。

以前は他のプラットフォームで成功していました。

OS Xには多くのFreeBSDが含まれているため、Linuxサポートの移植は簡単です。


2
これがLinuxプログラムにとって大したことではない理由の1つ→他のプラットフォームは、ソースが利用できない重要なLinux専用アプリがないことです。プログラムをOS XまたはSolarisで実行し、再コンパイルしたい場合は、ここに行きます。コードがLinux固有の方法で記述された場所に少し移植することがありますが、一般的には、特に互換性レイヤーを維持することと比較して、それほど多くの作業はありません。FreeBSDのLinux互換性は、NetscapeがLinux専用のバイナリであり、おそらくAdobe Flash Playerでもまだ使用されていた頃には大したものでした。
mattdm

@JörgW Mittag —また、他のプラットフォームのシステムライブラリを利用可能にする必要がありました。これ AutoZoneに対する訴訟の根拠となった可能性があります。しかし、正直なところ、私は詳細を忘れて、もうほとんど気にしません。:)
mattdm

つまり、基本的に、オペレーティングシステムXがオペレーティングシステムYと同じサービスを提供する場合、バイナリは両方の下で実行できます。これは事実ですが、システムXには慎重な努力が必要です。この方法でOS Xと互換性のあるオペレーティングシステムを
知り

腐ってる?見せてあげます。
GnP 14

3

私は皆にほぼ同意しますが、それを追加したいと思います。これにはかなりの時間と労力がかかりますが、Wineの開発にかかったほど多くはありません。

Wine開発で困難なことの多くは、彼らがクローズドソースのオペレーティングシステムからバイナリ形式を移植しており、多くのシステムコールが文書化されていないことです。オペレーティングシステムを本質的にリバースエンジニアリングする必要がありました。

誰かが1つのオープンOSから別のオープンOSにこれを行う場合、同等のネイティブシステムコールがあれば、互換性レイヤーを他のOSからコピー/ペーストできるため、おそらく1/10の時間でそれを実行できます存在しません。もちろん、POSIXの世界ではほとんどの場合、ネイティブコールが利用できます。

もう1つの注目すべきプロジェクトはReactOSです。ここでは、Windowsの完全なバイナリ互換バージョンを作成しています。Wineは不要です。


1

macOSで技術的に実行できますが、かなりの努力なしではできませんが、努力の一部はすでに行われています。

  • macOSとブランド変更されたRed Hat Enterprise Linuxの両方がUNIX 03として認定されています。これは、原則としてPOSIX呼び出しに同じAPIが必要であることを意味します。
  • macOSとLinuxは、amd64プラットフォームにSystem V ABIを使用します。これは、amd64の場合、macOSとLinuxには互換性のあるABIとAPIが必要であることを意味します。
  • macOSはネイティブ実行可能形式としてMach-Oを使用し、LinuxはELFを使用します。実行可能ファイル形式を使用して互換性レイヤーを呼び出す必要があるかどうかを区別できるため、これにより作業が容易になります。binfmt_miscただし、これには次のようなものが必要です。
  • まさにそれを提供するサードパーティのmacOSカーネル拡張が存在します。これでmacOSにELFをロードさせるld-linux.soことができます。ELFをロードして実行する特別なMach-O実行ファイルが必要です。

ここで必要なのは、少なくともld-linux.so次のことができる特別なものです。

  • Mach-O実行可能ファイルまたはdyldそれ自体であること、
  • Linux ELFファイルを正しいアドレスでメモリにロードできます。
  • LinuxのsonameをmacOSにマップし(例:/lib/libc.so.6/lib/libSystem.B.dylib)、一致するELFが見つからないときに対応するMach-Oをロードできるようになり、macOSライブラリを再利用できるようになることを願っています

直接syscallを行わないELFの上のローダーだけで機能する可能性は十分にありますが、syscallを使用したELFは機能しない可能性があります。役に立つかもしれない2番目のコンポーネントは、これらのLinuxシステムコールをキャッチし、macOSにマップするカーネル拡張です。デスクトップの使用の時点で、LinuxグラフィックコールをOpenGL.frameworkおよびにマップするには特別なmesa実装が必要ですMetal.framework


0

これが非常に役立つ多くの特殊なLinuxアプリがあります。FPGA側では、QuartusとVivadoはLinuxで実行されるプログラムの良い例であり、それらのソースコードや最新のFPGAをターゲットとする同様のプログラムが利用できる可能性はほとんどありません。

あなたの質問に対する簡単な答えは、ソースがあるMacOSで再コンパイルし、時間がある場合に機能を提供するためにグループを形成することだと思います-それは時間がかかる作業になります。

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