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

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

同様のハードウェアを備えた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;
}
  1. このプログラムがコンパイルされ静的にリンクされていると仮定すると、私たちの魔法プログラムは元のバイナリをMach-O形式に再パッケージ化してMac OS Xで実行できますか?他のバイナリに依存する必要がないためです(この場合、Macシステムは他のバイナリに依存する必要はありません)。

これで最後のステップに進みます。

  1. この仮想プログラムを使用して必要なすべての共有ライブラリをMach-O形式に変換し、動的接続を使用して上記のプログラムをコンパイルするとどうなりますか?プログラムは引き続き正常に実行されますか?

今、各段階の不条理が理解されるまで、以前の基盤に依存することが明らかになりました。したがって、最初の柱が破壊された場合、残りの層の価値はそれほど高くありません。

私はGUIを持つプログラムについてこれを決して考えないでしょう。ウィンドウシステムは別の面倒なことがあります。このステップでは、コマンドラインプログラムのみを考慮しています。

今、私は世界の人々に私を正し、私のとんでもない考えのすべてのエラーを教えてもらいます。

答え1

興味深いことをするには、プログラムがオペレーティングシステムと対話する必要があるという重要な事実を忘れています。

Linux と OS X のルールは異なるため、対話する OS 固有のコードがあまりないと、同じバイナリがあるまま実行されません。これらの多くはライブラリを介して提供されます。ライブラリにリンクする必要があります。これはプログラムがリンク可能でなければならず、2つのシステム間のリンクも異なることを意味します。

このように進行します。表面的には同じことをするように聞こえますが、実際の詳細は非常に異なります。

答え2

誰かがこれを実装するのに十分な時間を投資したい場合は可能です。これ親愛なる計画書く時点ではかなり原始的な状態ですが、そうしようとする試みが行われています。

これは以前に他のプラットフォームで正常に行われていました。

  • Solaris および UnixWare には次のヘルパーが含まれています。lxrunこれは次のように機能しますsudo。実行可能ファイル名とパラメータをヘルパープログラムに渡すと、実行可能ファイルがオペレーティングシステムと通信できるように直ちに問題が修正されます。これ公式ウェブサイト(下では、アーカイブリンク)こう言った少し腐った

  • Linuxカーネルにはかつて次のような機能がありました。iBCSカーネルが「外部」バイナリを直接認識するので、ヘルパーが必要ないことを除いて正反対です。それカーネル2.3開発シリーズの中で破損に陥る、おそらく2.4リリース以来、小規模なUnixサーバーの戦争が本質的に終わったからです。

  • FreeBSDカーネルLinuxバイナリを認識するように設定可能ネイティブのように実行してください。この機能は、上記の2つの機能よりも優れているようです。

    OpenBSDとNetBSDは同様の機能を持っています。

OS XにはFreeBSDがたくさんあります。したがって、Linuxサポートを移植するのは簡単かもしれません。

答え3

私は間違いなくすべての人の意見に同意しますが、ここには多くの時間と労力が必要ですが、ワインを開発するほど多くはないということを付け加えたいと思います。

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

誰かがあるオープンオペレーティングシステムから別のオペレーティングシステムにこれを行う場合は、おそらく時間の1/10で完了できます。同等の基本的なシステムコールがあれば、おそらく他のオペレーティングシステムで互換性層を持つことができるからです。オペレーティングシステムのコピー/貼り付け存在しません。もちろん、POSIXの世界では、ほとんどの場合、デフォルトの呼び出しを使用できます。

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

答え4

大きな助けになるプロのLinuxアプリケーションがたくさんあります。 FPGAに関しては、QuartusとVivadoはLinux上で動作するプログラムの良い例ですが、最新のFPGAのソースコードや同様のプログラムを使用できる可能性は低いです。

あなたの質問に対する簡単な答えは、ソースコードを持つMacOSで再コンパイルし、時間があればチームを整理して機能を提供することです。これは時間のかかる作業になります。

関連情報