dpkg-buildflags(1)

名前
パッケージのビルドの際に用いられるビルドフラグを返却する

書式
dpkg-buildflags [option...] [command]

説明
dpkg-buildflags は、Debian パッケージのビルドの際に用いられるコンパイルオプションを示すツールである。 デフォルトのフラグはベンダによって定義されるが、いくつかの方法によって上書きすることができる。

1.  システムワイドな /etc/dpkg/buildflags.conf

2.  現在のユーザの $XDG_CONFIG_HOME/dpkg/buildflags.conf。$XDG_CONFIG_HOMEのデフォルトは $HOME/.config である。

3.  ユーザ毎に一時的に設定される環境変数の値 (環境変数 セクションを参照のこと)。

4.  パッケージのメンテナによって debian/rulesで設定された環境変数の値 (環境変数 セクションを参照のこと)。

設定ファイルには、二種類のディレクティブが含まれる。

SET flag value
    flag という名前のフラグの値を value で上書きする。

STRIP flag value
    flag という名前のフラグから、value で指定されたビルドフラグを取り除く。

APPEND flag value
    flag という名前のフラグに対して、value で指定されたオプションを追加する。対象のフラグに値が設定されている場合は、追加する値の前にスペースを付加すること。

PREPEND flag value
    flag という名前のフラグに対して value で指定されたオプションを値の先頭部分に付加する。対象のフラグに値が設定されている場合は、追加する値の後ろにスペースを付加すること。

