• 作成:

Gentooのプロファイルが更新されて, GCCがデフォルトPIE有効になったので, Stackのビルドが壊れました, ビルドオプションを手で修正したらビルドできました, issueに報告しました

Gentooの新しいプロファイル17.0が先日リリースされました. New 17.0 profiles in the Gentoo repository – Gentoo Linux

これに遅ればせながら気がついて, 適用してみました.

新しいプロファイルではPIEがデフォルトで有効になっているようですね.

eixとequery uの出力に違いがある.

とりあえず寝ている間に全更新をかけたのですが, 奇妙なことが発生しました.

eixgccを見ると, 以下のようになります.

2017-12-15T13:25:09 ncaq@karen/pts/4(0) ~
% eix -e gcc
[I] sys-devel/gcc
     Available versions:
     (2.95.3) [M]~*2.95.3-r10^s
     (3.3.6) [M](~)3.3.6-r1^s
     (3.4.6) [M]3.4.6-r2^s
     (4.0.4) [M]**4.0.4^s
     (4.1.2) [M]4.1.2^s
     (4.2.4) [M](~)4.2.4-r1^s
     (4.3.6) [M]4.3.6-r1^s
     (4.4.7) [M]4.4.7^s
     (4.5.4) [M]4.5.4^s
     (4.6.4) [M]4.6.4^s
     (4.7.4) [M]4.7.4^s
     (4.8.5) [M]4.8.5^s
     (4.9.4) [M]4.9.4^s [M]4.9.4^s[1]
     (5.4.0) [M]5.4.0-r3^s
     (6.4.0) 6.4.0^s
     (7.2.0) (~)7.2.0^s
       {altivec awt boundschecking cilk +cxx d debug doc fixed-point +fortran gcj go graphite hardened jit libssp mpx mudflap multilib +nls nopie nossp +nptl objc objc++ objc-gc +openmp +pch pgo +pie regression-test +sanitize +ssp vanilla +vtv}
     Installed versions:  7.2.0(7.2.0)^s(12時18分19秒 2017年12月15日)(cxx fortran multilib nls nptl openmp pch pie sanitize ssp vtv -altivec -awt -cilk -debug -doc -fixed-point -gcj -go -graphite -hardened -jit -libssp -mpx -objc -objc++ -objc-gc -pgo -regression-test -vanilla)
     Homepage:            https://gcc.gnu.org/
     Description:         The GNU Compiler Collection

[1] "dlang" /var/lib/layman/dlang

USEフラグpicが有効になっているように見えますね.

しかし, equery ugccを見てみると, 以下のようになります.

2017-12-15T13:25:12 ncaq@karen/pts/4(0) ~
% equ gcc
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for sys-devel/gcc-7.2.0:
 U I
 - - cilk            : Support the Cilk Plus language (C/C++ based languages for parallel programming)
 + + cxx             : Build support for C++ (bindings, extra libraries, code generation, ...)
 - - debug           : Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces
 - - doc             : Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
 + + fortran         : Add support for fortran
 - - go              : Build the GCC Go language frontend.
 - - graphite        : Add support for the framework for loop optimizations based on a polyhedral intermediate representation
 - - mpx             : Enable support for Intel Memory Protection Extensions (MPX)
 + + nls             : Add Native Language Support (using gettext - GNU locale utilities)
 + + nptl            : Enable support for Native POSIX Threads Library, the new threading module (requires linux-2.6 or better usually)
 - - objc            : Build support for the Objective C code language
 - - objc++          : Build support for the Objective C++ language
 - - objc-gc         : Build support for the Objective C code language Garbage Collector
 + + openmp          : Build support for the OpenMP (support parallel computing), requires >=sys-devel/gcc-4.2 built with USE="openmp"
 + + pch             : Enable precompiled header support for faster compilation at the expense of disk space and memory (>=sys-devel/gcc-3.4 only)
 - - pgo             : Build GCC using Profile Guided Optimization (PGO)
 - + pie             : Build programs as Position Independent Executables (a security hardening technique)
 - - regression-test : Run the testsuite and install the results (requires FEATURES=test)
 + + sanitize        : Build support for various sanitizer functions (ASAN/TSAN/etc...)
 + + ssp             : Build packages with stack smashing protector on by default
 - - vanilla         : Do not add extra patches which change default behaviour; DO NOT USE THIS ON A GLOBAL SCALE as the severity of the meaning changes drastically
 + + vtv             : Build support for virtual table verification (a C++ hardening feature)

