8.5. Glibc-2.39

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

Приблизительное время сборки: 12 SBU
Требуемое дисковое пространство: 3.1 GB

8.5.1. Установка пакета Glibc

Некоторые программы Glibc используют не совместимый с FHS каталог /var/db для хранения своих данных во время выполнения. Примените следующий патч, чтобы эти программы хранили свои данные в каталогах, совместимых с FHS:

patch -Np1 -i ../glibc-2.39-fhs-1.patch

Документация Glibc рекомендует выполнять компиляцию в отдельном каталоге:

mkdir -v build
cd       build

Убедитесь, что утилиты ldconfig и sln будут установлены в /usr/sbin:

echo "rootsbindir=/usr/sbin" > configparms

Подготовьте Glibc к компиляции:

../configure --prefix=/usr                            \
             --disable-werror                         \
             --enable-kernel=4.19                      \
             --enable-stack-protector=strong          \
             --with-headers=/usr/include              \
             --enable-multi-arch                      \
             libc_cv_slibdir=/usr/lib

Значение параметров настройки:

--disable-werror

Отключает параметр -Werror, передаваемый GCC. Это необходимо для запуска набора тестов.

--enable-kernel=4.19

Этот параметр сообщает системе сборки, что Glibc может использоваться с ядрами старше 4.19. Это значение используется для создание обходных путей на случай, если системный вызов, представленный в более поздней версии, нельзя будет использовать.

--enable-stack-protector=strong

Этот параметр повышает безопасность системы за счет добавления дополнительного кода для проверки переполнения буфера. Обратите внимание, что Glibc всегда явно переопределяет параметры GCC по умолчанию, поэтому необходимо всегда указывать эту опцию, несмотря на то, что мы уже указали --enable-default-ssp для GCC.

--disable-nscd

Параметр отключает сборку демона кэша службы имен, который больше не используется.

libc_cv_slibdir=/usr/lib

Эта переменная устанавливает правильную библиотеку для всей системы. Мы не хотим, чтобы использовалась lib64

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

make
[Важно]

Важно

В этом разделе набор тестов для Glibc считается критически важным. Ни в коем случае не пропускайте его.

Как правило, несколько тестов не проходят. Ошибки тестирования, перечисленные ниже, можно игнорировать.

make check

Вы можете увидеть, что ряд тестов завершились неудачей. Набор тестов Glibc в некоторой степени зависит от хост-системы. Несколько ошибок из более чем 5000 тестов можно игнорировать. Список наиболее распространенных проблем последних версий LFS:

  • Известно, что io/tst-lchmod не работает в среде chroot LFS.

  • Известно, что некоторые тесты, например nss/tst-nss-files-hosts-multi и nptl/tst-thread-affinity* завершаются неудачей из-за тайм-аута (особенно когда система работает относительно медленно и/или набор тестов запущен в несколько потоков). Эти тесты могут быть идентифицированы с помощью следующей команды:

    grep "Timed out" -l $(find -name \*.out)

    Можно повторно запустить отдельный тест, увеличив таймаут с помощью команды TIMEOUTFACTOR=<factor> make test t=<test name>. Например, TIMEOUTFACTOR=10 make test t=nss/tst-nss-files-hosts-multi перезапустит nss/tst-nss-files-hosts-multi, увеличив начальный таймаут в 10 раз.

  • Кроме того, некоторые тесты могут завершиться неудачно при использовании относительно старой модели процессора (например, elf/tst-cpu-features-cpuinfo) или версии ядра хоста (например, stdlib/tst-arc4random-thread).

На этапе установки Glibc будет жаловаться на отсутствие файла /etc/ld.so.conf, хотя это безобидное сообщение, предотвратить его появление можно с помощью команды:

touch /etc/ld.so.conf

Исправьте Makefile, чтобы пропустить устаревшую проверку работоспособности, которая завершается неудачей в современной конфигурации Glibc:

sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
[Важно]

Важно

