2012-02-10 14 views
3

x86-64 Red Hat Linux用のGCC 4.4.4を使用してコンパイルされたバイナリファイル(Cプログラム)をダウンロードしました。バイナリファイルの実行

GCC 4.2.1を実行しているMac OS X(Lionも同様にx86-64を実行しています)で実行しようとすると、次のようになります:cannot execute binary file?それをバイナリファイルとして検出することはできません。

なぜでしょうか?私はファイルが既にコンパイルされているので、gccのバージョンはそれと関係がないと信じています。両方のマシンが動作するx86-64のためにコンパイルされています。誰かが説明できますか?

答えて

8

特定のOS用にコンパイルされたバイナリが別のOS上で実行されることはほとんどありません。 Mac用のバイナリを入手するか、ソースを入手して自分でコンパイルしてください。

libcとlibstdC++のバージョン、OSのバージョンとの違い、OSとは異なるAPIインターフェイスなど、さまざまな問題が発生します。あるいは異なるバイナリ形式(つまり、VMSバイナリはAIX上では動作しません)。

+0

両方ともx86-64を実行しないでください。ある意味では、コンパイラは、両方のマシンで同じx86アセンブリにコンパイルします。つまり、アセンブラはアセンブリコードを各マシンの異なるバイナリファイルに変換するでしょうか? – darksky

+1

実際の命令のコンパイル結果は同じかもしれませんが、私たちはNayefc OSを持っていると言います - すべてのグローバル変数で実行可能ファイルを配置し、次に関数、ハードコーディングされたテキスト文字列を作成したいと思うかもしれません。最初に関数、次に27680バイトのギャップ(私はそれが好きなので)。 - あなたはポイントを得る。したがって、Windows EXEはLinuxのexeと異なり、Mac exeの可能性があります –

0

この意味でのバイナリは、プログラムにオペレーティングシステムの呼び出しがあるprintf()がある場合に、オペレーティングシステムの呼び出しを行うためにコンパイルされます。コンパイルされたオペレーティングシステムが64ビットのRedHat Linuxである場合、これはバイナリがRedHat Linuxのパスで共有ライブラリのRedHatのLinux名を探すことを意味します。まったく別のオペレーティングシステム、Mac OS X、システムコール、共有ライブラリや静的ライブラリなどとは全く関係がありません。そのようなものは、ミニクーバーから車輪を取り除き、ボルトで止めようとしているようなものです自転車に乗る。はい、ある時点では、それは生の金属とゴムであり、自転車のタイヤに成形されていた可能性があります。しかし、いったんバイナリ、車のタイヤまたは自転車のタイヤを作ると、それはそれです。時には、POSIXシステムの上にウィンドウをエミュレートするワインのようなエミュレータがあります。またはコンピュータ全体を仮想化することによって別のオペレーティングシステムを別のオペレーティングシステム上で実行できるようにする、仮想マシンのような仮想マシンです。

また、古いCプログラムをgccコンパイラを持つオペレーティングシステムでコンパイルして実行することは一般に期待できません。はい、移植可能なCプログラムを書くことを学ぶことができますが、すべてのターゲットプラットフォームでサポートされているライブラリを慎重に守らなければなりません。あなたのプログラムのソースコードをMacに持っていても、それをコンパイルするだけでは必ずしも動作するわけではありません。

+0

しかし、両方ともx86-64を実行しないでください。ある意味では、コンパイラは、両方のマシンで同じx86アセンブリにコンパイルします。つまり、アセンブラはアセンブリコードを各マシンの異なるバイナリファイルに変換するでしょうか? – darksky

+0

アセンブラとコンパイラは関係ありません。ラエルタイヤとメタルホイールが異なるサイズの車両に合うように作られているのと同じ方法でlinuxとmacosが異なるプラットフォームである、そのプラットフォームのシステムライブラリです。同じブランドがタイヤとホイールの側面にある可能性があります。同じメカニックがタイヤを取り付けても、1つのタイヤがすべてのタイヤにフィットするわけではありません。オペレーティングシステムが同じであればwindowsとlinuxとmacosなどはありません –

+0

アセンブラとコンパイラとリンカは純粋な意味ではx86-64であることを知る必要があります。たとえば、printfを使ってhello worldプログラムを作成します。 Cライブラリの多くでもプラットフォーム間で一貫性と移植性がありますが、プログラムが置いているcライブラリ層はもう一方の側にあり、もう一方の側はオペレーティングシステムとCライブラリのインタフェースです。 Cライブラリ側またはオペレーティングシステム側で、あるいは両方ともカスタマイズして、最終的に移植性のない特定のオペレーティングシステムのシステムコールを作成する必要があります。 –

2

Rad Hat LinuxとMac OS Xは両方とも「Unixベース」ですが、お互いのバイナリを実行することはできません。 WindowsバイナリをMacで実行することはできません。その逆も同様です。

11

異なるバイナリ形式があります。 Linuxシステムでは、実行ファイルとライブラリにELFが使用されますが、Mac OS XではMach-O formatが使用されます。 Windowsは別の静止画を使用します:PE format

関連する問題