同様のハードウェアを備えた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の問題ではありませんか?各バイナリの形式を削除してフラットバイナリだけを残している場合、逆アセンブルされた機械語命令は同じではありませんか? (コンパイラの習慣/傾向によって多少の違いがある場合があります。)
- Ubuntuシステムで生成されたフラットバイナリをMach-O形式に再パッケージするプログラムを開発したい場合は、Mac OS Xシステムで実行されますか?それでは、上記のプログラムのコンパイルされたバイナリだけがあり、フラットバイナリを再パッケージする神秘的なツールがあるとしたら、単純なプログラムをMac OS Xシステムで実行できますか?
もう一歩進んでみましょう。
これで、次のようなソースコードを持つプログラムができました。
#include <stdio.h>
int main()
{
printf("I like tortoises, but not porpoises");
return 0;
}
- このプログラムがコンパイルされ静的にリンクされていると仮定すると、私たちの魔法プログラムは元のバイナリをMach-O形式に再パッケージ化してMac OS Xで実行できますか?他のバイナリに依存する必要がないためです(この場合、Macシステムは他のバイナリに依存する必要はありません)。
これで最後のステップに進みます。
- この仮想プログラムを使用して必要なすべての共有ライブラリをMach-O形式に変換し、動的接続を使用して上記のプログラムをコンパイルするとどうなりますか?プログラムは引き続き正常に実行されますか?
今、各段階の不条理が理解されるまで、以前の基盤に依存することが明らかになりました。したがって、最初の柱が破壊された場合、残りの層の価値はそれほど高くありません。
私はGUIを持つプログラムについてこれを決して考えないでしょう。ウィンドウシステムは別の面倒なことがあります。このステップでは、コマンドラインプログラムのみを考慮しています。
今、私は世界の人々に私を正し、私のとんでもない考えのすべてのエラーを教えてもらいます。
ベストアンサー1
興味深いことをするには、プログラムがオペレーティングシステムと対話する必要があるという重要な事実を忘れています。
Linux と OS X のルールは異なるため、対話する OS 固有のコードがあまりないと、同じバイナリがあるまま実行されません。これらの多くはライブラリを介して提供されます。ライブラリにリンクする必要があります。これはプログラムがリンク可能でなければならず、2つのシステム間のリンクも異なることを意味します。
このように進行します。表面的には同じことをするように聞こえますが、実際の詳細は非常に異なります。