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








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

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

На главную -> MyLDP -> Электронные книги по ОС Linux
Linux From Scratch (version 6.8)
Назад Глава 5. Создание временной версии системы Вперед

5.10. Пакет GCC-4.5.2 — Второй проход

В пакете GCC находится коллекция компиляторов GNU, в том числе компиляторы C и C++.

Приблизительное время сборки: 9,0 SBU

Требуемое дисковое пространство: 1003 MB

5.10.1. Установка пакета GCC

Версии компилятора GCC, более поздние, чем 4.3, будут трактоваться процессом сборки, как если бы местоположение компилятора было изменено, и там, куда указывает параметр --prefix, поиск стартовых файлов происходить не будет. Поскольку компилятор никуда не перемещался, а стартовые файлы, находящиеся в директории /tools, важны для сборки работающего компилятора, скомпонованного с библиотеками, расположенными в /tools, примените следующий патч, который частично восстановит старое поведение GCC:

patch -Np1 -i ../gcc-4.5.2-startfiles_fix-1.patch

При нормальных условиях скрипт fixincludes из GCC запускается для того, чтобы исправить возможно испорченные заголовочные файлы. Поскольку к этом моменту пакеты GCC-4.5.2 и Glibc-2,13 уже установлены и известно, что соответствующие заголовочные файлы не требуют правки, скрипт fixincludes не нужен. На самом деле, запуск этого скрипта может в действительности загрязнить среду сборки из-за того, что установит в личном директории include компилятора GCC скорректированные заголовки, взятые из хост системы. Запуск скрипта fixincludes можно подавить с помощью следующих команд:

cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in

Для машин c архитектурой x86, при сборке GCC методом "раскрутки" (bootstrap) используется флаг компилятора -fomit-frame-pointer. Если сборка осуществляется без "раскрутки", то, по умолчанию, этот флаг не указывается, но нужно создать точно такой же компилятор, как тот, что собирается методом "раскрутки". Используйте следующую команду sed, которая принудительно заставит выполнять сборку с этим флага:

cp -v gcc/Makefile.in{,.tmp}
sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
  > gcc/Makefile.in

Следующая команда изменит место, где по умолчанию должен находиться динамический компоновщик GCC; будет использоваться компоновщик, который находится в /tools. Команда также удалит /usr/include из путей поиска include в GCC. С помощью этой команды, а не с помощью настройки файла спецификаций будет после установки гарантировано, что во время фактической сборки GCC будет использован новый динамический компоновщик. То есть, все файлы, созданные во время сборки, будут ссылаться на новую библиотеку Glibc. Наберите:

for file in \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
  -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_INCLUDE_DIR
#define STANDARD_INCLUDE_DIR 0
#define STANDARD_STARTFILE_PREFIX_1 ""
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

Поскольку приведенный выше текст сложен, давайте разберем его по частям. Сначала мы находим в директории gcc/config все файлы с именами linux.h, linux64.h или sysv4.h. Для каждого найденного файла, мы копируем его в файл с таким же названием, но с расширением ".orig" (оригинальный). Затем первое выражение sed добавит префикс "/tools" к каждому найденному вхождению "/lib/ld", "/lib64/ld" или "/lib32/ld", второе выражение заменяет жестко запрограммированные ссылки "/usr". Затем мы добавляем наши инструкции define, которые изменят пути поиска include, а в конце файла добавляется префикс стартового файла, используемого по умолчанию. Наконец, мы используем команду touch чтобы обновить временные метки скопированных файлов. Если ее использовать вместе с командной cp -u, то в случае, если команда была непреднамеренно запущена дважды, будут предотвращены неожиданные изменения исходных файлов.

На машинах с архитектурой x86_64, отключение спецификации multilib для GCC гарантирует, что попыток компоновки с библиотеками, находящимися на хост системы, не будет:

case $(uname -m) in
  x86_64)
    for file in $(find gcc/config -name t-linux64) ; do \
      cp -v $file{,.orig}
      sed '/MULTILIB_OSDIRNAMES/d' $file.orig > $file
    done
  ;;
esac

Как и при первой сборке GCC, потребуются пакеты GMP, MPFR и MPC. Распакуйте архивы и переместите их в директории с соответствующими именами:

tar -jxf ../mpfr-3.0.0.tar.bz2
mv -v mpfr-3.0.0 mpfr
tar -jxf ../gmp-5.0.1.tar.bz2
mv -v gmp-5.0.1 gmp
tar -zxf ../mpc-0.8.2.tar.gz
mv -v mpc-0.8.2 mpc

Снова для сборки создайте отдельный директорий:

mkdir -v ../gcc-build
cd ../gcc-build

