私は、同じバイナリ入力を生成できるようにする必要がある、非常に規制された環境で作業し、製品をビルドするたびに同じソースコードを与えます。現在g ++の古代版を使用していますが、ビルドからビルドに変更されるバイナリの日付/時刻などは書き込まれないようにパッチが適用されていますが、g ++ 4.7.2に更新したいと考えています。誰かがパッチを知っているのですか、または2つの同一のソースコードを取り、同じバイナリ出力を生成するために私が探す必要があることについての提案をしていますか?g ++で確定的なバイナリ出力を生成する方法は?
11
A
答えて
6
また、ビット同一の再構築に依存し、gcc-4.7.xを使用しています。
PWD=/proc/self/cwd
を設定し、-frandom-seed=<input-file-name>
を使用するほかに、svn://gcc.gnu.org/svn/gcc/branches/google/gcc-4_7
ブランチにあるいくつかのパッチがあります。
5
Debian Reproducible builds projectは、Debianパッケージをバイトごとに標準化しようとしており、最近ではLinux Foundation grantとなっています。
これにはコンパイル以外のものが含まれる場合がありますが、それを見てください。
また@Employedが言ったことに、以下の点を追加した、this articleに私を指摘:
- が
__DATE__
ため__FILE__
- に対処するために一定のフォルダ(例:
/tmp/build
)にソースを入れ、__TIME__
、__TIMESTAMP__
:- libfaketime:https://github.com/wolfcw/libfaketime
- オーバーライドトンホースマクロ
-D
-Wdate-time
または-Werror=date-time
:__TIME__
,__DATE__
または__TIMESTAMP__
のいずれかを使用すると警告または失敗します。 Linuxカーネル4.4では、デフォルトでこれが使用されています。ar
と
- 使用
D
旗を、またはスタンプ -fno-guess-branch-probability
を拭くためにhttps://github.com/nh2/ar-timestamp-wiper/tree/masterを使用します。older manual versionsは、それが非決定論が、not anymoreの源であると言います。これが-frandom-seed
でカバーされているかどうかは不明です。
Buildrootは、パッケージレベルでいくつかのアイデアを与える可能性がありBR2_REPRODUCIBLE
オプションを持っていますが、それはこの時点ではこれまで完全からです。
関連スレッド:
関連する問題
- 1. asp.netで動力学的にテキストボックスを生成する方法
- 2. 必要な確率で乱数を生成する方法は?
- 3. ファイル内のdbgバイナリ出力を読み取る方法は?
- 4. 出力ストリームで作成されたバイナリ出力ファイルの内容
- 5. Railsのデバッグ方法は!バイナリ値だけを出力します
- 6. 別のバイナリでバイナリを定義する方法は?
- 7. unix差分ユーティリティ - < or >なしで出力ファイルを生成する方法?
- 8. PHPで出力を生成する最良の方法はどれですか?
- 9. C++でHTML出力を生成する最良の方法は何ですか?
- 10. M4バイナリ出力
- 11. Mondrian出力からJSONファイルを生成する方法
- 12. レポート出力を生成する最良の方法C#
- 13. g ++でint i = iのエラー/警告を生成する方法は?
- 14. 32ビット固定長のバイナリで整数を出力する
- 15. javacが出力を生成しない
- 16. Node.JSで生成されたchild_processの出力を取得する方法は?
- 17. 効率的な方法でvmstatの出力を解析する
- 18. Cのプログラムカウンタの正確な値を出力する方法
- 19. 電話帳の印刷可能な出力を生成する方法
- 20. C++でのバイナリ入出力
- 21. Adobe AIRで魅力的なウィンドウを作成する方法
- 22. Windowsのバイナリ出力
- 23. フレックスで生成された出力を生成する
- 24. コードなしのカスタムコントロールで出力キャッシュディレクティブを設定する方法
- 25. プリンタで出力可能なプリンタをプログラムで生成する
- 26. g ++ -Eオプションの出力
- 27. 独創的な方法でスードクパズルを生成する
- 28. Amazon EMR/S3の出力を確認する方法は?
- 29. gccにrawバイナリを出力させる方法はありますか?
- 30. システム間の確定的な乱数生成
PWD =/procの/セルフ/ CWDは何をしますか? –
@StevenBehnkeデバッグ情報を使ってビルドします。 Linuxでは、GCCは 'PWD'(シェルが現在の作業ディレクトリに設定する)を現在のコンパイルディレクトリとして記録します。ビルドがどのディレクトリで実行されたかにかかわらず、ビルドをビット同一にしたいので、PWDを予測可能な値に設定します。 –
GCCのランダム性の主な用途は何ですか? –