Библиотека сайта rus-linux.net
Linux From Scratch (version 6.8) | ||
Назад | Глава 6. Установка программ базовой системы | Вперед |
6.16. Пакет GCC-4.5.2
В пакете GCC находится коллекция компиляторов GNU, в том числе компиляторы C и C++.
Приблизительное время сборки: 44 SBU
Требуемое дисковое пространство: 1,1 MB
6.16.1. Установка пакета GCC
Примените команду подстановки sed, с помощью которой будет отменена установка библиотеки libiberty.a
. Вместо нее будет использована версия библиотеки libiberty.a
из пакета Binutils:
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
Как и в разделе 5.10 "Пакет GCC-4.5.2 — Второй проход" применяется следующая команда sed, которая при сборке заставит использовать флаг компилятора -fomit-frame-pointer
с тем, чтобы обеспечить надлежащую сборку компилятора:
case `uname -m` in i?86) sed -i 's/^T_CFLAGS =$/& -fomit-frame-pointer/' \ gcc/Makefile.in ;; esac
Как известно, иногда ошибочно делается попытка с помощью скрипта fixincludes "исправить" системные заголовки, которые были установлены к настоящему моменту. Поскольку известно, что заголовки, установленные к настоящему моменту, не требуют исправлений, введите следующую команду, чтобы предотвратить запуск скрипта fixincludes:
sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
В документации GCC рекомендуется собирать GCC в отдельном директории для сборки, а не в директории с исходными кодами:
mkdir -v ../gcc-build cd ../gcc-build
Подготовьте пакет GCC для компиляции:
../gcc-4.5.2/configure --prefix=/usr \ --libexecdir=/usr/lib --enable-shared \ --enable-threads=posix --enable-__cxa_atexit \ --enable-clocale=gnu --enable-languages=c,c++ \ --disable-multilib --disable-bootstrap --with-system-zlib
Обратите внимание, что для других языков, есть некоторые дополнительные настройки, которые здесь отсутствуют. Инструкции о том, как собрать все языки, поддерживаемые в GCC, смотрите в книге BLFS.
Пояснение нового конфигурационного параметра:
--with-system-zlib | |
Этот переключатель укажет GCC использовать для компоновки копию библиотеки Zlib, установленную в системе, а не свою собственную внутреннюю копию. |
Откомпилируйте пакет:
make
ВажноВ этом разделе выполнение набора тестов для Glibc считается важным. Не пропускайте его ни при каких обстоятельствах. |
Известно, что для одного из наборов тестов из тестового набора пакета GCC происходит переполнение стека, так что перед запуском тестов увеличьте размер стека:
ulimit -s 16384
Проверьте результаты, но не останавливайтесь в случае обнаружения ошибок
make -k check
Чтобы получить общий итог результатов выполнения тестового набора, запустите команду:
../gcc-4.5.2/contrib/test_summary
Для получения только общего итога перенаправьте выходной поток через конвейер grep -A7 Summ
.
Полученные результаты можно сравнить с теми, которые опубликованы на http://www.linuxfromscratch.org/lfs/build-logs/6.8/ и на http://gcc.gnu.org/ml/gcc-testresults/.
Не всегда удается избежать некоторых неожиданных сбоев. Разработчикам GCC, как правило, известно об этих проблемах, но к настоящему моменту они не решены. В частности, известно, что тесты libmudflap
особенно проблематичны из-за ошибки в GCC
(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20003). Если результаты теста не сильно отличаются от тех, что приведены по указанному выше URL, сборку можно с уверенностью продолжить.
Установите пакет:
make install
Для некоторых пакетов ожидается, что в директории /lib
установлен препроцессор С. Чтобы поддержать использование этих пакетов, создайте следующую символическую ссылку:
ln -sv ../usr/bin/cpp /lib
Во многих пакетах для вызова компилятора С используется команда cc. Чтобы поддержать использование этих пакетов, создайте символическую ссылку:
ln -sv gcc /usr/bin/cc
Теперь, когда наш окончательный набор инструментальных средств установлен там, где надо, снова обеспечьте, чтобы компиляция и компоновка работали так, как ожидалось. Мы делаем это с помощью точно таких же чистовых проверок, которые мы делали ранее в этой главе:
echo 'main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
Если все работает правильно, то ошибок быть не должно, а последняя выданная строка будет иметь следующий вид (с учетом разницы именования динамического компоновщика, зависящего от платформы):
[Requesting program interpreter: /lib/ld-linux.so.2]
Теперь удостоверьтесь, что мы сделали настройки, позволяющие использовать правильные стартовые файлы:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
Если все работает правильно, то ошибок быть не должно, и последние выдаваемые строки будут иметь следующий вид:
/usr/lib/gcc/i686-pc-linux-gnu/4.5.2/../../../crt1.o succeeded /usr/lib/gcc/i686-pc-linux-gnu/4.5.2/../../../crti.o succeeded /usr/lib/gcc/i686-pc-linux-gnu/4.5.2/../../../crtn.o succeeded
В зависимости от архитектуры вашей машины, приведенные выше данные могут немного отличаться, разница обычно состоит в имени директория, идущего после /usr/lib/gcc
. Если у вас 64-разрядная машина, вы вы в конце строки можете увидеть директорий с именем lib64
. Здесь важно увидеть, что компилятор gcc нашел в директории /usr/lib
все три файла crt*.o
.
Проверьте, что компилятор находит правильные заголовочные файлы:
grep -B4 '^ /usr/include' dummy.log
Эта команда в случае успешного завершения должна выдать следующее:
#include <...> search starts here: /usr/local/include /usr/lib/gcc/i686-pc-linux-gnu/4.5.2/include /usr/lib/gcc/i686-pc-linux-gnu/4.5.2/include-fixed /usr/include
Снова обратите внимание на то, что в зависимости от вашей архитектуры, имена директориев могут отличаться.
ЗамечаниеПоскольку версия 4.3.0 компилятора GCC теперь всегда устанавливает файл |
Затем проверьте, что новый компоновщик использует правильные пути поиска:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Если все работает правильно, то ошибок быть не должно, и последние выдаваемые строки будут иметь следующий вид (с учетом разницы именования динамического компоновщика, зависящего от платформы):
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib") SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib");
В 64-битовой системе директориев может быть немного больше. Например, результат вывода на машине с архитектурой x86_64 будет следующим:
SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib64") SEARCH_DIR("/usr/local/lib64") SEARCH_DIR("/lib64") SEARCH_DIR("/usr/lib64") SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib") SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib");
Затем проверьте, что мы используем правильную библиотеку libc:
grep "/lib.*/libc.so.6 " dummy.log
Если все работает правильно, то ошибок быть не должно, а последняя выданная строка будет иметь следующий вид (с учетом того, что для хостов с 64-разрядной архитектурой будет использована библиотека lib64):
attempt to open /lib/libc.so.6 succeeded
Наконец, убедитесь, что компилятор GCC использует правильный динамический компоновщик:
grep found dummy.log
Если все работает правильно, то ошибок быть не должно, а последняя выданная строка будет иметь следующий вид (с учетом разницы именования динамического компоновщика, зависящего от платформы, и учетом того, что для хостов с 64-разрядной архитектурой будет использована библиотека lib64):
found ld-linux.so.2 at /lib/ld-linux.so.2
Если вывод не такой, как показано выше, или вообще ничего не выдано, то где-то серьезная ошибка. Изучите и повторите все шаги с тем, чтобы выяснить, в чем проблема и устраните ее. Возможно, что-то было сделано неверно в процессе правки файла спецификаций. Проблему нужно решить раньше, чем двигаться дальше.
После того, как все будет проверено, удалите тестовые файлы:
rm -v dummy.c a.out dummy.log
6.16.2. Описание пакета GCC
Установленные программы: c++, cc (link to gcc), cpp, g++, gcc, gccbug и gcov
Установленные библиотеки: libgcc.a, libgcc_eh.a, libgcc_s.so, libgcov.a, libgomp.{a,so}, libmudflap.{a,so}, libmudflapth.{a,so}, libssp.{a,so}, libssp_nonshared.a, libstdc++.{a,so} и libsupc++.a
Установленные директории: /usr/include/c++, /usr/lib/gcc, /usr/share/gcc-4.5.2
Краткое описание
c++ | Компилятор C++ |
cc | Компилятор С |
cpp | Препроцессор С; используется компилятором для замены в исходном коде инструкций #include, #define и аналогичных |
g++ | Компилятор C++ |
gcc | Компилятор C |
gccbug | Скрипт командной оболочки, используемый для помощи в создании отчетов об ошибках |
gcov | Отладочное инструментальное средство; используется для анализа программ с тем, чтобы определить, где оптимизация будет наиболее эффективна |
| Содержит средства поддержки времени исполнения для gcc |
| Эта библиотека компонуется с программой, когда для GCC указано использовать профилирование |
| GNU реализация интерфейса OpenMP API мультиплатформенного параллельного программирования для языков C/C++ и Fortran с общим доступом к памяти |
| Содержит подпрограммы, поддерживающие в GCC функциональность, связанную с проверкой границ памяти |
| Содержит подпрограммы, поддерживающие в GCC функциональность, защищающие стек от разрушения |
| Стандартная библиотека C++ |
| Предоставляются подпрограммы поддержки для языка программирования C++ |
Предыдущий раздел: | Оглавление | Следующий раздел: |
Пакет MPC-0.8.2 | Пакет Sed-4.2.1 |