Перед тем, как начать сборку GCC, не забудьте сбросить все переменные среды окружения, которые изменены оптимизационными флагами, используемыми по умолчанию.

Теперь подготовьте GCC для компиляции:

CC="$LFS_TGT-gcc -B/tools/lib/" \
    AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib \
    ../gcc-4.5.2/configure --prefix=/tools \
    --with-local-prefix=/tools --enable-clocale=gnu \
    --enable-shared --enable-threads=posix \
    --enable-__cxa_atexit --enable-languages=c,c++ \
    --disable-libstdcxx-pch --disable-multilib \
    --disable-bootstrap --disable-libgomp \
    --with-gmp-include=$(pwd)/gmp --with-gmp-lib=$(pwd)/gmp/.libs \
    --without-ppl --without-cloog

Пояснение новых конфигурационных параметров:

--enable-clocale=gnu
 

Этот параметр гарантирует, чтобы при любых обстоятельствах для библиотек C++ будет выбрана правильная модель локали. Если скрипт configure найдет установленную локаль de_DE, он выберет правильную модель локали gnu. Но, если локаль de_DE не установлена, то поскольку может быть выбрана неправильная базовая модель локали, есть риск собрать библиотеки C++, которые будут несовместимы с интерфейсом Application Binary Interface (ABI).

--enable-threads=posix
 

Этот параметр обеспечивает обработку в многопоточном коде исключительных состояний C++.

--enable-__cxa_atexit
 

Этот параметр позволяет при регистрации деструкторов C++ для локальных статических и глобальных объектов использовать __cxa_atexit, а не atexit. Этот параметр очень важен для того, чтобы обработка деструкторов полностью соответствовала стандартам. Параметр также влияет на C++ ABI, и собираемые в результате общие библиотеки C++ и программы C++ будут совместимы с другими дистрибутивами Linux.

--enable-languages=c,c++
 

Этот параметр гарантирует, что будут собраны оба компилятора C и C++.

--disable-libstdcxx-pch
 

Предварительно скомпилированные заголовки (PCH) для библиотеки libstdc++ собираться не будут. Они занимают много места и мы не будем их использовать.

--disable-bootstrap
 

Для нативной сборки GCC, сборка по умолчанию осуществляется методом "раскрутки" (bootstrap). Это не только компиляция GCC, а многократная компиляция. Программы, откомпилированные на первом проходе, будут во второй раз использоваться для компиляции сами себя, а затем, снова, третий раз. Вторая и третья итерации выполняются с тем, чтобы убедиться, что компилятор может безупречно воспроизводить сам себя. Из этого также следует, что компилятор откомпилирован правильно. Но метод, используемый в системе LFS, должен позволять собирать надежный компилятор и не обращаться каждый раз к методу "раскрутки".

Откомпилируйте пакет:

make

Установите пакет:

make install

В качестве последнего штриха создайте символическую ссылку. Во многих программах и скриптах вместо gcc запускается cc с тем, чтобы программы имели более общий вид и, следовательно, могли бы использоваться на всех видах систем UNIX, где компилятор GNU C не всегда установлен. Запуск cc позволяет системному администратору не задумываться о том, какой компилятор устанавливать:

ln -vs gcc /tools/bin/cc

Внимание

В этот момент следует остановиться и убедиться, что основные функции (компиляция и компоновка) нового набора инструментальных средств работают так, как ожидалось. Что сделать чистовую проверку, выполните следующие команды:

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

Если все работает правильно, то ошибок быть не должно, а вид последней выданной строки должен быть следующим:

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

Заметим, что в качестве префикса динамического компоновщика может указываться /tools/lib, либо /tools/lib64 для 64-битных машин.

Если вывод не такой, как показано выше, или вообще ничего не выдано, то где-то ошибка. Изучите и повторите все шаги с тем, чтобы выяснить, в чем проблема и устраните ее. Проблему нужно решить раньше, чем двигаться дальше. Во-первых, снова выполните чистовую проверку, используя gcc вместо cc. Если это сработает, то значит, что символическая ссылка /tools/bin/cc отсутствует. Установите ссылку так, как это указано выше. Затем убедитесь, что путь PATH правильный. В этом можно убедиться, запустив команду echo $PATH и проверив, что в начале списка присутствует /tools/bin. Если путь PATH не такой, то это может означать, что вы вошли в систему не как пользователь lfs или в разделе 4.4 "Настройка среды окружения" что-то пошло не так.

После того, как все будет проверено, удалите тестовые файлы:

rm -v dummy.c a.out

Подробности об этом пакете приведены в разделе 6.16.2 "Описание пакета GCC".


Предыдущий раздел: Оглавление Следующий раздел:
Пакет Binutils-2.21 - Второй проход   Пакет Tcl-8.5.9