Обновление GCC

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Upgrading GCC and the translation is 100% complete.

Other languages:
English • ‎español • ‎日本語 • ‎한국어 • ‎русский • ‎中文(中国大陆)‎

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

Быстрый старт

Введение

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

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

Вкратце

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

root #emerge -u sys-devel/gcc
root #gcc-config -l
[1] i686-pc-linux-gnu-4.4.5 *
[2] i686-pc-linux-gnu-4.5.3
root #gcc-config 2
root #env-update && source /etc/profile
root #emerge --ask --oneshot sys-devel/libtool

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

root #revdep-rebuild --library 'libstdc++\.so\.5'

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

root #gcc --version
root #emerge --ask --depclean =sys-devel/gcc-4.4.5

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

Объяснение обновления GCC

Введение

Обновление GCC всегда было какой-то мистикой, с предположениями от "Вам ничего не нужно знать" до "Вам нужно дважды пересобрать всю свою систему". Большинство страха, неуверенности и сомнений проистекает из проблем, связанных с несовместимостью ABI. Но, сначала кратко о libtool.

libtool и fix_libtool_files.sh

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

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

Изменения ABI

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

Да, C++, поскольку в большинстве случаев несоответствия обнаруживаются на уровне двоичного интерфейса приложений C++. Если вы обновляетесь до GCC 4.1, или GCC 5.1, вы, вероятно, столкнетесь с проблемами в двоичном интерфейсе. Это так же объясняет почему мы снова использовали команду revdep-rebuild для libstdc++.so.5 (от GCC 3 до GCC 4.1), или libstdc++.so.6 (от GCC 4 до GCC 5.1).

root #revdep-rebuild --library 'libstdc\+\+.so.6' -- --exclude gcc

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

Особый случай C++11 (и C++14)

В то время как GCC (или точнее libstdc++) идет большими шагами вперед, гарантируя стабильность ABI, эта гарантия не распространяется на все части C++ в libstdc++. Формально, начиная с версии 3.4, GCC/libstdc++ только гарантируется стабильность C++98/C++03 ABI и не более. Это очень важно для пакетов, которые зависят от C++11. GCC даёт гарантию на стабильность C++11 ABI, начиная только с версии 5.1. Это означает, что переключение (даже незначительные) версии GCC (скажем, от 4.7.3 -> 4.7.4) может привести к поломке ABI для бинарных файлов, собранных из C++11 кода.

Более подробную информацию и некоторые примеры можно найти здесь:

Пересборка всего

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

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

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

Устранение проблем

libstdc++.so.6: version `GLIBCXX_3.4.15' not found

В процессе обновлений вы можете встретить ошибку, похожую на следующую:

Код GLIBCXX_x.y.z not found
cmake_bootstrap_28021_test: /usr/lib/gcc/i486-pc-linux-gnu/4.1.2/libstdc++.so.6:
version `GLIBCXX_3.4.11' not found

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

Для пересоборки всех зависящих от libstdc++ смотрите пример команды revdep-rebuild в предыдущем разделе.

Какие пакеты определенно нужно пересобрать?

В следующей таблице приведены пакеты, которые нужно пересобрать, если они установлены, и причины этой необходимости.

Пакет Нужно пересобрать, потому что ...
sys-devel/libtool приложение libtool имеет внутри себя вшитые пути к встроенным библиотекам GCC

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