現在pieは有効になってないように見えますね.

実際gcc -vで確認したところ, PIEはデフォルト有効になっているようです.

2017-12-15T13:27:02 ncaq@karen/pts/4(0) ~
% gcc -v
組み込み spec を使用しています。
COLLECT_GCC=/usr/x86_64-pc-linux-gnu/gcc-bin/7.2.0/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/lto-wrapper
ターゲット: x86_64-pc-linux-gnu
configure 設定: /var/tmp/portage/sys-devel/gcc-7.2.0/work/gcc-7.2.0/configure --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/7.2.0 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/7.2.0 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/7.2.0/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/7.2.0/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include/g++-v7 --with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/7.2.0/python --enable-languages=c,c++,fortran --enable-obsolete --enable-secureplt --disable-werror --with-system-zlib --enable-nls --without-included-gettext --enable-checking=release --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo 7.2.0 p1.1' --disable-esp --enable-libstdcxx-time --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-multilib --with-multilib-list=m32,m64 --disable-altivec --disable-fixed-point --enable-targets=all --disable-libgcj --enable-libgomp --disable-libmudflap --disable-libssp --disable-libcilkrts --disable-libmpx --enable-vtable-verify --enable-libvtv --enable-lto --without-isl --enable-libsanitizer --enable-default-pie --enable-default-ssp
スレッドモデル: posix
gcc バージョン 7.2.0 (Gentoo 7.2.0 p1.1)

stack経由でプログラムがインストールできなくなりましたが解決しました

stack経由でxmonadをインストールしようとしたら, 常にold-timeのビルドが失敗してインストールできないという問題にぶち当たりました. 当サイトもビルドできなくなり, 更新が滞りました.

% stack --version
Version 1.6.1, Git revision f25811329bbc40b0c21053a8160c56f923e1201b (5435 commits) x86_64 hpack-0.20.0

で, lts-9.18の環境です.

Linker error makes it impossible to use a stack-provided ghc · Issue #2712 · commercialhaskell/stack を参考にして, 私の場合~/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.0.2/lib/ghc-8.0.2/settingsにしてC compiler flags-fPICを追加したところビルドできました.

PIE(位置独立実行形式)は無効にして, PIC(位置独立コード)を有効にするとビルドできるということでしょうか? PICを有効にしたからビルドできるようになったのでしょうか. Using the GNU Compiler Collection (GCC): Code Gen Options を見ても今ひとつわかりません. PICを有効にしていることだけはわかりますが…

PIEもPICも今ひとつわからない.

これ本当に解決しているのか? ベタにコンパイラオプションを書き換えてコンパイルを通すという技が正攻法であるとは到底思えません. 何か間違った方法で解決しているのだと思います.

王道を知りたいです.

とりあえずGitHubを検索してみたら, Arch Linuxで似たような問題にぶち当たってる人がIssueを作っていたので, 「これArchだけの問題じゃなくてPIE有効システム全体に影響してるんじゃない?」と書き込んでおきました. ghc-tinfo6-nopie-8.2.2 requires changes to its settings file to work on Arch Linux · Issue #3648 · commercialhaskell/stack

環境が変わって別の場所にghcがインストールされたのでそれを調べてみました. ~/.stack/programs/x86_64-linux/ghc-ncurses6-nopie-8.0.2/lib/ghc-8.0.2/settingsには-fno-PIEが書かれてない. ~/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.0.2/lib/ghc-8.0.2/settingsには-fno-PIEが書かれているのですね.

ghc-tinfo6-nopieだけ特別に-fno-PIEになっていて, それがPIE有効システムと衝突している?

何故nopieではなくncursesとtinfoでPIEの有無が変わるのかは私には全くわかりません. コードを読みましたがすぐにはわかりませんでした.

これを調査するだけで1時間ぐらい使いました. issueに書いておいたので, 後は私よりも遥かに頭の良いStackの開発者が問題点をうまいこと修正してくれるでしょう. これ以上調査するのは出来なくはないでしょうがかなり難しく, 今は時間も足りていません. 今日は早く帰って病院に行く必要があるのです.