[[diary/Kojima]]
・GCC-4.8.3 bug
GCC-4.8.3でGlibc-2.20をビルド、インストールしてみたところ、64ビット環境では問題ないものの、VirtualBoxで動かしている32ビット環境でコンソールからログインできなくなってしまった。
あれれ、と思って外部からsshで接続すると問題なくログインできる。「???」となりながら、ログファイルを調べてみると、postfixのログにこんなメッセージが残っている。
Oct 15 17:44:19 vm51_32 postfix/master[3087]:
warning: /usr/libexec/postfix/pickup: bad command startup -- throttling
Oct 15 17:45:19 vm51_32 postfix/pickup[3983]:
fatal: setgid(16): Function not implemented
Oct 15 17:45:20 vm51_32 postfix/master[3087]:
warning: process /usr/libexec/postfix/pickup pid 3983 exit status 1
「なぜにsetgid?」と首をひねりながら、しばらく調べてみると、Glibc-2.20の[[リリース情報:https://sourceware.org/glibc/wiki/Release/2.20]]にこんな記述が。
3.1.22. x86 (32-bit, Linux)
Some GCC releases miscompile the setxid support code in NPTL.
This results in functions such as setgid failing with ENOSYS
because an totally bogus system call number is being passed to
the kernel. This has been fixed as GCC bug 61801.
Build system: x86_64 GNU/Linux, gcc version 4.8.3 20140624
(Red Hat 4.8.3-1 (GCC), GNU assembler version 2.23.2
(x86_64-redhat-linux) using BFD version version 2.23.2,
Linux 3.15.3-200.fc20.x86_64 (Carlos O'Donell).
Built with -m32' and targetting i686-pc-linux-gnu'.
どうやらこれっぽいな、とGCCのバグ情報を調べてみると、[[条件を一つ追加しているだけ:https://gcc.gnu.org/viewcvs/gcc/branches/gcc-4_9-branch/gcc/sched-deps.c?r1=212739&r2=212738&pathrev=212739]]だった。
ホントにこれだけで直るのか?と疑問に思ったので、パッチをあててないGCC-4.8.3とパッチ済みでGlibc-2.20をビルドして、make checkしたところ、パッチ前のGCCでは
FAIL: nptl/tst-setuid3
FAIL: rt/tst-cpuclock2
Summary of test results:
2 FAIL
1667 PASS
120 XFAIL
4 XPASS
だったのに対し、パッチ済みだと、
Summary of test results:
1669 PASS
120 XFAIL
4 XPASS
となった。「なるほど」とビルドし直したglibc-2.20にアップデートしたところ、コンソールからログインできない問題も無事解決。
よくこんなの見つけたなぁ、、と思う反面、glibcのテストスーツでちゃんとチェックできていたことを見ると、やはり make check は必須かと反省。
#comment