Upgrading GCC/ja

この文書では、Article description::GCC のアップグレード手順を案内しています.

GCC のダウングレードには望まない副作用があるかもしれないことに注意してください. よく報告される問題についてはトラブルシューティングの節を参照してください.

ショートバージョン
このセクションは、GCCのアップグレード（とそれらがいかに簡単か）への迅速なプライマーです. より詳しい説明は次のGCC アップグレードの詳説節にあります.

GCC をアップグレードしたときには、コンパイラのバージョンを変更することと、libtool を再ビルドすること以外には必要なことはありません：

現在のバージョン番号を確認してから、旧バージョンをアンインストールしましょう:

それから、revdep-rebuildを実行してシステムの整合性を検証します:

新しいコンパイラを楽しんでください！

GCC アップグレードの詳説
GCC のアップグレードはいつも謎めかされてきました. というのも、「ほかには何もしなくていいよ」というものから、「システム全体の再ビルドを2度しなければならないよ」というものまで、言われることに幅があるからです. こうした疑念のおおよそは、今日ではめったに起こらない(そして起こったときにはそれが発表される) ABI の非互換にまつわる混乱からきています. しかしまずは、 にまつわることについて軽く指摘しておきます.

libtool
ではなぜ、 のバージョンをアップグレードした後には libtool を再ビルドする必要があるのでしょうか？　それは、libtool は、プラットフォーム特有のコードを一般化したインターフェイスに集約することで、アプリケーションソフトがプラットフォーム特有の側面を意識することなく共用ライブラリを利用可能にするものだからです. この機能を適切に実現するには、 のスクリプトは、様々な場所にある共用ライブラリを見つけ出して、その中にハードコーディングされた のバージョン情報を得なければなりません.

ABI の変化
ABI、あるいはApplication Binary Interfaceは、コンパイラ、アセンブラ、リンカ、そして言語ランタイムサポート(情報源: GCC Binary Compatibility)を含む、プログラムのバイナリ表現を扱うすべてのツールによって使用される規則の集まりです. バイナリアプリケーションやライブラリに使用されているABIが変更されると、C++のコードを用いているすべてのライブラリをビルドしなおすまで、リンカのエラーやプログラムの誤動作が発生する危険性があります.

そう、C++です、ほとんどの非互換はC++ ABIの中で生じるためです. もしあなたがGCC 4.1やGCC 5.1へアップグレードした場合、おそらくABIの問題に直面することになるでしょう. これを防ぐには、GCC 3からGCC 4.1へのアップグレードの場合はに、GCC 4からGCC 5.1へのアップグレードの場合はに対してコマンドを実行する必要があります.

では、なぜこれはGCC 4.1/5.1までにおいてのみ必要とされるのでしょうか? それは、それらのバージョン以降、GCCがアプリケーションやライブラリの再ビルドの必要性をなくす前方互換のABIを採用しているからです. もちろん保証は無期限に与えられるものではありえませんが、非互換が再び生じたら、私たちはそれをここへ確実に文書化し、またニュース項目をリリースします. その場合、おそらくライブラリのバージョンは増加していることでしょう.

C++11 (および C++14) 特有の事象
GCC(より具体的には、libstdc++)は、ABIの安定性を保証するために労を惜しみませんが、この保証はlibstdc++の中のC++のすべての部分に及ぶわけではありません. 公式には、3.4以降のバージョンにおいて、GCC/libstdc++はC++98/C++03 ABIの安定性のみを保証し、それ以上ではありません. このことはC++11に依存するパッケージに関しては重大です. GCCはC++11 ABIの安定性の保証をバージョン5.1以降でのみ提供しています. これは、gccのバージョン(マイナーバージョンであっても)の変更(4.7.3 -> 4.7.4など)はC++11のコードからビルドされたバイナリにABI破壊をもたらす、ということを意味しています.

さらなる情報や実例は、以下を見てください：


 * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61758
 * https://blogs.gentoo.org/blueness/2015/03/10/the-c11-abi-incompatibility-problem-in-gentoo/
 * https://stackoverflow.com/questions/16190269/g-always-backward-compatible-with-older-static-libraries/16196475#16196475
 * https://stackoverflow.com/questions/16190269/g-always-backward-compatible-with-older-static-libraries/16196475#16196475

どのパッケージで再ビルドが必要とされているか?
以下の表は、インストールされていれば再ビルドが必要なパッケージとその理由を表したものです.

いくつかのパッケージ群は同じコンパイラを用いてビルドする必要があります(たとえば、さまざまなパッケージ). こうしたパッケージについては通常パッケージメンテナが同時にbumpを行っているため、常に同じバージョンのGCCでビルドされるようになっています. これらのパッケージからの「つまみ食い」的な再インストールはトラブルを引き起こすことがしばしばです.

すべてをリビルドする
「GCC の新たなバージョンを入れたときには、各パッケージのすべてを再ビルドせねばならない」と心に誓っている人もいます. もちろん、そうする意味はありません. なぜなら、ビルドやインストールに GCC を一切使わないアプリケーションソフトもたくさんあり、そうしたソフトウェアには影響がないからです.

そうはいっても、彼らが完全に間違っているかというと、そうでもありません： 新しいバージョンの GCC ではしばしば、プロセッサの命令セットのサポートが向上していることがあります. そうすると、より良い性能が得られるアプリケーションソフトもあるかもしれません.

そうした"穏健な"利点とは別に、場合によっては明確な原因がわからない問題を解決するためにすべてを1からリビルドすることが必要になることがあるかもしれません.

いくつかのソフトウェアの問題は本質的に診断が困難ですが、それでも単に1つまたは複数の適切なパッケージをリビルドすることで解決できることがあります. そのような問題がGCCのアップグレード後に起こり、前に説明したrevdep-rebuildを使ったアプローチ(と他の明らかに関係のあるパッケージのリビルド)の後にも続いている場合、システムの完全なリビルドが答えかもしれません.

The "safest" (but also most time-consuming) way to accomplish this is to use the   option of emerge to rebuild the system set and then the world set:

Users are urged to try this approach before reporting any bugs that might have been caused by a GCC upgrade.

(Note that the commands above will cause the packages in the "system" set to be rebuilt twice, which is necessary to be absolutely certain that every package gets built in the same [presumably] "problem-free" environment. Any problems that remain after doing this are due to either "genuine bugs" that should be reported or poor system configuration.)

rebuild of boost
If needs to be rebuilt, one will get the following error message:

One can rebuild with:

libstdc++.so.6: version `GLIBCXX_3.4.15' not found
アップデートの途中、以下のようなエラーに遭遇することがあります:

これは、依存しているライブラリをビルドしたものよりも古いバージョンのGCCでパッケージをビルドしようとしていることを表しています. C++ ABIは前方互換であると述べたことを思い出しましたか? 確かにそれは事実なのですが、そのことは、アプリケーションのビルドやライブラリのリンクにあたって、(そのライブラリをビルドしたものに比べて)より高い(または同じ)バージョンのGCCが使用できる、ということを保証するに過ぎません.

libstdc++に依存しているすべてのパッケージを再ビルドするには、上のrevdep-rebuildの節を参照してください.

参考

 * Upgrade GCC up to 4.1 この文書の以前のバージョン
 * Upgrading from gcc-4.x to gcc-5.x
 * Fedoraの'Changes/GCC6' Wikiページ