Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
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 теперь всегда устанавливает файл limits.h в приватный директорий limits.h, необходимо, чтобы этот директорий уже был.

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

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

Отладочное инструментальное средство; используется для анализа программ с тем, чтобы определить, где оптимизация будет наиболее эффективна

libgcc

Содержит средства поддержки времени исполнения для gcc

libgcov

Эта библиотека компонуется с программой, когда для GCC указано использовать профилирование

libgomp

GNU реализация интерфейса OpenMP API мультиплатформенного параллельного программирования для языков C/C++ и Fortran с общим доступом к памяти

libmudflap

Содержит подпрограммы, поддерживающие в GCC функциональность, связанную с проверкой границ памяти

libssp

Содержит подпрограммы, поддерживающие в GCC функциональность, защищающие стек от разрушения

libstdc++

Стандартная библиотека C++

libsupc++

Предоставляются подпрограммы поддержки для языка программирования C++


Предыдущий раздел: Оглавление Следующий раздел:
Пакет MPC-0.8.2   Пакет Sed-4.2.1