設定ファイルには、ハッシュ (#) から始まるコメント行を含めてもよい。空行は無視される。

コマンド

--dump
    標準出力に、すべてのコンパイルフラグとその値を出力する。1 行に 1 つのフラグが、等号記号でフラグ名と値とを区切った ("flag=value") 形式で出力される。これはデフォルトの動作である。

--list
    現在のベンダによってサポートされるフラグの一覧を (1 行に 1 つずつ) 出力する。詳細については、サポートされるフラグ セクションを参照のこと。

--status
    dpkg-buildflags の動作を示すのに便利な情報を表示する。これには関連する環境変数、現在のベンダ、すべての機能フラグの状態が含まれる。加えて、最終的なコンパイラのフラグが、元々のフラグの状態とともに表示される。 これは debian/rules から実行されることを想定されており、結果として、ビルドのログを用いた、使用されているビルドフラグの明確なトレースが実現する。ビルドフラグに関連した問題を調査するのに有用である。

--export=format
    標準出力に、シェル形式 (format が sh の場合) もしくは make 形式 (format が make の場合) で、定義済のすべてのコンパイルフラグをエクスポートする。format が configure の場合、出力形式は、./configure コマンドで使用可能な形式となる。format の値が指定されない場合は sh が仮定される。大文字から始まるコンパイルフラグのみが対象となる。それ以外のものは、現在の環境に適合していないものと見なされる。

--get flag
    指定されたフラグの値を標準出力に出力する。フラグが存在している場合は 0、それ以外の場合は 1 が返却される。

--origin flag
    --get によって返却された値の提供元を表示する。フラグが存在している場合は 0、それ以外の場合は 1 が返却される。origin は、以下の値のいずれかとなる:

    vendor
        ベンダによって設定された本来のフラグ

    system
        システムワイドな設定ファイルにより設定、変更されたフラグ

    user
        ユーザ毎の設定により設定、変更されたフラグ

    env 環境固有の設定により設定、変更されたフラグ

--query-features area
    指定された領域 (area) で有効化された機能 (Feature) を出力する。現在認識される領域は hardening のみである。領域が認識されている場合は 0 を、それ以外の場合は 1 を返却し終了する。

    The output format is RFC822 header-style, with one section per feature. For example:

      Feature: pie
      Enabled: no
      Feature: stackprotector
      Enabled: yes

--help
    利用方法を表示して終了する。

--version
    バージョン情報を表示して終了する。

サポートされるフラグ

CFLAGS
    C コンパイラのオプション。デフォルトの値はベンダによって設定されるが、-g およびデフォルトの最適化レベル (通常 -O2 だが DEB_BUILD_OPTIONS環境変数に noopt が設定されている場合は -O0) も含まれている。

CPPFLAGS
    C プリプロセッサのオプション。デフォルト値: 未定義

CXXFLAGS
    C++ コンパイラのオプション。CFLAGS と同等

FFLAGS
    Fortran コンパイラのオプション。CFLAGS と同等

LDFLAGS
    実行ファイルもしくは共有オブジェクトのリンクの際にコンパイラに渡されるオプション (リンカが直接呼び出される場合は、-Wl および , がオプションから削除される)。デフォルト値: 未定義

ファイル

/etc/dpkg/buildflags.conf
    システムワイドな設定ファイル

$XDG_CONFIG_HOME/dpkg/buildflags.conf もしくは $HOME/.config/dpkg/buildflags.conf
    ユーザ毎の設定ファイル

環境変数
同じ動作を行う環境変数が 2 組存在する。1 つ目の (DEB_flag_op) を debian/rules 内で用いてはならない。これは、デフォルトのフラグとは異なる設定でソースパッケージをリビルドしたいユーザ向けの設定である。2 つ目の方法 (DEB_flag_MAINT_op) は debian/rules 内でのみ使用すべきである。これは、パッケージのメンテナがビルドフラグを変更する際に使用すること。

DEB_flag_SET
DEB_flag_MAINT_SET
    この変数は、flag の値を強制的に設定したい場合に使用すること

DEB_flag_STRIP
DEB_flag_MAINT_STRIP
    この変数は、flag の値から削除したいオプションがある場合に使用すること。削除したいオプションは、スペースで区切ったリスト形式で指定する。

DEB_flag_APPEND
DEB_flag_MAINT_APPEND
    この変数は、flag の値に追加したいオプションがある場合に使用すること。

DEB_flag_PREPEND
DEB_flag_MAINT_PREPEND
    この変数は、flag の値の先頭部分に追加したいオプションがある場合に使用すること。

DEB_BUILD_MAINT_OPTIONS
    この変数は、hardening オプションによるビルドフラグの様々な要塞化の有効化、無効化を行うために使用される。詳細は 要塞化 セクションを参照のこと。

要塞化
幾つかのコンパイルタイムオプションを (以下で説明する) 使用することで、生成されるバイナリをメモリ破壊攻撃から保護したり、コンパイル時に追加の警告メッセージを表示させたりすることができる。以下で注記されていない限り、これらのオプションは、サポートされているアーキテクチャにおいて、デフォルトで有効化される。

各要塞化機能は、DEB_BUILD_MAINT_OPTIONS 環境変数の hardening 値において "+" や "-" をつけることで有効化/無効化できる。例えば、"pie" 機能を有効化して "fortify" 機能を無効化する場合、debian/rules で次のように設定する:

  export DEB_BUILD_MAINT_OPTIONS=hardening=+pie,-fortify

特別な機能 all により、すべての要塞化機能を一度に有効化、無効化することができる。次のようにして、すべての機能を無効化した上で "format" と "fortify" のみを有効化することができる:

  export DEB_BUILD_MAINT_OPTIONS=hardening=-all,+format,+fortify

format
    この設定 (デフォルト有効) により、CFLAGS および CXXFLAGS に -Wformat -Werror=format-security が追加される。これにより、不適切なフォーマット文字列の使用に関する警告が行われ、フォーマット関数が潜在的にセキュリティ問題を引き起こすような使用をされている場合に処理を失敗させる。現在、これは、printf と scanf 関数の呼び出しで、フォーマット文字列が文字列リテラル以外かつフォーマットに関する引数がないもの、例えば printf("%s", foo); ではなく printf(foo); のようなものについて警告する。信頼できない入力からもたらされたフォーマット文字列が "%n" を含んでいる場合、呼び出しはセキュリティホールとなりうる。

fortify
    この設定 (デフォルト有効) により、CPPFLAGS に -D_FORTIFY_SOURCE=2 が追加される。コード生成の際に、コンパイラはバッファサイズに関して (可能な場所では) 多くの情報を収集し、安全でないバッファ長の制限のない関数の呼び出しを、制限のある関数の呼び出しに置換する。これは、古い汚いコードには特に有用である。これに加え、書き込み可能なメモリ上にあるフォーマット文字列で '%n' を含むものが抑止される。アプリケーションがこうしたフォーマット文字列に依存している場合は、個別に対処する必要がある。 このオプションが効果を発揮するためには、ソースコードは -O1 以上でコンパイルされている必要がある。

stackprotector
    この設定 (デフォルト有効) により、CFLAGS および CXXFLAGS に -fstack-protector --param=ssp-buffer-size=4 が追加される。これにより、スタックの上書きに対する安全性チェックが追加され、多くの潜在的なコードインジェクション攻撃が抑止される。(アプリケーションにもよるが) 最良のケースでは、コードインジェクションの脆弱性を単なるサービス拒否に留めたり、無力化したりすることができる。 この機能は、glibc (もしくは __stack_chk_fail を提供する他の実装) へのリンクが必要であるため、-nostdlib や -ffreestanding といったオプションでビルドする際には、無効にする必要がある。

relro
    この設定 (デフォルト有効) は、LDFLAGS に -Wl,-z,relro を追加する。プログラムがロードされる際、ELF メモリセクションの幾つかは、リンカから書き込まれる必要がある。この設定により、ローダはプログラムに制御を引き渡す前に、こうしたセクションを読み取り専用にする。これにより、GOT を上書きする攻撃の大半が抑止される。このオプションが無効な場合、bindnow も同様に無効となる。

bindnow
    この設定 (デフォルト無効) は LDFLAGS に -Wl,-z,now を追加する。これにより、プログラムがロードされる時点ですべての動的なシンボルが解決されるため、PLT 全体を読み取り専用とすることが可能となる (上の relro を参照のこと)。relro が有効でない場合、このオプションは有効化できない。

pie この設定 (デフォルト無効) は CFLAGS および CXXFLAGS に -fPIE を追加し、LDFLAGS に -fPIE -pie を追加する。PIE (位置独立実行形式) は、幾つかのカーネルバージョンでサポートされるアドレス空間配置のランダム化 (ASLR) を行う上で必要となる。スタックとヒープ (brk とmmap) 内のデータ領域では、ASLR が既に必須となっているが、コード領域も位置独立でコンパイルされる必要がある。共有ライブラリでは、(-fPIC) によりこれが既に行われているので、自動的に ASLR が行われるが、バイナリの .text 領域は ASLR を行うために、PIE でビルドされる必要がある。これが実現すると、メモリ破壊攻撃を行う際にリターンさせる先のアドレスが静的ではなくなるため、ROP (Return Oriented Programming) 攻撃が、より困難となる。 これは -fPIC と互換性がないため、共有ライブラリをビルドする際は、設定を行わないよう注意すること 加えて、PIE は汎用レジスタにより実装されているため、幾つかのアーキテクチャ (特に注意すべきは i386) では、text セグメントの負荷が高いアプリケーションにおいて最大 15% 程度のパフォーマンス低下が見込まれる。もっとも、大半の場合、パフォーマンス低下は 1% 未満である。多くの汎用レジスタを有するアーキテクチャ (amd64 など) では、前述した最悪の場合であっても問題は発生しない。

翻訳者
高橋 基信 <monyo@monyo.com>. 喜瀬 浩 <kise@fuyuneko.jp>. 関戸 幸一 <sekido@mbox.kyoto-inet.or.jp>. 鍋谷 栄展 <nabe@debian.or.jp>. 倉澤 望 <nabetaro@debian.or.jp>. 石川 睦 <ishikawa@linux.or.jp>. 鵜飼 文敏 <ukai@debian.or.jp>. 中野 武雄 <nakano@apm.seikei.ac.jp>.

翻訳校正
Debian JP Documentation ML <debian-doc@debian.or.jp>.