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 つずつ) 出力する。詳細については、サポートされるフラグ セクションを参照のこと。

--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
    Print the features enabled for a given area. The only currently recognized area is hardening. Exits with 0 if the area is known otherwise exits with 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++ コンパイラのオプション。CFLAFS と同等

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

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
    This setting (enabled by default) adds -Wformat -Werror=format-security to CFLAGS and CXXFLAGS. This will warn about improper format string uses, and will fail when format functions are used in a way that represent possible security problems. At present, this warns about calls to printf and scanf functions where the format string is not a string literal and there are no format arguments, as in printf(foo); instead of printf("%s", foo); This may be a security hole if the format string came from untrusted input and contains "%n".

fortify
    This setting (enabled by default) adds -D_FORTIFY_SOURCE=2 to CPPFLAGS. During code generation the compiler knows a great deal of information about buffer sizes (where possible), and attempts to replace insecure unlimited length buffer function calls with length-limited ones. This is especially useful for old, crufty code. Additionally, format strings in writable memory that contain '%n' are blocked. If an application depends on such a format string, it will need to be worked around. このオプションが効果を発揮するためには、ソースコードは -O1 以上でコンパイルされている必要がある。

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

relro
    This setting (enabled by default) adds -Wl,-z,relro to LDFLAGS. During program load, several ELF memory sections need to be written to by the linker. This flags the loader to turn these sections read-only before turning over control to the program. Most notably this prevents GOT overwrite attacks. If this option is disabled, bindnow will become disabled as well.

bindnow
    This setting (disabled by default) adds -Wl,-z,now to LDFLAGS. During program load, all dynamic symbols are resolved, allowing for the entire PLT to be marked read-only (due to relro above). The option cannot become enabled if relro is not enabled.

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>.