C++ コンパイラを使用してプロジェクトをビルドする場合、ソース コードに変更がなければ、生成されたバイナリが影響を受けないことを確認できますか? ソースを再コンパイルするたびに、バイナリの md5 チェックサムが影響を受けるようです。コンパイルの時間は、生成されるバイナリに何らかの影響を与えていますか? 繰り返し可能なコンパイル結果を生成するにはどうすればよいですか?
4 に答える
バイナリを逆アセンブルし、出力に対して md5 を実行できます
MacOSX での例
otool -tV a.out | md5
ee2e724434a89fce96aa6b48621f7220
しかし、グローバルデータを見逃しています...(含めるパラメータもあるかもしれません)
バイナリをチェックするmd5の問題について答えています...他の人が書いているように、ソースを管理してシステムを構築する方法も注目すべきことです
ツールチェーンとOSに大きく依存すると思います。たとえば、実行可能なヘッダーの 1 つにタイムスタンプが含まれている場合、結果の MD5 が常に異なることがわかります。
あなたが達成しようとしている最終結果は何ですか(つまり、なぜそれらが同一であることが非常に重要なのですか)..?
Visual Studio の md5 チェックサム比較を行うことはできません。Visual Studio の通常のリリース バージョンの .exe ファイルの場合、再コンパイルごとに 3 つの場所が変わります。そのうちの 2 つはタイムスタンプであり、3 つ目は、Visual Studio が .exe のバージョンとヘルパー ファイルを照合して同期していることを確認するために使用する一意の GUID です。
3 つの変化するフィールドをゼロにするツールを作成することは可能かもしれませんが、ファイルを解析するのがどれほど簡単かはわかりません。
また、.dll を呼び出している場合、私の記憶が正しければ、生成されたファイルでより多くの一意の識別子を取得できます。
デバッグ バージョンは別の話です。他にもたくさんの違いがあると思います。
make
ソースが変更されない場合にコードを再コンパイルしないようにするなど、インクリメンタル ビルド システムを使用します。
コンパイルで同じソースから同一のバイナリを作成できる場合もあれば、そうでない場合もありますが、コンパイラによって異なります。ほとんどの場合、生成されたバイナリのどこかに現在の時刻が埋め込まれます。