6.9. Glibc-2.29

Пакет содержит стандартную библиотеку языка Си (GNU C Library). Эта библиотека предоставляет функции для выделения памяти, поиска каталогов, открытия и закрытия файлов, чтения и записи файлов, обработку строк, соответствия шаблонов (pattern matching), арифметические операции, и так далее.

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

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

[Примечание]

Примечание

Система сборки Glibc самодостаточная и выполнит установку правильно, даже несмотря на то, что служебные файлы и компоновщик по прежнему указывают на каталог /tools. Перенастроить эти файлы нельзя до установки окончательного варианта пакета Glibc, потому что тесты программы autoconf завершатся с ошибкой.

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

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

Для начала создайте символическую ссылку для совместимости и чтобы избежать наличия ссылок на каталог /tools в конечной установке пакета glibc:

ln -sfv /tools/lib/gcc /usr/lib

Определите каталог GCC include и создайте символическую ссылку для соблюдения стандартов LSB. Кроме того, для x86_64 создайте символическую ссылку для совместимости      и правильной работы динамического загрузчика:

case $(uname -m) in
    i?86)    GCC_INCDIR=/usr/lib/gcc/$(uname -m)-pc-linux-gnu/8.3.0/include
            ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3
    ;;
    x86_64) GCC_INCDIR=/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/include
            ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64
            ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
    ;;
esac

Удалите файл, который мог быть оставлен после предыдущей попытки сборки:

rm -f /usr/include/limits.h

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

mkdir -v build
cd       build

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

CC="gcc -isystem $GCC_INCDIR -isystem /usr/include" \
../configure --prefix=/usr                          \
             --disable-werror                       \
             --enable-kernel=3.2                    \
             --enable-stack-protector=strong        \
             libc_cv_slibdir=/lib
unset GCC_INCDIR

Значение опций, аргументов и параметров конфигурации:

CC="gcc -isystem $GCC_INCDIR -isystem /usr/include"

Установка пути к gcc и каталога с системными заголовочными файлами для избежания проблем создания недопустимых путей в отладочных символах.

--disable-werror

Аргумент отключает опцию -Werror передаваемую в GCC. Это необходимо сделать для корректного выполнения набора тестов.

--enable-stack-protector=strong

Аргумент усиливает безопасность системы, добавляя дополнительный код для проверки на переполнение буфера, например при переполнении буфера в стеке (Stack smashing).

libc_cv_slibdir=/lib

Аргумент указывает корректную библиотеку для всех архитектур. Нет необходимости использовать lib64.

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

make
[Важно]

Важно

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

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

case $(uname -m) in
  i?86)   ln -sfnv $PWD/elf/ld-linux.so.2        /lib ;;
  x86_64) ln -sfnv $PWD/elf/ld-linux-x86-64.so.2 /lib ;;
esac
[Примечание]

Примечание

Символическая ссылка созданная выше необходима для запуска тестов на этом      этап сборки в среде chroot. Позднее, эта ссылка будет перезаписана на следующем этапе.

make check

Можно наблюдать некоторые ошибки при тестировании. Выполнение набора тестов Glibc сильно зависит от хост-системы. Ниже приведен список наиболее распространённых проблем, наблюдаемых в некоторых версиях LFS:

  • misc/tst-ttyname завершается с ошибкой в среде chroot LFS.

  • inet/tst-idna_name_classify завершается с ошибкой в среде chroot LFS.

  • posix/tst-getaddrinfo4 and posix/tst-getaddrinfo5 на некоторых архитектурах может завершиться с ошибкой.

  • nss/tst-nss-files-hosts-multi может завершиться с ошибкой по неизвестным причинам.

  • rt/tst-cputimer{1,2,3} выполнение тестов зависит от версии ядра хост системы. Версии 4.14.91–4.14.96,4.19.13–4.19.18, and 4.20.0–4.20.5 - как известн, вызовут ошибки в этих тестах.

  • Математические тесты иногда не проходят, когда они запускаются на относительно старых процессорах Intel или AMD.

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

touch /etc/ld.so.conf

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

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

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

make install

Установите конфигурационный файл и выполните команду time directory для программы 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 /lib/systemd/system/nscd.service

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

