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








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

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

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

6.10. Перенастройка инструментального набора

Теперь, когда установлены финальные библиотеки C, пришло время снова настроить набор инструментальных средств. Набор инструментальных средств будет скорректирован таким образом, чтобы он компоновал любые вновь компилируемые программы с этими новыми библиотеками. Эта процедура аналогична процедуре, использованной на фазе "настройки" в начале главы 5, но она будет обратной. В главе 5 была выполнена перенастройка с директориев /{,usr/}lib, имеющихся в хост системе, на новый директорий /tools/lib. Теперь, перенастройка будет выполняться с того же самого директория /tools/lib на директории /{,usr/}lib системы LFS.

Сначала сделаем резервную копию компоновщика, находящегося в директории /tools, и заменим его компоновщиком, который был создан в главе 5. Мы также создадим ссылку на его эквивалент, находящийся в директории /tools/$(gcc -dumpmachine)/bin:

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

Затем изменим файл спецификаций GCC так, чтобы он указывал на новый динамический компоновщик. Простое удаление всех вхождений "/tools" должно дать нам правильный путь к динамическому компоновщику. Также настройте файл спецификаций так, чтобы компилятору GCC было известно, где найти правильные заголовки и стартовые файлы библиотеки Glibc. Эту задачу можно решить с помощью команды sed:

gcc -dumpspecs | sed -e 's@/tools@@g' \
    -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
    -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
    `dirname $(gcc --print-libgcc-file-name)`/specs

Было бы хорошо визуально просмотреть файл спецификации с тем, чтобы проверить, какие из предполагаемых изменений были в действительности сделаны.

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

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]

Заметим, что в качестве префикса динамического компоновщика теперь будет /lib.

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

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

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

/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded

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

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

Эта команда в случае успешного завершения должна выдать следующее:

#include <...> search starts here:
 /usr/include

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

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

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

SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/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

Предыдущий раздел: Оглавление Следующий раздел:
Пакет Glibc-2.13   Пакет Zlib-1.2.5