Подробная информация об этом пакете находится в Раздел 8.5.4, «Содержимое пакета Glibc.»
Пакет Glibc содержит основную библиотеку C. Эта библиотека предоставляет основные процедуры для выделения памяти, поиска в каталогах, открытия и закрытия файлов, чтения и записи файлов, обработки строк, сопоставления с образцом, арифметики и так далее
Во-первых, создайте символическую ссылку для соответствия требованиям LSB. Кроме того, для совместимости с 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
Приведенная выше команда верна. Команда ln имеет несколько вариантов синтаксиса, поэтому обязательно ознакомьтесь с info coreutils ln и ln(1), прежде чем сообщать об ошибке.
Некоторые программы, использующие Glibc, применяют несовместимый с
FHS каталог /var/db
для хранения
своих данных времени выполнения. Установите следующий патч, чтобы
такие программы хранили свои данные в местах, совместимых с FHS:
patch -Np1 -i ../glibc-2.39-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=4.19 \ --with-headers=$LFS/usr/include \ --disable-nscd \ --enable-multi-arch \ libc_cv_slibdir=/usr/lib
Значение параметров настройки:
--host=$LFS_TGT,
--build=$(../scripts/config.guess)
Комбинация этих опций указывает на то, что система сборки
Glibc настраивается на кросс-компиляцию с использованием
кросс-компоновщика и кросс-компилятора в $LFS/tools
.
--enable-kernel=4.19
Этот параметр позволяет Glibc выполнять компиляцию библиотеки с поддержкой ядра 4.19 и более поздних версий. Поддержка более старых ядер не включена.
--with-headers=$LFS/usr/include
Этот аргумент позволяет скомпилировать библиотеку с заголовочными файлами, недавно установленными в каталоге $LFS/usr/include, таким образом, пакету будет известно, какие функции есть у ядра, чтобы оптимизировать себя.
libc_cv_slibdir=/usr/lib
Этот аргумент гарантирует, что библиотека будет установлена в /usr/lib вместо стандартного /lib64 на 64-битных машинах.
--disable-nscd
Параметр отключает сборку демона кэша службы имен, который больше не используется.
На этом этапе может появиться следующее предупреждение:
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 в вашу
хост-систему, что, скорее всего, сделает её непригодной для
использования. Поэтому дважды проверьте, правильность настройки
среды и что вы вошли в систему не под учетной записью
root
, прежде чем запускать
следующую команду.
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(){}' | $LFS_TGT-gcc -xc - readelf -l a.out | grep ld-linux
Если все работает правильно, ошибок быть не должно и вывод последней команды будет иметь вид:
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Если выходные данные отображаются не так, как указано выше, или их вообще нет, значит, что-то сделано неправильно. Разберитесь с проблемой и повторите шаги выше, чтобы исправить ее. Эта проблема должна быть решена, прежде чем вы продолжите.
Как только все будет хорошо, удалите тестовый файл:
rm -v a.out
Сборка пакетов в следующей главе послужит дополнительной проверкой правильности сборки временного кросс-тулчейна. Если какой-либо пакет, особенно Binutils или GCC, не удается собрать, это указывает на то, что что-то пошло не так с установленными ранее Binutils, GCC, или Glibc.
Теперь перекомпилируйте Glibc для m32. Извлеченный исходный код можно использовать повторно, но его необходимо очистить перед установкой версии Glibc m32.
Очистите каталог сборки и удалите артефакты от предыдущей сборки:
make clean find .. -name "*.a" -delete
Сконфигурируйте Glibc для m32 с помощью следующих команд:
CC="$LFS_TGT-gcc -m32" \ CXX="$LFS_TGT-g++ -m32" \ ../configure \ --prefix=/usr \ --host=$LFS_TGT32 \ --build=$(../scripts/config.guess) \ --enable-kernel=4.19 \ --with-headers=$LFS/usr/include \ --enable-multi-arch \ --libdir=/usr/lib32 \ --libexecdir=/usr/lib32 \ libc_cv_slibdir=/usr/lib32
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$PWD/DESTDIR install cp -a DESTDIR/usr/lib32 $LFS/usr/ install -vm644 DESTDIR/usr/include/gnu/{lib-names,stubs}-32.h \ $LFS/usr/include/gnu/ ln -svf ../lib32/ld-linux.so.2 $LFS/lib/ld-linux.so.2
На этом этапе необходимо остановиться и убедиться, что основные функции (компиляция и компоновка) нового кросс-тулчейна работают должным образом. Чтобы выполнить проверку работоспособности, выполните следующие команды:
echo 'int main(){}' > dummy.c $LFS_TGT-gcc -m32 dummy.c readelf -l a.out | grep '/ld-linux'
Если все работает правильно, ошибок быть не должно и вывод последней команды будет иметь вид:
[Requesting program interpreter: /lib/ld-linux.so.2]
Если выходные данные отображаются не так, как указано выше, или их вообще нет, значит, что-то сделано неправильно. Разберитесь с проблемой и повторите шаги выше, чтобы исправить ее. Эта проблема должна быть решена, прежде чем вы продолжите.
Как только все будет хорошо, удалите тестовый файл:
rm -v dummy.c a.out
Подробная информация об этом пакете находится в Раздел 8.5.4, «Содержимое пакета Glibc.»