2013-02-01 9 views
11

私は、同じバイナリ入力を生成できるようにする必要がある、非常に規制された環境で作業し、製品をビルドするたびに同じソースコードを与えます。現在g ++の古代版を使用していますが、ビルドからビルドに変更されるバイナリの日付/時刻などは書き込まれないようにパッチが適用されていますが、g ++ 4.7.2に更新したいと考えています。誰かがパッチを知っているのですか、または2つの同一のソースコードを取り、同じバイナリ出力を生成するために私が探す必要があることについての提案をしていますか?g ++で確定的なバイナリ出力を生成する方法は?

答えて

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ブランチにあるいくつかのパッチがあります。

+0

PWD =/procの/セルフ/ CWDは何をしますか? –

+3

@StevenBehnkeデバッグ情報を使ってビルドします。 Linuxでは、GCCは 'PWD'(シェルが現在の作業ディレクトリに設定する)を現在のコンパイルディレクトリとして記録します。ビルドがどのディレクトリで実行されたかにかかわらず、ビルドをビット同一にしたいので、PWDを予測可能な値に設定します。 –

+1

GCCのランダム性の主な用途は何ですか? –

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オプションを持っていますが、それはこの時点ではこれまで完全からです。

関連スレッド:

関連する問題