%general-entities; ]> gcc &gcc-version;
&gcc-url;
GCC-&gcc-version; GCC <para>Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.</para> <segmentedlist> <segtitle>&buildtime;</segtitle> <segtitle>&diskspace;</segtitle> <seglistitem> <seg>&gcc-fin-sbu;</seg> <seg>&gcc-fin-du;</seg> </seglistitem> </segmentedlist> </sect2> <sect2 role="installation"> <title>Установка пакета GCC При сборке на x86_64 измените имя каталога по умолчанию для 64-битных библиотек на lib: case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac Документация GCC рекомендует собирать GCC в отдельном каталоге: mkdir -v build cd build Подготовьте GCC к компиляции: ../configure --prefix=/usr \ LD=ld \ --enable-languages=c,c++ \ --enable-default-pie \ --enable-default-ssp \ --enable-host-pie \ --disable-multilib \ --disable-bootstrap \ --disable-fixincludes \ --with-system-zlib GCC поддерживает семь различных языков программирования, но предварительные условия для большинства из них еще не выполнены. См. страницу BLFS Book GCC для получения инструкций о том, как собрать все языки, поддерживаемые GCC Значение новых параметров настройки: LD=ld Этот параметр указывает скрипту configure использовать ld, установленный программой Binutils, собранной ранее в этой главе, а не кросс версию, которая использовалась бы в противном случае. --disable-fixincludes По умолчанию во время установки GCC некоторые системные заголовки будут исправлены для использования с GCC. Это не обязательно для современной системы Linux и потенциально опасно, если пакет будет переустановлен после установки GCC. Этот параметр не позволяет GCC исправлять заголовки. --with-system-zlib Этот параметр указывает GCC ссылаться на установленную в системе копию библиотеки Zlib, а не на собственную внутреннюю копию. PIE (позиционно-независимые исполняемые файлы) — это двоичные программы, которые можно загружать в любое место памяти. Без PIE функция безопасности под названием ASLR (рандомизация размещения адресного пространства) может применяться к общим библиотекам, но не к самим исполняемым файлам. Включение PIE позволяет использовать ASLR для исполняемых файлов в дополнение к общим библиотекам и смягчает некоторые атаки, основанные на фиксированных адресах конфиденциального кода или данных в исполняемых файлах. SSP (Stack Smashing Protection - защита от разрушения стека) — это метод, гарантирующий, что стек параметров не будет поврежден. Повреждение стека может, например, изменить адрес возврата подпрограммы, тем самым передав управление какому-то опасному коду (существующему в программе или общих библиотеках или каким-то образом внедренному злоумышленником). Скомпилируйте пакет: make В этом разделе набор тестов для GCC считается важным, но занимает много времени. Начинающим сборщикам не рекомендуется пропускать его. Время выполнения тестов можно значительно сократить, добавив -jx в приведенную ниже команду make -k check, где x - количество ядер процессора в вашей системе. GCC может потребоваться больше места в стеке для компиляции некоторых сложных шаблонов кода. В качестве меры предосторожности для хост-дистрибутивов с жестким ограничением стека явно установите неограниченный жесткий предел. В большинстве хост-дистрибутивов (и в собранной LFS) жесткий предел по умолчанию неограничен, но нет ничего плохого в том, чтобы установить его явно. Также нет необходимости изменять мягкий предел размера стека, поскольку GCC автоматически установит для него соответствующее значение, если это значение не превышает жесткий предел: ulimit -s -H unlimited Теперь удалите/исправьте несколько известных ошибок тестирования: sed -e '/cpython/d' -i ../gcc/testsuite/gcc.dg/plugin/plugin.exp sed -e 's/no-pic /&-no-pie /' -i ../gcc/testsuite/gcc.target/i386/pr113689-1.c sed -e 's/300000/(1|300000)/' -i ../libgomp/testsuite/libgomp.c-c++-common/pr109062.c sed -e 's/{ target nonpic } //' \ -e '/GOTPCREL/d' -i ../gcc/testsuite/gcc.target/i386/fentryname3.c Выполните тестирование от имени непривилегированного пользователя, но не останавливайтесь на ошибках: chown -R tester . su tester -c "PATH=$PATH make -k check" Чтобы получить сводку результатов набора тестов, выполните: ../contrib/test_summary Чтобы отфильтровать только итоговую сводку, передайте вывод через pipe grep -A7 Summ. Результаты можно сравнить с результатами, размещенными на и . Не всегда удается избежать неожиданных сбоев. В некоторых случаях неудачное завершение тестов - это следствие их выполнения на конкретном оборудовании системы. Если результаты теста не сильно отличаются от результатов по указанному выше URL-адресу, можно продолжать. Установите пакет: make install Каталог сборки GCC теперь принадлежит пользователю tester, и владелец каталога заголовочных файлов (и его содержимого) указан неверно. Измените владельца на пользователя и группу root: chown -v -R root:root \ /usr/lib/gcc/$(gcc -dumpmachine)/&gcc-version;/include{,-fixed} Создайте символическую ссылку, требуемую FHS по "историческим" причинам. ln -svr /usr/bin/cpp /usr/lib Многие пакеты используют имя cc для вызова компилятора языка Си. Мы уже создали cc как символическую ссылку в , теперь создайте символическую ссылку на его справочную страницу: ln -sv gcc.1 /usr/share/man/man1/cc.1 Добавьте символическую ссылку совместимости, чтобы включить сборку программ с оптимизацией времени компоновки (LTO): ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/&gcc-version;/liblto_plugin.so \ /usr/lib/bfd-plugins/ Теперь, когда наш окончательный набор инструментов готов, важно еще раз убедиться, что компиляция и компоновка будут работать так, как ожидалось. Мы сделаем это, выполнив проверку работоспособности: 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 -E -o '/usr/lib.*/S?crt[1in].*succeeded' dummy.log Вывод последней команды должен быть: /usr/lib/gcc/x86_64-pc-linux-gnu/&gcc-version;/../../../../lib/Scrt1.o succeeded /usr/lib/gcc/x86_64-pc-linux-gnu/&gcc-version;/../../../../lib/crti.o succeeded /usr/lib/gcc/x86_64-pc-linux-gnu/&gcc-version;/../../../../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/&gcc-version;/include /usr/local/include /usr/lib/gcc/x86_64-pc-linux-gnu/&gcc-version;/include-fixed /usr/include Опять же, имя каталога может отличаться от указанного выше, в зависимости от архитектуры вашей системы. Затем убедитесь, что новый компоновщик использует правильные пути поиска: grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g' Ссылки на пути, содержащие компоненты с '-linux-gnu', следует игнорировать, но в противном случае вывод последней команды должен быть таким: 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"); 32-разрядная система может использовать несколько других каталогов. Например, вот вывод с компьютера i686: SEARCH_DIR("/usr/i686-pc-linux-gnu/lib32") SEARCH_DIR("/usr/local/lib32") SEARCH_DIR("/lib32") SEARCH_DIR("/usr/lib32") SEARCH_DIR("/usr/i686-pc-linux-gnu/lib") SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib"); Затем убедитесь, что мы используем правильную libc: grep "/lib.*/libc.so.6 " dummy.log Вывод последней команды должен быть: attempt to open /usr/lib/libc.so.6 succeeded Убедитесь, что GCC использует правильный динамический компоновщик: grep found 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 Наконец, переместите файл: mkdir -pv /usr/share/gdb/auto-load/usr/lib mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib Содержимое пакета GCC Установленные программы Установленные библиотеки Созданные каталоги c++, cc (link to gcc), cpp, g++, gcc, gcc-ar, gcc-nm, gcc-ranlib, gcov, gcov-dump, gcov-tool, и lto-dump libasan.{a,so}, libatomic.{a,so}, libcc1.so, libgcc.a, libgcc_eh.a, libgcc_s.so, libgcov.a, libgomp.{a,so}, libhwasan.{a,so}, libitm.{a,so}, liblsan.{a,so}, liblto_plugin.so, libquadmath.{a,so}, libssp.{a,so}, libssp_nonshared.a, libstdc++.{a,so}, libstdc++exp.a, libstdc++fs.a, libsupc++.a, libtsan.{a,so} и libubsan.{a,so} /usr/include/c++, /usr/lib/gcc, /usr/libexec/gcc и /usr/share/gcc-&gcc-version; Краткое описание c++ Компилятор С++ c++ cc Компилятор C cc cpp Препроцессор C; он используется компилятором для расширения инструкций #include, #define и подобные директивы в исходных файлах cpp g++ Компилятор C++ g++ gcc Компилятор C gcc gcc-ar Обертка над ar, добавляющая плагин в командную строку. Эта программа используется только для добавления "оптимизации времени компоновки" и бесполезна с параметрами сборки по умолчанию. gc-ar gcc-nm Обертка над nm, добавляющая плагин в командную строку. Эта программа используется только для добавления "оптимизации времени компоновки" и бесполезна с параметрами сборки по умолчанию. gc-nm gcc-ranlib Обертка над ranlib, добавляющая плагин в командную строку. Эта программа используется только для добавления "оптимизации времени компоновки" и бесполезна с параметрами сборки по умолчанию. gc-ranlib gcov Инструмент тестирования; он используется для анализа программ, чтобы определить, где оптимизация будет иметь наибольший эффект. gcov gcov-dump Автономный инструмент для дампа профилей gcda and gcno gcov-dump gcov-tool Автономный инструмент обработки профиля gcda gcov-tool lto-dump Инструмент для создания дампа объектных файлов, созданных GCC с включенным LTO. lto-dump libasan Библиотека времени выполнения Address Sanitizer libasan libatomic Встроенная библиотека времени выполнения GCC atomic libatomic libcc1 Библиотека, которая позволяет GDB использовать GCC libcc1 libgcc Содержит средства поддержки времени исполнения для gcc libgcc libgcov Эта библиотека компонуется с программой, когда в GCC включено профилирование libgcov libgomp GNU реализация интерфейса OpenMP API мультиплатформенного параллельного программирования для языков C/C++ и Fortran с общим доступом к памяти libgomp libhwasan Библиотека времени выполнения Hardware-Assisted Address Sanitizer (аппаратной очистки адресов) libhwasan libitm Библиотека транзакционной памяти GNU libitm liblsan Библиотека времени выполнения Leak Sanitizer (средств защиты от утечек) liblsan liblto_plugin Плагин GCC LTO позволяет Binutils обрабатывать объектные файлы, созданные GCC с включенным LTO. liblto_plugin libquadmath API математической библиотеки GCC Quad Precision libquadmath libssp Содержит подпрограммы, поддерживающие функциональность защиты стека GCC. Обычно они не используются, потому что Glibc также предоставляет эти подпрограммы. libssp libstdc++ Стандартная библиотека C++ libstdc++ libstdc++exp Экспериментальная библиотека контрактов C++ libstdc++exp libstdc++fs Библиотека файловой системы ISO/IEC TS 18822:2015 libstdc++fs libsupc++ Предоставляет вспомогательные процедуры для языка программирования C++ libsupc++ libtsan Библиотека времени выполнения Thread Sanitizer (средств очистки потоков) libtsan libubsan Библиотека времени выполнения Undefined Behavior Sanitizer (средств очистки неопределенного поведения) libubsan