2017-12-13 29 views
0

私が理解している限り(私が間違っていると私を修正します)、コンパイラの出力は、使用されるアーキテクチャのバージョン、コンパイラ、およびオペレーティングシステムによって異なります。異なるOSバージョンのコンパイラ出力

私は、ubuntuリリース16.04 x84-64を使用し、gccバージョン5.4(または他のOS、arch、コンパイラの組み合わせなど)でcファイルをコンパイルしています。

今まで理解してきたように、同じcファイルをコンパイルして、別のubuntuリリースで同じアーチとコンパイラバージョンを使用すると、同じアセンブリコードを生成するはずです。

これが間違っているという印象がありましたが、これはどのように可能ですか?

コンパイラの出力は、特定のOSのリリースによって異なりますか?

例の1つは、異なる2つのubuntuバージョンで異なるアセンブリを受け取り、https://github.com/tbuktu/libntruをコンパイルしています。

+0

コンパイラの出力は、最適化フラグにも依存します(その中には* many *があります)。 –

+0

異なるOSバージョンで同じコンパイラバージョンをどのように正確に確認しましたか?彼らは異なった構成が可能でしょうか?例えば[それらのうちの1つは '--enable-default-pie'](https://stackoverflow.com/questions/43367427/32-bit-absolute-addresses-no-longer-allowed-in-x86-64-linux/ 46493456#46493456)、あるいは '-fstack-protector'の別のデフォルト? –

+0

どのように正確にasmを比較しましたか? [gcc -O3 -Sを使ってコンパイラの*実際のasm出力を取得しましたか](https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-出力)、またはリンクされたバイナリを逆アセンブルしましたか?あるいはバイナリを 'cmp'などと比較しましたか? –

答えて

2

異なるOSには、異なるバージョンのデフォルトライブラリがインストールされている可能性があります(最終アプリケーションにリンクされます)。したがって、最終結果はわずかに異なる可能性があります。

+1

ほとんどのものは、リンクされていないダイナミックライブラリを使用しています。これらのライブラリの*ヘッダ*は異なっていて、機能シグニチャやタイプが異なる場合があります。通常は、gccに付属しているCRTスタートアップコード( '/ usr/lib/crt * .o')のみがリンクされています。とにかく、それはコンパイラのasm出力の一部ではなく、リンカのバイナリ出力の一部です。 –

1

あなたがいくつかのubuntuバージョンをやっているだけでは、全体的なアーキテクチャの違いがテストに反映されないかもしれないし、同じコンパイラファミリーを持つ同じOSファミリで長い間変化しないかもしれないので、時間。同じディストリビューションの古いバージョンを取得するようなテストの違いが見られる可能性が高い場所では、新しい/最新のコンパイラはapt-getとして直接移植/サポートされません。多分あなたは手作業で作業するようにすることができますが、特にgccは、コードが比較的最近の以前のバージョンまたはそれ以降のバージョンでのみビルドされていて、gccがgccをビルドするのが難しいという点では本当に悪いです。私が最初に目にすることは、厳密にはgccのバージョンの違いによるもので、コンパイラの違いを見ることになります。

より良いテストは、単純な.cファイルをとり、任意のバージョン(そのシステム用に構築されたgccの同じバージョンを使用)と任意のバージョンのubuntu/linuxをビルドします。違いをより迅速に表示する必要があります。

2つの異なるコンパイラでは、合理的なサイズのプロジェクトやナレッジベースのターゲットを絞った小さなコードサンプル(llvm/clangとgccなど)の違いを表示する必要があります。同じコンパイラやコンパイラファミリの異なるバージョンは、定義によっていくらかの違いを示していますが、6.x vs 6.x + 1 gccでは見た目が分かりますが、しばしばそうではありませんがgcc 3.x対gcc 7.xの場合は、テストによってはそこから絞り込むことができます。

コンパイラとコンパイラとの違いは、同じOSやシステムで違いが見られると予想されます。

システムとシステムの違いが同じコンパイラで異なるため、さまざまな理由があります。

そして、上記の組み合わせでも当然の違いが示されます。

大きな問題は、コンパイラやコンパイラの設定やオペレーティングシステムを変更した場合、同じCソースコードが同じように構築されることを期待してはいけないということです。それは、上記のいずれかに基づいて、違いがなくても巨大な違いにもなります。最適化やその他のチューニング設定から非常に簡単に開始し、そこから進みます。

+0

これは何度もstackoverflowで尋ねられ、答えられました –

関連する問題