From 2203e654b389586650d553251b04544a34f189bf Mon Sep 17 00:00:00 2001 From: Sn4il Date: Mon, 2 Sep 2024 15:54:35 +0300 Subject: LFS 12.2 --- lfs-12.2-sysv/chapter08/glibc.html | 1315 ++++++++++++++++++++++++++++++++++++ 1 file changed, 1315 insertions(+) create mode 100644 lfs-12.2-sysv/chapter08/glibc.html (limited to 'lfs-12.2-sysv/chapter08/glibc.html') diff --git a/lfs-12.2-sysv/chapter08/glibc.html b/lfs-12.2-sysv/chapter08/glibc.html new file mode 100644 index 0000000..cf09649 --- /dev/null +++ b/lfs-12.2-sysv/chapter08/glibc.html @@ -0,0 +1,1315 @@ + + + + + + 8.5. Glibc-2.40 + + + + + + + + +

+ 8.5. Glibc-2.40 +

+
+
+

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

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

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

+

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

+
patch -Np1 -i ../glibc-2.40-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          \
+             --disable-nscd                           \
+             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" $(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.40) в работающей системе 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.10.5.» +

    +
  • +
  • +

    + Обновите заголовочные файлы API ядра, если они старше 4.19 + (проверьте текущую версию с помощью cat + /usr/include/linux/version.h) или, если вы + просто хотите обновить их, следуйте Раздел 5.4, + «Заголовочные файлы Linux-6.10.5 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. Следующие + инструкции установят минимальный набор локалей, необходимый для + оптимального охвата тестов +

+
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.40/localedata/SUPPORTED (он включает все + локали из списка выше и многие другие), выполнив команду: +

+
make localedata/install-locales
+

+ Затем используйте команду localedef для создания и + установки локалей, не перечисленных в файле glibc-2.40/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 +

+
+
+
+ Установленные программы: + 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.40/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 +

+
+
+
+
+ + + -- cgit v1.2.3