2013-01-13 8 views
7

まず、この質問が学校/宿題に関連しているという記録を述べたいと思います。コンピュータ間でのオブジェクトファイルの互換性

たとえば、コンピュータCP1とCP2が同じオペレーティングシステムと機械語を共有しているとします。 CプログラムがCP1上でコンパイルされている場合、そのプログラムをCP2に移動するには、ソースコードを転送してCP2で再コンパイルするか、単にオブジェクトファイルを転送する必要があります。

私の答えは、オブジェクトファイルで十分です。 Cコードはコンパイラによってアセンブリに変換され、アセンブラによってマシンコードにアセンブルされます。アーキテクチャは同じマシンコードとオペレーティングシステムを共有しているため、問題はありません。

しかし、私はそれについてもっと考えると、より混乱するようになってきています。

私の質問は以下のとおりです。そのオブジェクトファイルを参照していない実行ファイル以来

a)に、私はリンクがなかったと仮定しています。 CP2にリンクする際に問題が生じるのでしょうか?

b)コードがC11をCP1で使用していても、CP2のコンパイラがC99のみであっても問題ありませんか?コードがコンパイル/アセンブルされたらこれは無関係であると私は思っています。

c)質問には、共有/ダイナミックリンクライブラリが指定されていません。これは、プログラムが.dll/.so/.dylibファイルに依存しない場合にのみ実際に動作します。そうしないと、CP2でも必要になります。

あまりにも多くの問題があるように感じ、私は今どのように漠然とした質問をしているのかを考えると、単に再コンパイルするほうが安全だと感じています。

Halp!

+0

コンピュータ間でオブジェクトファイルをコピーするdistccでは、C言語の場合でも、すべてのノードで同じバージョンのコンパイラを使用することを推奨しています。 – aschepler

答えて

3

答えは、それに依存します。 Cプログラムをコンパイルし、オブジェクトファイルを別のコンピュータにリンクするように移動すると、そのファイルは機能するはずです。しかし、endiannessname manglingのような要因のため、あなたのプログラムは意図したとおりに動作せず、実行しようとするとクラッシュすることさえあります。

C11は、C99コンパイラではサポートされていませんが、ソースがコンパイルおよびアセンブルされているかどうかは関係ありません。

ソースが1台のマシン上のライブラリでコンパイルされている限り、他のコンピュータ上のファイルをリンクまたは実行するライブラリは不要です(スタティックライブラリのみ、ダイナミックライブラリはあなたがアプリケーションを実行しているコンピュータ上にいてください)。これは、プログラムが意図したとおりに動作しないかクラッシュする前と同じ問題に遭遇しないように、プログラムを独立させるべきだと言いました。

EABIをサポートするコンパイラを使用すると、これらの問題に遭遇することはありません。 EABIをサポートするコンパイラは、他のコンパイラで生成されたコードと互換性のあるオブジェクトコードを作成するため、異なるコンパイラで生成されたオブジェクトコードで1つのコンパイラで生成されたライブラリをリンクできます。

私はこの前にやってみましたが、それほど多くはありませんでしたが、最近ではありません。したがって、私の情報は100%正確ではないかもしれません。

+0

"ライブラリは必要ありません" - 静的リンクの場合にのみ当てはまります。ダイナミックライブラリはあなたのプログラムによってのみ参照され、コンパイルされません。プログラムが見つからない場合、プログラムは起動しません。 –

+0

これをキャッチしてくれてありがとう、編集しました。 – syb0rg

+0

あなたのリビジョン2は実質的に正しいです。ネーム・マングリングとランタイムの互換性について言及する必要があります。新しい[ABI](http://en.wikipedia.org/ja/)のときに、さまざまな種類のオブジェクト・ファイル出力を実際に求めることができるシステムがあります。/wiki/Application_binary_interface)は非常に優れているので、ツールチェインを書き直す価値があります。 – jthill

1

a)「オブジェクトファイル」という言葉は、リンクされたバイナリを参照するために使用されていると聞いています。だから多分彼らは "バイナリ"を意味します。私は別のマシン上でリンクすると、別のコンパイラを持っていると問題が起きる可能性があると言うでしょう - オブジェクトファイルのフォーマットが標準化されていない限り、私はそれについてはわかりません。

b)異なる標準やコンパイラを使用することは、バイナリコード(静的にリンクされている場合)には関係ありません。動的libの関数に依存する場合、問題が発生する可能性があります。どちらに答えますか?:はい、これは問題になります。必要なすべてのダイナミックライブラリが正しいバージョンに含まれていないと、プログラムは起動しません。再びリンクモード(静的対動的)に依存します。

0

Q:コンピュータCP1とCP2が同じオペレーティングシステムと機械語を共有しているとします。

A:そして、あなたは両方のコンピュータ

Q上の.exeの同じことを実行することができます:CプログラムはCP2に移動するために、CP1上でコンパイルされている場合は、ソースコード

を転送する必要があります

A:いいえ。再コンパイルする場合は、ソースコードのみが必要です。異なる、互換性のないCPUやOSの場合にのみ、再コンパイルする必要があります。

「オブジェクトファイルは、」一般的に、すべてのプログラムの実行のために必要されていません。

http://en.wikipedia.org/wiki/Object_files

オブジェクトファイルは通常、直接実行可能ではありませんリロケータブル形式のマシンコード を含むファイルです。オブジェクトファイルは、 アセンブラ、コンパイラ、またはその他の言語トランスレータによって生成され、リンカに入力された として使用されます。

「実行可能プログラム」には、1つ以上の「共有ライブラリ」(別名.dll)が必要な場合があります。この場合、同じ制限が適用されます。共有ライブラリは、まだ常駐していない場合は、.exeとともにコピーする必要があり、CPUおよびOSとも互換性がなければなりません。

最後に、 "scripts"はではなく、を再コンパイルする必要があります。コンピュータからコンピュータにスクリプトを自由にコピーすることができます。しかし、各コンピュータには、スクリプトを実行するための "インタプリタ"が必要です。Perlスクリプトには、Perlインタプリタ、Pythonスクリプト、Pythonインタプリタなどが必要です。