Подробная информация об этом пакете находится в Раздел 8.5.3, «Содержимое пакета Glibc.»
Пакет Glibc содержит основную библиотеку C. Эта библиотека предоставляет основные процедуры для выделения памяти, поиска в каталогах, открытия и закрытия файлов, чтения и записи файлов, обработки строк, сопоставления с образцом, арифметики и т.д.
Во-первых, создайте символическую ссылку для соответствия требованиям LSB. Кроме того, для совместимости с x86_64 создайте символическую ссылку, необходимую для правильной работы загрузчика динамической библиотеки:
case $(uname -m) in i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3 ;; x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64 ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3 ;; esac
Приведенная выше команда верна. Команда ln имеет несколько
синтаксических версий, поэтому обязательно ознакомтесь с
info coreutils ln и
ln(1)
, прежде чем сообщать об
ошибке.
Некоторые программы, использующие Glibc, применяют несовместимый с
FHS каталог /var/db
для хранения
своих данных времени выполнения. Установите следующий патч, чтобы
такие программы хранили свои данные в местах, совместимых с FHS:
patch -Np1 -i ../glibc-2.36-fhs-1.patch
В документации к Glibc рекомендуется собирать Glibc в отдельном каталоге:
mkdir -v build cd build
Убедитесь, что утилиты ldconfig and sln установлены в /usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Затем подготовьте Glibc к компиляции:
../configure \ --prefix=/usr \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --enable-kernel=3.2 \ --with-headers=$LFS/usr/include \ libc_cv_slibdir=/usr/lib
Значение параметров настройки:
--host=$LFS_TGT,
--build=$(../scripts/config.guess)
Комбинация этих опций указывает на то, что система сборки
Glibc настраивается на кросс-компиляцию с использованием
кросс-компоновщика и кросс-компилятора в $LFS/tools
.
--enable-kernel=3.2
Этот параметр позволяет Glibc выполнять компиляцию библиотеки с поддержкой ядра 3.2 и более поздних версий. Поддержка более старых ядер не включена.
--with-headers=$LFS/usr/include
Этот аргумент позволяет скомпилировать библиотеку с заголовочными файлами, недавно установленными в каталоге $LFS/usr/include, таким образом, пакету будет известно, какие функции есть у ядра, чтобы оптимизировать себя.
libc_cv_slibdir=/usr/lib
Этот аргумент гарантирует, что библиотека будет установлена в /usr/lib вместо стандартного /lib64 на 64-битных машинах.
На этом этапе может появиться следующее предупреждение:
configure: WARNING: *** These auxiliary programs are missing or *** incompatible versions: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.
Отсутствующая или несовместимая программа msgfmt, как правило, безвредна. msgfmt является частью пакета Gettext, который должен предоставлять хост-дистрибутив.
Поступали сообщения о том, что этот пакет может не компилироваться при "параллельной сборке". Если это произойдет, повторно запустите команду make с параметром "-j1".
Скомпилируйте пакет:
make
Установите пакет:
Если переменная LFS
настроена
неправильно, и, несмотря на рекомендации, вы выполняете сборку от
имени пользователя root
,
следующая команда установит только что собранный glibc в вашу
хост-систему, что, скорее всего, сделает её непригодной для
использования. Поэтому дважды проверьте, правильность настройки
среды, прежде чем запускать следующую команду.
make DESTDIR=$LFS install
Значение опции make install:
DESTDIR=$LFS
Переменная make DESTDIR
используется почти всеми пакетами для определения места
установки пакета. Если она не задана, по умолчанию для
установки используется корневой каталог (/
). Здесь мы указываем, что пакет должен
быть установлен в $LFS, который станет корневым после
Раздел 7.4, «Вход в
окружение Chroot».
Исправьте жестко заданный путь к исполняемому загрузчику в скрипте ldd:
sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
На этом этапе необходимо остановиться и убедиться, что основные функции (компиляция и компоновка) нового кросс-тулчейна работают должным образом. Чтобы выполнить проверку работоспособности, выполните следующие команды:
echo 'int main(){}' | gcc -xc - readelf -l a.out | grep ld-linux
Если все работает правильно, ошибок быть не должно, и вывод последней команды будет иметь вид:
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Обратите внимание, что для 32-разрядных машин имя интерпретатора
будет /lib/ld-linux.so.2
.
Если выходные данные отображаются не так, как указано выше, или их вообще не было, значит, что-то не так. Разберитесь с проблемой и повторите шаги выше, чтобы исправить ее. Эта проблема должна быть решена, прежде чем вы продолжите.
Как только все будет хорошо, удалите тестовый файл:
rm -v a.out
Сборка пакетов в следующей главе послужит дополнительной проверкой правильности сборки временного кросс-тулчейна. Если какой-либо пакет, особенно binutils-pass2 или gcc-pass2, не удается собрать, это указывает на то, что что-то пошло не так с установленными ранее Binutils, GCC, или Glibc.
Теперь, когда наш кросс-тулчейн собран, завершите установку заголовочного файла limits.h. Для этого запустите утилиту, предоставленную разработчиками GCC:
$LFS/tools/libexec/gcc/$LFS_TGT/12.2.0/install-tools/mkheaders
Подробная информация об этом пакете находится в Раздел 8.5.3, «Содержимое пакета Glibc.»