Upgrading GCC/ru

Данный документ проведет пользователя через процесс обновления GCC.

Введение
Эта статья о апгрейде GCC. Даунгрейд GCC может привести к нежелательным побочным эффектам. Обратитесь к разделу устранения проблем по поводу часто возникающих проблем.

Следующий раздел быстро введет вас в процесс обновления GCC (и того, как просто его сделать). Если вы хотите прочитать длинное объяснение причин, стоящих за обновлением GCC, продолжайте читать Объяснение обновления GCC.

Вкратце
Если вы обновляете GCC, то вам вообще не нужно ничего делать, кроме смены версии компилятора и пересборки libtool:

Если вы обновляете GCC с версии меньшей, чем 3.4.0 (для версий 3.x), либо 4.1, вам нужно еще запустить :

Проверьте текущую версию и удалите старую версию

Вот и все. Наслаждайтесь новым компилятором!

Введение
GCC upgrading has always been mystified, with suggestions ranging from "You do not need to do anything" up to "You will need to rebuild your entire system twice". Most of this FUD comes from the confusion surrounding ABI incompatibility. But first a quick pointer towards.

libtool и fix_libtool_files.sh
Более старые версии GCC на Gentoo требовали запуска специальной команды, называемой. Некоторое время назад, выполнение данной команды было встроено в сам процесс установки пакета (через toolchain eclass), поэтому пользователям больше не нужно делать это самим.

The reason we need to rebuild libtool after the upgrade of versions is because of its main purpose: libtool is a toolset that aggregates platform-specific code in a generic interface, allowing applications to build against shared libraries without needing to deal with the platform specific aspects of shared libraries. To fulfill its function properly, the script uses various library locations that have hard-coded  version information in them.

Изменения ABI
ABI, или Двоичный интерфейс приложений, это набор соглашений, используемых всеми инструментами, работающими с бинарным видом программ, например, компиляторы, ассемблеры, линкеры и поддержка рантайма для языков (источник: Бинарная совместимость GCC). Когда ABI, используемый для бинарных приложений и библиотек меняется, появляется риск получить ошибку компоновщика, либо неработающие программы, если только вы не пересоберете все программы, использующие код C++.

Yes, C++, since most incompatibilities occur within the C++ ABI. If you are upgrading to GCC 4.1, or GCC 5.1, you would probably encounter ABI issues. This is also why we use the command against the  (from GCC 3 to GCC 4.1), or  (from GCC 4 to GCC 5.1).

Так почему же это нужно только до GCC 3.4.0/4.1/5? Это потому что с этой версии GCC использует обратно-совместимое ABI, и пересборка приложений и библиотек больше не требуется. Конечно, мы не можем дать вам гарантию, что так будет вечно, но если снова возникнет несоответствие, мы явно опишем этот случай здесь. В этом случае, скорее всего, будет увеличена версия библиотеки.

The special case C++11 (and C++14)
While GCC (or more specifically, libstdc++) goes to great lengths to guarantee stability of the ABI, this guarantee does not extend to all parts of C++ within libstdc++. Formally, with versions starting from 3.4, GCC/libstdc++ only guarantees C++98/C++03 ABI stability and not more. This is crucial for packages that depend on C++11. GCC only makes C++11 ABI stability guarantees beginning with version 5.1. This means that switching (even minor) versions of gcc (say from 4.7.3 -> 4.7.4) might cause ABI breakage for binaries built from C++11 code.

For more information and some examples, see:


 * https://bugs.gentoo.org/show_bug.cgi?id=513386
 * 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/
 * http://stackoverflow.com/a/16196475

Пересборка всего
Некоторые люди клянутся, что нужно пересобрать все пакеты на их системе при выходе новой версии GCC. Конечно, в этом нет смысла, так как многие приложения не используют GCC для процесса сборки и установки, и на них вообще не распространяется это изменение.

That however doesn't mean they are completely incorrect: newer GCC versions often include better support for the processors' instruction set, which might influence the performance of some applications in a positive way. Although it is expected that this improvement is generally only marginal, in some cases (especially CPU intensive applications) this might yield notable improvements.

Также известны случаи, когда пакеты должны быть собраны одной и той же версией компилятора. Хотя эти пакеты чаще всего обновляются в Gentoo одновременно (поэтому они всегда будут собираться одной и той же версией GCC), но обновления по отдельности могут быть источником проблем. Некоторые пакеты являются прекрасным примером такого поведения.

libstdc++.so.6: version `GLIBCXX_3.4.15' not found
В процессе обновлений вы можете встретить ошибку, похожую на следующую:

Это означает, что вы пытаетесь собрать пакет более старой версией GCC, чем собирались библиотеки, от которых зависит пакет. Помните, мы говорили, что C++ ABI обратно совместим? Это так, но означает только, что для сборки приложений и линковки библиотек могут использоваться более новые (или те же самые) версии GCC (по сравнению с версией GCC, использованной для сборки этих библиотек).

To rebuild all the packages depending on libstdc++, see the previous revdep-rebuild section.

Какие пакеты определенно нужно пересобрать?
The following table gives the packages that, if installed, need to be rebuilt and why.

Смотрите также

 * GCC Upgrading up to 4.1, the previous version of this document
 * Upgrading from gcc-4.x to gcc-5.x