問題タブ [binary-reproducibility]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - すべてのビルドで exe ファイルが変更されるのはなぜですか?
同じプロジェクトを (何も変更せずに) ビルドすると、バイナリの異なるexe ファイルが生成されます。それらの一部の小さな領域が異なります。空のプロジェクト、バージョン情報 (およびビルドごとの自動インクリメント) がオフになっています。
なぜそれが起こるのですか?また、同じプロジェクトに対して Delphi で同等のバイナリ ファイルを生成することは可能ですか?
c++ - 再現可能なオブジェクト コード生成 c++
C++ コンパイラを使用してプロジェクトをビルドする場合、ソース コードに変更がなければ、生成されたバイナリが影響を受けないことを確認できますか? ソースを再コンパイルするたびに、バイナリの md5 チェックサムが影響を受けるようです。コンパイルの時間は、生成されるバイナリに何らかの影響を与えていますか? 繰り返し可能なコンパイル結果を生成するにはどうすればよいですか?
linux - 同じ Linux カーネルを 2 回ソースをビルドして同じチェックサムを取得する方法
同じ Linux Kerneltwice (同じソース、同じ環境、同じオプション、同じコンパイラ) をビルドし、同じチェックサムを取得できるかどうかを調べています。誰でもその方法を知っていますか?
c# - C# が同じソースコードに対して異なる EXE を生成するのはなぜですか?
C# アプリケーションを再コンパイルするたびに、異なる MD5 署名を持つ EXE が作成されます。同じマシンで数分間隔で再コンパイルしています。同じソースコードから同じ出力が得られないのはなぜですか? これを修正する方法はありますか?
c++ - Visual C++ でのバイナリの再現性
Visual C++ で同じコードを強制的に同じバイナリを生成する方法はありますか? PE のタイムスタンプをオフにするか、PE のタイムスタンプを強制的に固定値にしますか?
c# - C#アプリケーションの再構築時に常にバイトごとに同一の.exeを生成するにはどうすればよいですか?
最初に、この質問をする理由について少し背景を説明します。
私は現在、厳しく規制された業界で働いているので、私たちのコードは公式のテストハウスによって非常に注意深く見守られています。これらのテストハウスは、コードをビルドして、毎回まったく同じである.exeまたは.dllを生成できることを期待しています(明らかにコードを変更する必要はありません!)。作成した実行可能ファイルのMD5とSHA1をチェックして、これを確認します。
この時点まで、私は主にC ++でコーディングしてきましたが、(いくつかのプロジェクト設定を微調整した後)プロジェクトを同じMD5/SHA1に一貫して再構築することができました。現在、プロジェクトでC#を使用していますが、再構築後にMD5を一致させるのに非常に苦労しています。ファイルのPEヘッダーに「タイムスタンプ」があり、それらが0にクリアされていることを認識しています。また、.exeのGUIDがあり、これも000000にクリアされていることも認識しています。 ...など。ただし、ファイルはまだ一致していません。
CFF Explorerを使用してPEヘッダーを表示および編集し、時刻と日付のスタンプを削除しています。バイナリ比較ツールを使用した後、.exeには異なる(両方とも非常に小さい)バイトのブロックが2つしかありません。
不整合なブロックの1つは、ASCIIでファイルのパスを詳細に示すバイナリコードの直前*Project*\obj\Release\xxx.pdb
に表示されます。
編集:これは* .pdbファイルのGUIDであることがわかっていますが、エラーを発生させずに変更できるかどうかはまだわかりません!?
もう1つのブロックは、関数名のように見えるものの中央に表示されます。(典型的なセクション)AssemblyName.GetName.Version.get_Version.System.IO.Ports.SerialPort.Parity.Byte.<PrivateImplementationDetails>{
次に、別のコードブロック:
4A134ACE-D6A0-461B-A47C-3A4232D90816
に続く:
"} .ValueType .__ StaticArrayInitTypeSize=7。$$method0x60000ab-1.RuntimeFieldHandle.InitializeArray`...など。
どんなアイデアや提案も大歓迎です!
c - Solaris cc は、コンパイルごとに異なる情報を実行可能ファイルに埋め込みますか?
こんばんは
これはVC++について以前に尋ねられましたが、Solarisの回答に興味があります。
次の簡単な C コードをコンパイルしてリンクしています。
次のコマンドを使用します。
これを数回実行して、実行可能ファイル hello2 と hello3 を取得します。これは、同じコンパイラを使用して同じマシン上で、同じディレクトリで異なる時間に行われています。
実行可能ファイルのサイズは同じですが、 diff はバイナリが異なると報告し、 cmp -l は異なる場所の長いリストで夢中になります。
実行可能ファイルを区別するためにどのccが実行可能ファイルに埋め込まれているか知っている人はいますか? タイムスタンプ?
編集: Chrisが以下で提案したように実行可能ファイルを削除すると、diffは2つの実行可能ファイルを同一として報告します。
乾杯、
delphi - Delphi 6 で 2 回コンパイルし、バイナリで同じチェックサムを取得する
バイナリ/ソース コードの検証の目的で、同じコンピューターで 2 週間間隔で 2 つのコンパイルを行い、バイナリを同一にして、チェックサム テストに合格できるようにしたいと考えています。
これまでのところ、コンパイラによってタイムスタンプがバイナリに書き込まれる可能性が最も高いことがわかりました。この msdn の記事に従って、dumpbin /rawdata の結果を比較することで、これを回避できます。
http://support.microsoft.com/kb/164151
ただし、ダンプビンの結果は依然として約 10 か所で異なり、たとえば、何らかのタイムスタンプ (A1 73 から C4 76 への変更) のように見えます。
これは、デルファイ コンパイラがコード/データ セクションに入れているタイムスタンプだと思いますが、これがどこで発生しているのか、またはオフにする方法がわかりません。さまざまなコンパイラ/リンカー オプションをいじっても、この動作は変わりません。
どんな助けでも大歓迎です。
c++ - 同じプロジェクトをビルドすると、開発者ごとに異なる EXE ファイルが生成される理由
私のチームと私は VC++ 6 プロジェクトを開発しています。私たちは皆、同じコードベース (バージョン管理システムを使用) を使用しており、すべてのコンパイラ/リンカー/環境設定 (インクルード ディレクトリの順序を含む) は、私たちが知る限り、まったく同じです。もちろん、同じサービス パック (VC6 SP6) で同じ VC++ バージョンを使用しています。
問題は、私たち一人一人が構築する EXE が少しずつ異なることです。
同じコンピューターで EXE をビルドするたびに、リンカーがタイムスタンプを保存するファイルに 3 つの場所があることを知っています。私はこれらの違いについて話しているのではありません。
EXE ファイルの長さはまったく同じですが、EXE を比較すると、1000 バイトもの違いがあります。これらのバイトの多くは、値が 0x20 異なります。
何が原因でしょうか?
編集:ビルドをデバッグします(実際には、リリースを確認していませんでした)。
編集: 違いは、テキスト文字列ではなく、バイナリ セクションにあります。
編集: すべての開発者は、ソースと製品に同じドライブ/フォルダー名を使用しています。
vb6 - VB 6 実行可能ファイルの 2 つのコピーが同じコード ベースからのものであることをどのように確認しますか?
複数のリリースを経たバージョン管理下にあるプログラムがあります。今日、誰かがどうにかしてプログラムの古いコピーを指摘し、その後修正されたバグに遭遇したという状況が発生しました。戻って、プログラムの古いコピーをすべて削除したいのですが (バージョン管理が一般的になる前から、それらを保持することは会社のポリシーであり、もはや必要ではありません)、それができることを確認する方法が必要です。 「古いものはこのコミットから出てきたので、これは同じはずです」と言うよりも優れた、まったく同じ実行可能ファイルを生成します。
私の最初の考えは、単純に実行可能ファイルを MD5 ハッシュし、ハッシュ ファイルをソース管理に保存して、それを処理することでしたが、解析することさえできない問題に遭遇しました。
実行可能ファイルが生成されるたびに (方法: Open Project. File > Make X.exe)、ハッシュが異なるようです。プロジェクトが一見ランダムな方法で開かれるたびに、Visual Basic がファイルを混乱させることに気付きましたが、それが実行可能ファイルに組み込まれるとは思いませんでした。また、それが実際に起こっているという証拠もありません。それを防ぐために、同じIDEセッション内で実行可能ファイルを複数回生成し、ハッシュをチェックしようとしましたが、毎回異なっていました。
だから〜だ:
- 実行可能ファイルを生成
- MD5 チェックサムを生成します。
md5sum X.exe > X.md5
- 現在の実行可能ファイルの MD5 を確認します。
md5sum -c X.md5
- 新しい実行可能ファイルを生成
- 新しい実行可能ファイルの MD5 を確認します。
md5sum -c X.md5
- 計算されたチェックサムが一致しないため、検証に失敗します。
MD5またはVB 6が実行可能ファイルを生成する方法について何かを理解していませんが、MD5を使用するという考えにも結婚していません。2 つの実行可能ファイルが実際に同じであることを確認するためのより良い方法があれば、私は耳を傾けます。
よろしくお願いします。