Перейти к содержанию

gcc⚓︎

Пакет содержит набор компиляторов GNU для таких языков как Си и Си++.

Версия: 11.2.0

Размер: 77.14Mb

Приоритет: Необходимый

Оригинальное расположение: https://ftp.gnu.org/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.xz

Ссылка для загрузки: https://lx4u.ru/downloads/packages/gcc-11.2.0.tar.xz

MD5: 31c86f2ced76acac66992eeedce2fce2

Домашняя страница: https://gnu.org/software/gcc

SBU (Сборка временной системы): 14.8

SBU: 25

Подготовка⚓︎

Первым делом исправьте ошибку, связанную с libasan.a, затем измените пути установки библиотек:

sed -e '/static.*SIGSTKSZ/d' \
    -e 's/return kAltStackSize/return SIGSTKSZ * 4/' \
    -i libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp

sed -e '/m64=/s/lib64/lib/' \
    -e '/m32=/s/m32=.*/m32=..\/lib32$(call if_multiarch,:i386-linux-gnu)/' \
    -i.orig gcc/config/i386/t-linux64

Настройка⚓︎

Обратите внимание

На данном этапе необходимы только компиляторы для C и C++, однако вы можете собрать компиляторы для любых поддерживаемых GCC языков программирования, перечислив их через запятые в опции configure --enable-languages=c,c++. GCC поддерживает следующие языки - c,c++,d,fortran,go,objc,obj-c++. вы можете собрать все доступные компиляторы, добавив параметр --enable-languages=c,c++,d,fortran,go,objc,obj-c++. Если позднее вам потребуется компилятор для какого либо языка из этого списка - пересоберите GCC с его поддержкой.

mkdir -v build
cd       build
../configure --prefix=/usr               \
             LD=ld                       \
             --disable-bootstrap         \
             --with-system-zlib          \
             --enable-languages=c,c++  --disable-multilib          

Для multilib⚓︎

mkdir -v build
cd       build
../configure --prefix=/usr               \
             LD=ld                       \
             --disable-bootstrap         \
             --with-system-zlib          \
             --enable-languages=c,c++ --enable-multilib --with-multilib-list=m64,m32

Значения параметров⚓︎

--disable-bootstrap - предотвращает многократную пересборку GCC

LD=ld - сообщает GCC использовать ранее установленную версию компоновщика

Сборка⚓︎

make

Тестирование⚓︎

  • Увеличьте размер стека по умолчанию
  • Произведите тестирование от непривилегированного пользователя во избежание непредвиденных ситуаций с системой.
ulimit -s 32768
chown -Rv tester . 
su tester -c "PATH=$PATH make -k check"
Обратите внимание

Тестирование этого пакета занимает достаточно много времени.

Для просмотра итогов теста выполните:

../contrib/test_summary
Предупреждение

Известно, что 6 тестов, связанных с get_time, дают сбои. По видимому, это связано с локалью en_HK. Кроме того, тест COSTEXPR-52830 не удается.

Установка⚓︎

make install
  • Удалите ненужную директорию,
  • Убедитесь, что владелец установленных заголовков корректный,
  • По историческим причинам некоторые программы могут пытаться найти cpp в директории /lib. Создайте ссылку,
  • Для поддержки LTO требуется следующая символическая ссылка,
  • Переместите файлы в правильное место:
rm -rf /usr/lib/gcc/$(gcc -dumpmachine)/11.2.0/include-fixed/bits/
chown -v -R root:root \
    /usr/lib/gcc/*linux-gnu/11.2.0/include{,-fixed}
ln -svr /usr/bin/cpp /usr/lib
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/11.2.0/liblto_plugin.so \
        /usr/lib/bfd-plugins/
mkdir -pv /usr/share/gdb/auto-load/usr/lib{,32}
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib32/*gdb.py /usr/share/gdb/auto-load/usr/lib32

При использовании раздельных каталогов:⚓︎

  • Замените ln -svr /usr/bin/cpp /usr/lib из предыдущей команды на корректную для раздельной структуры.

Проверка работоспособности⚓︎

Важно

Сейчас необходимо проверить работу gcc. Если всё нормально, то продолжайте сборку.

Выполните набор команд:

echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

Ошибок быть не должно, а результат команды (учитывая различия в имени динамического компоновщика, зависящие от платформы) будет следующий:

Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

Проверим что задействованы правильные стартовые файлы. Выполните команду:

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

Результат выполнения:

/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crtn.o succeeded

В зависимости от архитектуры, приведенное выше может немного отличаться. Разница будет в названии каталога после /usr/lib/gcc. Здесь важно обратить внимание на то, что gcc обнаружил все три файла crt * .o в каталоге /usr/lib.

Проверим то, что компилятор выполняет поиск корректных заголовочных файлов:

grep -B4 '^ /usr/include' dummy.log

Результат выполнения:

#include <...> search starts here:
 /usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include
 /usr/local/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include-fixed
 /usr/include

Проверим, что компоновщик использует корректные пути поиска:

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

Результат выполнения:

SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");

Проверим, что используется корректная стандартная библиотека

grep "/lib.*/libc.so.6 " dummy.log

Результат выполнения:

attempt to open /usr/lib/libc.so.6 succeeded

Проверим, что используется корректный динамический компоновщик:

grep "found ld-linux*" dummy.log

Результат выполнения должен быть (учитывая различия в имени динамического компоновщика, зависящие от платформы):

found ld-linux-x86-64.so.2 at /usr/lib/ld-linux-x86-64.so.2

Предупреждение

Если вывод не соответствует вышеуказанному, или вообще не получен, значит, что-то не так. Изучите и повторите шаги, чтобы выяснить, в чем проблема. Перед продолжением процесса необходимо решить любые проблемы.

Удалите тестовые файлы:

rm -v dummy.c a.out dummy.log

Установленные файлы⚓︎

Программы: c++ (ссылка на g++), cc (ссылка на gcc), cpp, g++, gcc, gcc-ar, gcc-nm, gcc-ranlib, gcov, gcov-dump и gcov-tool

Библиотеки: libasan.{a,so}, libatomic.{a,so}, libcc1.so, libgcc.a, libgcc_eh.a, libgcc_s.so, libgcov.a, libgomp.{a,so}, libitm.{a,so}, liblsan.{a,so}, liblto_plugin.so, libquadmath.{a,so}, libssp.{a,so}, libssp_nonshared.a, libstdc++.{a,so}, libstdc++fs.a, libsupc++.a, libtsan.{a,so} и libubsan.{a,so}

Директории: /usr/include/c++, /usr/lib/gcc, /usr/libexec/gcc и /usr/share/gcc-11.2.0

К началу