Отдельные локали можно установить с помощью программы localedef. Например, первая команда localedef ниже объединяет определение /usr/share/i18n/locales/cs_CZ без набора символов с помощью определения /usr/share/i18n/charmaps/UTF-8.gz charmap и добавляет результат в /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 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_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 it_IT -f ISO-8859-1 it_IT
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.SIJS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.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

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

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

make localedata/install-locales

Затем, используйте команду localedef чтобы создать и установить те локали, которые не представленны в файле glibc-2.29/localedata/SUPPORTED если они необходимы.

[Примечание]

Примечание

Glibc now uses libidn2 when resolving internationalized domain names. This is a run time dependency. If this capability is needed, the instrucions for installing libidn2 are in the BLFS libidn2 page.

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

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

Файл /etc/nsswitch.conf необходимо создать потому что настройки Glibc по умолчанию не будут правильно работать в сетевой (networked) среде.

Создайте новый файл /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

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

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

tar -xf ../../tzdata2018i.tar.gz

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

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward pacificnew systemv; 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 МБ не используя каталог posix но тогда, некоторые приложения могут работать с ошибками а тесты могут не проходить.

zic -L leapseconds ...

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

zic ... -p ...

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

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

tzselect

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

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

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

Замените <xxx> наименованием выбранной временной зоны (например, Canada/Eastern).

6.9.2.3. Конфигурирование динамического загрузчика

По умолчанию, динамический загрузкчик (/lib/ld-linux.so.2) выполняет поиск динамических библиотек в каталогах /lib и /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

6.9.3. Содержимое пакета Glibc

Установленные программы: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, makedb, mtrace, nscd, pldd, sln, sotruss, sprof, tzselect, xtrace, zdump, and zic
Установленные библиотеки: ld-2.29.so, libBrokenLocale.{a,so}, libSegFault.so, libanl.{a,so}, libc.{a,so}, libc_nonshared.a, libcidn.so, libcrypt.{a,so}, libdl.{a,so}, libg.a, libieee.a, libm.{a,so}, libmcheck.a, libmemusage.so, libnsl.{a,so}, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpthread.{a,so}, libpthread_nonshared.a, libresolv.{a,so}, librpcsvc.a, librt.{a,so}, libthread_db.so, and libutil.{a,so}
Установленные каталоги: /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/rpcsvc, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, /usr/lib/locale, /usr/libexec/getconf, /usr/share/i18n, /usr/share/zoneinfo, /var/cache/nscd, and /var/lib/nss_db

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

catchsegv

Может использоваться для создания трассировки стека, когда программа            завершается с ошибкой сегментации

gencat

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

getconf

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

getent

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

iconv

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

iconvconfig

Создает ускоренную загрузку iconv модулей файлов конфигурации

ldconfig

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

ldd

помогает определить список разделяемых библиотек (shared libraries), от которых зависит программа.

lddlibc4

Помогает ldd с объектными файлами

locale

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

localedef

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

makedb

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

mtrace

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

nscd

Служба (демон), которая предоставляет кэш для наиболее общих запросов службы имен.

pldd

Список динамических общих объектов, используемых запущенными процессами

sln

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

sotruss

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

sprof

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

tzselect

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

xtrace

Трассировка выполняемой программы, и выводит в реальном времени на устройство стандартного вывода выполняемые функции

zdump

распечатывает текущее время для каждого часового пояса, указанного в командной строке

zic

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

ld-2.29.so

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

libBrokenLocale

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

libSegFault

Обработчик сигнала ошибки сегментации, используемый catchsegv

libanl

Асинхронная библиотека поиска имен

libc

Стандартная библиотека языка Си

libcidn

Используется внутри Glibc для обработки интернационализированых доменных имён в функции getaddrinfo()

libcrypt

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

libdl

Интерфейс библиотеки динамической линковки

libg

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

libieee

Связывание в этом модуле приводит к правилам обработки правил для математических функций определенные Институтом инженеров электротехники и электроники (IEEE). По умолчанию используется обработка ошибок POSIX.1.

libm

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

libmcheck

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

libmemusage

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

libnsl

Библиотека сетевых сервисов

libnss

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

libpthread

POSIX библиотека потоков

libresolv

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

librpcsvc

Содержит функции, предоставляющие разные службы RPC

librt

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

libthread_db

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

libutil

Содержит кл для «стандартных» функций, используемых в большинстве различных утилит Unix