8.5. Glibc-2.36

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

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

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

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

patch -Np1 -i ../glibc-2.36-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=3.2                      \
             --enable-stack-protector=strong          \
             --with-headers=/usr/include              \
             libc_cv_slibdir=/usr/lib

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

--disable-werror

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

--enable-kernel=3.2

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

--enable-stack-protector=strong

Этот параметр повышает безопасность системы за счет добавления дополнительного кода для проверки переполнения буфера.

--with-headers=/usr/include

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

libc_cv_slibdir=/usr/lib

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

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

make
[Важно]

Важно

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

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

make check

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

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

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

  • Известно, что тест nss/tst-nss-files-hosts-long не проходит, если в системе нет IP-адресов без замыкания на себя.

  • Известно что тест stdlib/tst-arc4random-thread завершается неудачей, если ядро хоста относительно старое.

  • Некоторые тесты, например, nss/tst-nss-files-hosts-multi не работают на относительно медленных системах из-за внутреннего тайм-аута.

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

touch /etc/ld.so.conf

Исправьте Makefile, чтобы пропустить ненужную проверку работоспособности, которая завершается неудачей в неполной среде LFS:

sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile

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

make install

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

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

Установите файл настроек и создайте рабочий каталог nscd:

cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd

Установите файлы поддержки systemd для nscd:

install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../nscd/nscd.service /usr/lib/systemd/system/nscd.service

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

Отдельные локали можно установить с помощью программы 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 POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
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.36/localedata/SUPPORTED (он включает все локали из списка выше и многие другие), выполнив команду:

make localedata/install-locales

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

localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
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 ../../tzdata2022c.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 directory.

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

Установленные программы: 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, nscd, 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, libcrypt.{a,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/cache/nscd, и /var/lib/nss_db

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

gencat

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

getconf

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

getent

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

iconv

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

iconvconfig

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

ldconfig

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

ldd

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

lddlibc4

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

locale

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

localedef

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

makedb

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

mtrace

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

nscd

Демон, который обеспечивает кеширование наиболее распространенных запросов к службе имен

pcprofiledump

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

pldd

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

sln

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

sotruss

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

sprof

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

tzselect

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

xtrace

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

zdump

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

zic

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

ld-*.so

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

libBrokenLocale

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

libanl

Библиотека асинхронного поиска имен

libc

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

libc_malloc_debug

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

libcrypt

Криптографическая библиотека

libdl

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

libg

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

libm

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

libmvec

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

libmcheck

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

libmemusage

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

libnsl

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

libnss_*

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

libpcprofile

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

libpthread

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

libresolv

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

librt

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

libthread_db

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

libutil

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