При обновлении Glibc до новой минорной версии (например, с Glibc-2.36 до Glibc-2.39) в работающей системе LFS вам необходимо принять некоторые дополнительные меры предосторожности, чтобы избежать поломки системы:

  • Обновление Glibc в системе LFS до версии 11.0 не поддерживается. Пересоберите LFS, если вы используете такую старую систему, но вам нужна более новая Glibc.

  • При обновлении системы LFS до версии 12.0 установите Libxcrypt следуя инструкции Раздел 8.27, «Libxcrypt-4.4.36.». В дополнение к обычной установке Libxcrypt, вы ДОЛЖНЫ следовать примечанию со страницы Libxcrypt, чтобы установить libcrypt.so.1* (заменив libcrypt.so.1 из предыдущей установки Glibc).

  • При обновлении системы LFS до версии 12.1 удалите программу nscd:

    rm -f /usr/sbin/nscd
  • Обновите ядро и перезагрузитесь, если оно старше 4.19 (проверьте текущую версию с помощью uname -r) или, если вы хотите обновить имеющееся ядро, выполните действия из Раздел 10.3, «Linux-6.7.4.»

  • Обновите заголовочные файлы API ядра, если они старше 4.19 (проверьте текущую версию с помощью cat /usr/include/linux/version.h) или, если вы просто хотите обновить их, следуйте Раздел 5.4, «Заголовочные файлы Linux-6.7.4 API» (но удалив $LFS из команды cp).

  • Выполните установку DESTDIR и обновите общие библиотеки Glibc в системе с помощью одной команды install:

    make DESTDIR=$PWD/dest install
    install -vm755 dest/usr/lib/*.so.* /usr/lib

Крайне важно строго следовать описанным выше шагам, если вы не совсем понимаете, что делаете. Любое неожиданное отклонение может сделать систему полностью непригодной для использования. ВЫ ПРЕДУПРЕЖДЕНЫ.

Затем продолжайте выполнять команды make install, sed для /usr/bin/ldd и команды для установки локалей. Как только они будут выполнены, перезагрузите систему.

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

make install

Исправьте жестко заданный путь к исполняемому загрузчику в скрипте ldd:

sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd

Затем установите локали, которые дадут возможность системе отвечать на разных языках. Ни одна из локалей не требуется системе, но если некоторые из них отсутствуют, то наборы тестов ряда пакетов будут пропускать важные тестовые сценарии.

Отдельные локали можно установить с помощью программы localedef. Например, вторая команда localedef приведенная ниже, объединяет определение независимой от набора символов локали /usr/share/i18n/locales/cs_CZ с набором символов /usr/share/i18n/charmaps/UTF-8.gz и добавляет результат в файл /usr/lib/locale/locale-archive. Следующие инструкции установят минимальный набор локалей, необходимый для оптимального охвата тестов

mkdir -pv /usr/lib/locale
localedef -i C -f UTF-8 C.UTF-8
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f ISO-8859-1 en_GB
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_ES -f ISO-8859-15 es_ES@euro
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i is_IS -f ISO-8859-1 is_IS
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f ISO-8859-15 it_IT@euro
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
localedef -i zh_TW -f UTF-8 zh_TW.UTF-8

Кроме того, установите локаль для вашей страны, языка и набора символов.

В качестве альтернативы, установите сразу все локали перечисленные в файле glibc-2.39/localedata/SUPPORTED (он включает все локали из списка выше и многие другие), выполнив команду:

make localedata/install-locales

Затем используйте команду localedef для создания и установки локалей, не перечисленных в файле glibc-2.39/localedata/SUPPORTED, когда они вам понадобятся. Например, для некоторых тестов в этой главе потребуются следующие две локали:

localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
[Примечание]

Примечание

Glibc теперь использует libidn2 для разрешения интернационализированных доменных имен. Если такая функция необходима, то инструкцию по установке libidn2 можно найти на странице BLFS libidn2.

8.5.2. Настройка Glibc

8.5.2.1. Добавление nsswitch.conf

Необходимо создать файл /etc/nsswitch.conf, потому что настроенный по умолчанию Glibc плохо работает в сетевой среде.

Создайте новый фай /etc/nsswitch.conf, выполнив следующие действия:

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

8.5.2.2. Добавление данных о часовом поясе

Установите и настройте часовой пояс следующим образом:

tar -xf ../../tzdata2024a.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward; do
    zic -L /dev/null   -d $ZONEINFO       ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix ${tz}
    zic -L leapseconds -d $ZONEINFO/right ${tz}
done

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

Значение команд zic:

zic -L /dev/null ...

Создаёт часовые пояса posix без секунд координации. Обычно их помещают как в zoneinfo так и в zoneinfo/posix. Часовые пояса POSIX должны быть прописаны в zoneinfo, иначе различные тесты будут сообщать об ошибках. На встраиваемых системах с небольшим диском, где часовые пояса никогда не будут обновляться, можно сэкономить примерно 1.9 MB не используя каталог posix, однако некоторые приложения или наборы тестов могут вызывать сбои.

zic -L leapseconds ...

Создаёт правильные часовые пояса с секундами координации. На встраиваемых системах с небольшим диском, где часовые пояса никогда не будут обновляться, а правильность времени неважна, можно выиграть примерно 1.9 MB, исключив каталог right.

zic ... -p ...

Создаёт файл posixrules. Используется New York, потому что POSIX требует, чтобы правила перехода на летнее время соответствовали правилам США.

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

tzselect

После нескольких вопросов о местоположении скрипт выдаст наименование часового пояса (например America/Edmonton). В файле /usr/share/zoneinfo перечислены и другие возможные часовые пояса, такие как Canada/Eastern или EST5EDT, которые не распознаются скриптом, но могут быть использованы.

Создайте файл /etc/localtime выполнив:

ln -sfv /usr/share/zoneinfo/<xxx> /etc/localtime

Замените <xxx> на имя выбранного часового пояса (например, Europe/Moscow).

8.5.2.3. Настройка динамического загрузчика

По умолчанию, динамический загрузчик (/lib/ld-linux.so.2) ищет в каталоге /usr/lib, нужные для работы программ библиотеки. Однако, если библиотеки находятся в другом каталоге, то его необходимо указать в файле /etc/ld.so.conf, чтобы динамический загрузчик мог их найти. Два каталога - /usr/local/lib и /opt/lib часто используются для дополнительных библиотек, поэтому добавьте их в пути поиска для динамического загрузчика.

Создайте новый файл /etc/ld.so.conf выполнив:

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib

EOF

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

cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf

EOF
mkdir -pv /etc/ld.so.conf.d

8.5.3. Сборка Glibc — 32-битная версия

Теперь перекомпилируйте Glibc для m32. Извлеченный исходный код можно использовать повторно, но его необходимо очистить перед установкой Glibc m32.

Очистите каталог сборки и удалите артефакты от предыдущей сборки:

rm -rf ./*
find .. -name "*.a" -delete

Сконфигурируйте Glibc для m32 с помощью следующих команд:

CC="gcc -m32" CXX="g++ -m32" \
../configure                             \
      --prefix=/usr                      \
      --host=i686-pc-linux-gnu           \
      --build=$(../scripts/config.guess) \
      --enable-kernel=4.19                \
      --with-headers=/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/* /usr/lib32/
install -vm644 DESTDIR/usr/include/gnu/{lib-names,stubs}-32.h \
               /usr/include/gnu/

Добавьте имя библиотеки в файл конфигурации динамического загрузчика:

echo "/usr/lib32" >> /etc/ld.so.conf
[Внимание]

Внимание

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

echo 'int main(){}' > dummy.c
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

Установленные программы: gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, ld.so (symlink to ld-linux-x86-64.so.2 or ld-linux.so.2), locale, localedef, makedb, mtrace, pcprofiledump, pldd, sln, sotruss, sprof, tzselect, xtrace, zdump и zic
Установленные библиотеки: ld-linux-x86-64.so.2, ld-linux.so.2, libBrokenLocale.{a,so}, libanl.{a,so}, libc.{a,so}, libc_nonshared.a, libc_malloc_debug.so, libdl.{a,so.2}, libg.a, libm.{a,so}, libmcheck.a, libmemusage.so, libmvec.{a,so}, libnsl.so.1, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libpcprofile.so, libpthread.{a,so.0}, libresolv.{a,so}, librt.{a,so.1}, libthread_db.so и libutil.{a,so.1}
Созданные каталоги: /usr/include/arpa, /usr/include/bits, /usr/include/gnu, /usr/include/net, /usr/include/netash, /usr/include/netatalk, /usr/include/netax25, /usr/include/neteconet, /usr/include/netinet, /usr/include/netipx, /usr/include/netiucv, /usr/include/netpacket, /usr/include/netrom, /usr/include/netrose, /usr/include/nfs, /usr/include/protocols, /usr/include/rpc, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, /usr/lib/locale, /usr/libexec/getconf, /usr/share/i18n, /usr/share/zoneinfo и /var/lib/nss_db

Краткое описание

gencat

Создает каталоги сообщений

getconf

Отображает настройки системы для специфичных переменных файловой системы

getent

Получает записи из административной базы данных

iconv

Выполняет преобразование набора символов

iconvconfig

Создает быстрозагружаемые файлы настроек модуля iconv

ldconfig

Настраивает привязки времени выполнения динамического компоновщика

ldd

Сообщает, какие общие библиотеки требуются каждой программе или общей библиотеке

lddlibc4

Помогает ldd работать с объектными файлами. Он не существует на более новых архитектурах, таких как x86_64

locale

Выводит различную информацию о текущей локали

localedef

Компилирует спецификации локали

makedb

Создает простую базу данных на основе текстового ввода

mtrace

Читает и интерпретирует файл трассировки памяти; отображает сводку в удобочитаемом формате

pcprofiledump

Создает дамп информации, генерируемой при профилировании ПК

pldd

Перечисляет динамические общие объекты, используемые запущенными процессами.

sln

Статически скомпонованная программа ln

sotruss

Отслеживает вызовы процедур общей библиотеки указанной команды

sprof

Читает и отображает данные профилирования общих объектов.

tzselect

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

xtrace

Отслеживает выполнение программы, отображая выполняемую в данный момент функцию

zdump

Выдает дамп часового пояса

zic

Компилятор часовых поясов

ld-*.so

Вспомогательная программа для исполняемых файлов общей библиотеки

libBrokenLocale

Используется внутри Glibc как грубый хак для запуска сломанных программ (например, некоторые приложения Motif). Прочитайте комментарии в glibc-2.39/locale/broken_cur_max.c для получения дополнительной информации

libanl

Библиотека-заглушка, не содержащая функций. Ранее это была библиотека асинхронного поиска имен, функции которой теперь находятся в libc

libc

Основная библиотека C

libc_malloc_debug

Включает проверку выделения памяти при предварительной загрузке

libdl

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

libg

Библиотека-заглушка без функций. Раньше была библиотекой среды выполнения для g++

libm

Математическая библиотека

libmvec

Библиотека векторных математических вычислений, подключаемая по мере необходимости при использовании libm

libmcheck

Включает проверку выделения памяти при подключении к

libmemusage

Используется memusage для сбора информации об использовании памяти программой

libnsl

Библиотека сетевых служб, которая в настоящее время устарела

libnss_*

Модули Name Service Switch, содержащие функции для разрешения имен хостов, имен пользователей, имен групп, псевдонимов, служб, протоколов и т. д. Загружаются libc в соответствии с конфигурацией в /etc/nsswitch.conf

libpcprofile

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

libpthread

Библиотека-заглушка, не содержащая функций. Ранее содержала функции, обеспечивающие большинство интерфейсов, заданных POSIX.1c Threads Extensions (расширения реализации потоков) и интерфейсы семафоров, указанных в POSIX.1b Real-time Extension (расширения реального времени), теперь эти функции находятся в libc

libresolv

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

librt

Содержит функции, реализующие большую часть интерфейсов, определяемых в POSIX.1b Real-time Extension (расширения реального времени)

libthread_db

Содержит функции, полезные для сборки отладчиков для многопоточных программ

libutil

Библиотека-заглушка, не содержащая функций. Ранее содержал код для «стандартных» функций, используемых во многих утилитах Unix. Эти функции теперь находятся в libc