sandbox/gccがコンパイルできない問題解決

昨日やったサーバアップデートのついでに、だいぶ前から発生してた問題を解決した。
まず、なんだかよくわからんうちにsandboxがコンパイルできなくなった。サーバはamd64でCHOSTはx86_64-pc-linux-gnuなんやが、multilibの影響かなんかでi686(32bit)向けのコンパイルもやろうとして、C compiler cannot create executablesとか出て失敗するようになった。つまりgcci686向けにコンパイルできないということなんで、GCCをreemergeとしたら解決か、というとgccもcannot run compiled C programsとか出てコンパイルできない。multilibなGCCのバイナリなんて転がってないし、困った、泥沼…というのが状況。


この問題はGentooのForumとかで「こうすればいいんじゃね?」的な怪しい情報が飛びかっていたが、結局決定的な解決策が出ず、再インストールしたら直ったよ、的に終わっていたのであんまり参考にならなかった。

しかし昨日、もう一回gccコンパイルしてやっぱりエラーになったときに気付いた。これgccコンパイルできてるけど実行時にエラーになってる訳で、その原因を探ればいけるんじゃないか?

というわけで、workディレクトリに出来てるxgccを使って、-m32オプションを付けてhelloworldをコンパイルしてみた。通った。しかし実行時に/emul/linux/x86/なんとかのsymbolが見つからない的なエラーを吐いた。どうやら32bitエミュレーションライブラリのバージョンが合わなくなってエラーになってたらしい。

どうやら今考えると、make.defaultのprofileを切り替えたときにやった作業が影響してたらしい。確かなんかのマニュアル*1を見ながら作業したら、multilibは標準では使われなくなったから、切りましょう、みたいなことで手順が書いてあって、それに従って色々やったような気がする。なんかそのときに/emul/linux/x86あたりも弄ったような気がする。

そういうわけなのでemul-linux-x86-baselibをreemergeしてやると、さっきのxgccでコンパイルしたプログラムがちゃんと動くようになった。gccのインストールも、もう一回emergeしたらちゃんと入ってくれた。良かった。


これでsandboxも入るかなぁ、と思ったがやっぱり駄目。sandoxがi686向けコンパイラとして探してるのがi686-pc-linux-gnu-gccで、こんなものが存在しないためとりあえずgccを選択してエラーになっているのが現状らしい。というわけで、/usr/bin/i686-pc-linux-gnu-gccというファイル名でgccをラップするscriptを書いた。

#!/bin/sh
gcc -m32 $@

これでようやくsandboxが入って、portageもアップグレードできた。

多分本当はmultilib関係の移行がうまくいってないせいなんで、そのへんを綺麗にせんといかんのやろうけど、まぁなんとか泥沼から脱出できたからいいや。

*1:どこ見たんだったか忘れた…確かここ見ろ、ってportageか何かに指定された気がする