Documentation index

ビルド時のファイルシステムパス(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/rulesfixfilepath フラグ を追加すると、-ffile-prefix-map=OLD=NEW フラグを有効化できます。

export DEB_BUILD_MAINT_OPTIONS = hardening=+all reproducible=+fixfilepath

パッケージの中にはコンパイラオプションをビルド結果に記録するものもあるので注意してください。

文字列のハッシュ表を並び替えることはありませんし、最終的なバイナリファイルは元のファイルシステムパスに依存したままです。

他のツールが生成した中間ファイルにも適用しなければならないのが難しいところです。 無作為なファイル名 を使用することが多いので、ビルド時のファイルシステムパスを固定するだけでは不十分なのです。

GCC の開発者グループでは build-path-prefix-map の仕様が検討されています。

  1. debugedit はバイナリファイルに書き込んだビルド時に使用したファイルシステムパスを、あらかじめ指定した値へ直接書き換えることができます。 


Documentation index

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