ビルド時のファイルシステムパス(Build path)
ツールによっては、ビルド時に使用したソースコードのファイルシステムパスをビルド結果に記録します。
ほとんどのコンパイラは、デバッグ情報としてオブジェクトに対応するソースコードの位置を書き込みます。
gzip の引数へ -n
を指定するように、出力結果へファイルシステムパスを書き込まないようにできるツールもあります。
他のツールに同じような機能を追加する修正パッチを提案するのは、比較的簡単かもしれません。
とはいえ、ほとんどの場合ビルド時のファイルシステムパスを削除したり、指定した値で正規化するような後処理が必要になるでしょう。
特に、デバッグシンボル に含まれるファイルシステムパスを指定した値1へ変更できるような後処理ツールは今のところ存在しません。
ビルド環境の定義にビルド時のファイルシステムパスを含めるのは 回避策になりますが、reprotest
はそれを変更してしまうので、再現性を評価するのが難しくなります。
問題を回避する役に立ちそうなコンパイラフラグは次のとおりです。
-fdebug-prefix-map=OLD=NEW
デバッグ情報から接頭辞のディレクトリ名を除去します(全てのバージョンの GCC と Clan 3.8 で利用できます)。-fmacro-prefix-map=OLD=NEW
-fdebug-prefix-map
と似た機能ですが、assert
呼び出しで__FILE__
マクロを使うなど、再現性の問題に配慮しています(GCC8 と Clang 10 で利用できます)。-ffile-prefix-map=OLD=NEW
-fdebug-prefix-map
と-fmacro-prefix-map
を同時に指定したことにするエイリアスです(GCC8 と Clang 10 で利用できます)。
Debian Buster でリリースされたバージョン 1.19.1 以上の dpkg では、それぞれのパッケージについて、debian/rules
で fixfilepath
フラグ を追加すると、-ffile-prefix-map=OLD=NEW
フラグを有効化できます。
export DEB_BUILD_MAINT_OPTIONS = hardening=+all reproducible=+fixfilepath
パッケージの中にはコンパイラオプションをビルド結果に記録するものもあるので注意してください。
文字列のハッシュ表を並び替えることはありませんし、最終的なバイナリファイルは元のファイルシステムパスに依存したままです。
他のツールが生成した中間ファイルにも適用しなければならないのが難しいところです。 無作為なファイル名 を使用することが多いので、ビルド時のファイルシステムパスを固定するだけでは不十分なのです。
GCC の開発者グループでは build-path-prefix-map の仕様が検討されています。
Introduction
Achieve deterministic builds
- SOURCE_DATE_EPOCH
- 確実なビルドシステム(Deterministic build systems)
- 揮発性のある入力データは消える場合がある(Volatile inputs can disappear)
- 入力データの順序を固定する(Stable order for inputs)
- 値を初期化する(Value initialization)
- バージョン情報(Version information)
- タイムスタンプ(Timestamps)
- タイムゾーン(Timezones)
- ロケール(Locales)
- アーカイブのメタデータ(Archive metadata)
- 出力データの順序を固定する(Stable order for outputs)
- 無作為性(Randomness)
- ビルド時のファイルシステムパス(Build path)
- システムイメージ(System images)
- JVM
Define a build environment
- ビルド環境に含む要素(What's in a build environment?)
- ビルド環境を記録する(Recording the build environment)
- ビルド環境の定義における戦略(Definition strategies)
- Proprietary operating systems
Distribute the environment
Verification
Specifications
Follow us on Twitter @ReproBuilds, Mastodon @reproducible_builds@fosstodon.org & Reddit and please consider making a donation. • Content licensed under CC BY-SA 4.0, style licensed under MIT. Templates and styles based on the Tor Styleguide. Logos and trademarks belong to their respective owners. • Patches welcome via our Git repository (instructions) or via our mailing list. • Full contact info