Рейтинг:2

Версии libgcc-s1 и gcc-base по сравнению с версией GCC по умолчанию в 20.04 LTS

флаг cn

Ubuntu 20.04 LTS (по крайней мере, основной образ докера) распространяется с libgcc-s1 и gcc-10-base версии 10.3.0 (-1ubuntu1~20.04), см., например, манифест на https://partner-images.canonical.com/core/focal/20211103/ubuntu-focal-core-cloudimg-amd64.manifest .

Версия GCC по умолчанию в 20.04 LTS — GCC 9, а не GCC 10.

Чем объясняется это очевидное несоответствие? - Почему бы не распространять версии этих пакетов 9.x? Связано ли это с версией GCC, используемой для компиляции пакетов на основе C в 20.04LTS? Большинство (все?) C-пакеты 20.04 LTS скомпилированы с помощью GCC 10?

guiverc avatar
флаг cn
`gcc` и `gcc-10-base` — это разные пакеты. Ubuntu 20.04 LTS использует gcc `gcc | 4:9.3.0-1ubuntu2 | очаг | amd64, arm64, armhf, i386, ppc64el, riscv64, s390x, но также доступен gcc-10 (https://packages.ubuntu.com/focal/gcc-10), который используется для компиляции некоторых опций.
флаг cn
Итак, некоторые (все?) C-пакеты 20.04 LTS скомпилированы с помощью GCC 10?
guiverc avatar
флаг cn
Извините, я не могу авторитетно говорить о том, что скомпилировано; Я бы ожидал, что пакеты, связанные с ядром, будут скомпилированы более новой версией, но я не слежу так внимательно за `gcc`, извините.
Knud Larsen avatar
флаг by
Ubuntu 20.04 «focal-updates **universe**»: gcc-10 (10.3.0-1ubuntu1~20.04) https://packages.ubuntu.com/focal-updates/gcc-10 ........ , ( gcc по умолчанию по-прежнему v9 ).
Рейтинг:0
флаг us

Отказ от ответственности: я новичок в Ubuntu. У меня есть достаточный опыт работы с RHEL и SLES, и недавно мне пришлось изучать версии Ubuntu LTS из-за некоторого оборудования ARM64, которое не хочет загружать что-либо еще.

Резюме

Релизы Ubuntu действительно часто поставляются с некоторыми компонентами из более позднего GCC, чем GCC по умолчанию для релизов. Очевидно, они делают это для того, чтобы предоставить более поздние версии компилятора, если вы хотите их использовать.

  • Пакет gcc-10-base просто предоставляет документацию.
  • Пакет libgcc-s1 содержит важную библиотеку, libgcc_s.so.1. Это обеспечивает вспомогательные функции для кода, сгенерированного компилятором: я знаю, что это важно для обработки исключений C++, выбрасываемых через стек вызовов C.
  • Еще одна важная библиотека libstdc++.so.6. Это обеспечивает функции поддержки C++.
  • Глибк (libc.so.6, libm.so.6 и другие библиотеки) также важен, но не привязан к версии GCC.

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

Поначалу не очевидно, почему Ubuntu и Debian обеспечивают более позднее время выполнения, чем компилятор, но становится яснее, когда вы смотрите на диапазон версий GCC, доступных в последних версиях Ubuntu LTS:

Выпущенный дистрибутив Среды выполнения Debian GCC GCC по умолчанию Дополнительные GCC
Ubuntu 16.04, апрель 2016 г. 9.x 5.x 5.4 4.7, 4.8, 4.9
Ubuntu 18.04 апреля 2018 г. 10.x 8.x 7.5 4.8, 5.5, 6.5. 8.4
Ubuntu 20.04, апрель 2020 г. 11.x 9.x и 10.x 9.3 7.4, 8.4, 10.3

В этот момент это становится достаточно очевидным. Ubuntu 20.04 имеет среду выполнения для кода, скомпилированного с помощью GCC 9.x и 10.x (GCC 10.x не требует дополнительных библиотечных функций, которые не использовались в GCC 9.x). Вы можете установить любую смесь GCC 7.4, 8.4 и 10.3 в качестве дополнительных компиляторов, и все они будут работать. Библиотеки времени выполнения в Ubuntu 20.04 будут поддерживать код, скомпилированный любым из этих компиляторов.

Почему бы не поставить GCC 10.3 с Ubuntu 20.04? Библиотеки времени выполнения обычно более стабильны, чем компиляторы. GCC 10 должен был быть впервые выпущен (как 10.1) примерно в то же время, когда собиралась версия 20.04. Было бы безрассудно создавать выпуск LTS с совершенно новым компилятором; доставка новых библиотек времени выполнения после их тестирования с кодом, созданным с помощью GCC 9, намного безопаснее и позволяет добавить GCC 10 после его стабилизации.

Canonical не предоставляет GCC 11 для 20.04, потому что у него нет необходимого времени выполнения. Для них вам нужна более поздняя версия Ubuntu.

Как узнать все это

/usr/share/doc/gcc/README.Debian есть некоторая информация, а Ununtu 20.04 основан на Debian 11 «Bullseye».

dpkg-query --listfiles gcc-10-база показывает нам, что gcc-10-base предоставляет только документацию.

dpkg-запрос --listfiles libgcc-s1 показывает нам, что libgcc-s1 предоставляет /lib/x86_64-linux-gnu/libgcc_s.so.1, которая является одной из основных библиотек времени выполнения для GCC.

Другими базовыми библиотеками времени выполнения для C/C++ являются glibc, независимая от GCC, и libstdc++. dpkg-запрос-список | grep libstdc показывает нам два пакета:

ii libstdc++-9-dev:amd64 9.3.0-17ubuntu1~20.04 amd64 Стандартная библиотека GNU C++ v3 ...
ii libstdc++6:amd64 10.3.0-1ubuntu1~20.04 amd64 Стандартная библиотека GNU C++ v3

libstdc++6 версия GCC 10.3; в -dev package — это версия GCC 9.3.

dpkg-query --listfiles libstdc++-9-dev показывает нам, что этот пакет предоставляет файлы заголовков, архивные библиотеки и документацию для разработки на C++ с GCC 9.

dpkg-query --listfiles libstdc++6 показывает нам, что этот пакет содержит документацию, несколько скриптов Python и два очень важных файла:

/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28

.so.6 файл - это то, с чем связаны программы. На самом деле это программная ссылка на .so.6.028 файл. Это название версии GCC 10 libstdc++, библиотеки поддержки GCC для C++. Вы можете получить сопоставление между этими именами и версиями GCC. здесь. Прокрутите вниз, и вы найдете несколько таблиц.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.