3

次のようにコンパイルすると、まったく同じバイナリ結果が得られるかどうかを知りたいです。

  1. 同じソースコード
  2. 同じコンパイラ、バージョン、コマンド
  3. 同じ図書館

または、次のようなさまざまなバイナリにつながる可能性のある他の制約もありますか?

  • ソースがコンパイルされた時刻
  • システム、カーネル バージョン
  • その他のビルドツール

ありがとうございました!

4

1 に答える 1

1

コード、ライブラリ、およびコンパイラを修正するだけで、同じ出力が得られるという保証はありません。ご指摘のとおり、コンパイラが実行される環境が影響を与える可能性があります。

  • これは単なるコンパイラではなく、静的に保つ必要があるツールチェーン全体 (リンカー、アセンブラーなど) です。
  • ツールチェーンは、時間の経過とともに更新される動的ライブラリを使用していますか?
  • 環境変数はどうですか?
  • 同じユーザーとして実行していますか? 同じ特権で。

これらの機能をすべて見つけて制御できたとしても、コンパイルは確定的ではない場合があります。GCC 3.3 ドキュメントの具体的な例を次に示します(最近のバージョンでは文言が変更されていることに注意してください)。

-fno-guess-branch-probability

ランダム化されたモデルを使用して分岐確率を推測しないでください。プロファイリング フィードバック (-fprofile-arcs) または __builtin_expect のいずれからも利用できない場合、gcc はランダム化されたモデルを使用して分岐確率を推測することを選択することがあります。これは、同じプログラムでコンパイラを実行すると、異なるオブジェクト コードが生成される可能性があることを意味します。

ハード リアルタイム システムでは、コンパイラの実行ごとに動作が異なるコードが生成されることは望ましくありません。非決定性を最小限に抑えることが最も重要です。このスイッチにより、ユーザーは非決定性を減らすことができますが、最適化が劣る可能性があります。

于 2013-03-06T10:12:06.600 に答える