mirror of
https://github.com/Poltern/lfs-ru.git
synced 2024-10-19 12:10:32 +03:00
394 lines
20 KiB
XML
394 lines
20 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
||
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||
<!ENTITY % general-entities SYSTEM "../general.ent">
|
||
%general-entities;
|
||
]>
|
||
|
||
<sect1 id="ch-tools-glibc" role="wrap">
|
||
<?dbhtml filename="glibc.html"?>
|
||
|
||
<sect1info condition="script">
|
||
<productname>glibc</productname>
|
||
<productnumber>&glibc-version;</productnumber>
|
||
<address>&glibc-url;</address>
|
||
</sect1info>
|
||
|
||
<title>Glibc-&glibc-version;</title>
|
||
|
||
<indexterm zone="ch-tools-glibc">
|
||
<primary sortas="a-Glibc">Glibc</primary>
|
||
<secondary>tools</secondary>
|
||
</indexterm>
|
||
|
||
<sect2 role="package">
|
||
<title/>
|
||
|
||
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
|
||
href="../chapter08/glibc.xml"
|
||
xpointer="xpointer(/sect1/sect2[1]/para[1])"/>
|
||
|
||
<segmentedlist>
|
||
<segtitle>&buildtime;</segtitle>
|
||
<segtitle>&diskspace;</segtitle>
|
||
|
||
<seglistitem>
|
||
<seg>&glibc-tmp-sbu;</seg>
|
||
<seg>&glibc-tmp-du;</seg>
|
||
</seglistitem>
|
||
</segmentedlist>
|
||
|
||
</sect2>
|
||
|
||
<sect2 role="installation">
|
||
<title>Установка пакета Glibc</title>
|
||
|
||
<para>Во-первых, создайте символическую ссылку для соответствия требованиям
|
||
LSB. Кроме того, для совместимости с x86_64 создайте символическую ссылку,
|
||
необходимую для правильной работы загрузчика динамической библиотеки:</para>
|
||
|
||
<screen arch="default"><userinput remap="pre">case $(uname -m) in
|
||
i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
|
||
;;
|
||
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
|
||
;;
|
||
esac</userinput></screen>
|
||
<!-- no ld-linux.so.2 here as multilib is based on x86_64, not on i686 -->
|
||
<screen arch="ml_32,ml_x32,ml_all"><userinput remap="pre">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</userinput></screen>
|
||
|
||
<note>
|
||
<para>
|
||
Приведенная выше команда верна. Команда <command>ln</command> имеет несколько
|
||
вариантов синтаксиса, поэтому обязательно ознакомьтесь с <command>info coreutils ln</command>
|
||
и <ulink role='man' url='&man;ln.1'>ln(1)</ulink>, прежде чем сообщать об ошибке.
|
||
</para>
|
||
</note>
|
||
|
||
<para>Некоторые программы, использующие Glibc, применяют несовместимый с
|
||
FHS каталог <filename class="directory">/var/db</filename> для хранения
|
||
своих данных времени выполнения. Установите следующий патч, чтобы такие
|
||
программы хранили свои данные в местах, совместимых с FHS:</para>
|
||
|
||
<screen><userinput remap="pre">patch -Np1 -i ../glibc-&glibc-version;-fhs-1.patch</userinput></screen>
|
||
|
||
<para>В документации к Glibc рекомендуется собирать Glibc в отдельном каталоге:</para>
|
||
|
||
<screen><userinput remap="pre">mkdir -v build
|
||
cd build</userinput></screen>
|
||
|
||
<para>Убедитесь, что утилиты <command>ldconfig</command> and <command>sln</command>
|
||
установлены в <filename class="directory">/usr/sbin</filename>:</para>
|
||
|
||
<screen><userinput remap="pre">echo "rootsbindir=/usr/sbin" > configparms</userinput></screen>
|
||
|
||
<para>Затем подготовьте Glibc к компиляции:</para>
|
||
|
||
<screen arch="default"><userinput remap="configure">../configure \
|
||
--prefix=/usr \
|
||
--host=$LFS_TGT \
|
||
--build=$(../scripts/config.guess) \
|
||
--enable-kernel=&min-kernel; \
|
||
--with-headers=$LFS/usr/include \
|
||
--disable-nscd \
|
||
libc_cv_slibdir=/usr/lib</userinput></screen>
|
||
<screen arch="ml_32,ml_x32,ml_all"><userinput remap="configure">../configure \
|
||
--prefix=/usr \
|
||
--host=$LFS_TGT \
|
||
--build=$(../scripts/config.guess) \
|
||
--enable-kernel=&min-kernel; \
|
||
--with-headers=$LFS/usr/include \
|
||
--disable-nscd \
|
||
--enable-multi-arch \
|
||
libc_cv_slibdir=/usr/lib</userinput></screen>
|
||
|
||
<variablelist>
|
||
<title>Значение параметров настройки:</title>
|
||
|
||
<varlistentry>
|
||
<term><parameter>--host=$LFS_TGT, --build=$(../scripts/config.guess)</parameter></term>
|
||
<listitem>
|
||
<para>Комбинация этих опций указывает на то, что система сборки
|
||
Glibc настраивается на кросс-компиляцию с использованием кросс-компоновщика
|
||
и кросс-компилятора в <filename class="directory">$LFS/tools</filename>.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>--enable-kernel=&min-kernel;</parameter></term>
|
||
<listitem>
|
||
<para>Этот параметр позволяет Glibc выполнять компиляцию библиотеки
|
||
с поддержкой ядра &min-kernel; и более поздних версий. Поддержка более
|
||
старых ядер не включена.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>--with-headers=$LFS/usr/include</parameter></term>
|
||
<listitem>
|
||
<para>Этот аргумент позволяет скомпилировать библиотеку с заголовочными файлами,
|
||
недавно установленными в каталоге $LFS/usr/include, таким образом, пакету будет
|
||
известно, какие функции есть у ядра, чтобы оптимизировать себя.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>libc_cv_slibdir=/usr/lib</parameter></term>
|
||
<listitem>
|
||
<para>Этот аргумент гарантирует, что библиотека будет установлена
|
||
в /usr/lib вместо стандартного /lib64 на 64-битных машинах.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>--disable-nscd</parameter></term>
|
||
<listitem>
|
||
<para>Параметр отключает сборку демона кэша службы имен, который больше не
|
||
используется.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
</variablelist>
|
||
|
||
<para>На этом этапе может появиться следующее предупреждение:</para>
|
||
|
||
<blockquote>
|
||
<screen><computeroutput>configure: WARNING:
|
||
*** These auxiliary programs are missing or
|
||
*** incompatible versions: msgfmt
|
||
*** some features will be disabled.
|
||
*** Check the INSTALL file for required versions.</computeroutput></screen>
|
||
</blockquote>
|
||
|
||
<para>Отсутствующая или несовместимая программа <command>msgfmt</command>,
|
||
как правило, безвредна. <command>msgfmt</command> является частью пакета Gettext,
|
||
который должен предоставлять хост-дистрибутив.</para>
|
||
|
||
<note><para>Поступали сообщения о том, что этот пакет может не компилироваться
|
||
при <quote>параллельной сборке</quote>. Если это произойдет, повторно запустите команду
|
||
make с параметром <option>-j1</option>.</para></note>
|
||
|
||
<para>Скомпилируйте пакет:</para>
|
||
|
||
<screen><userinput remap="make">make</userinput></screen>
|
||
|
||
<para>Установите пакет:</para>
|
||
|
||
<warning><para>Если переменная <envar>LFS</envar> настроена неправильно, и,
|
||
несмотря на рекомендации, вы выполняете сборку от имени пользователя
|
||
<systemitem class="username">root</systemitem>, следующая команда установит
|
||
только что собранный Glibc в вашу хост-систему, что, скорее всего, сделает её
|
||
непригодной для использования. Поэтому дважды проверьте, правильность настройки
|
||
среды и что вы вошли в систему не под учетной записью &root;, прежде чем
|
||
запускать следующую команду.</para></warning>
|
||
|
||
<screen><userinput remap="install">make DESTDIR=$LFS install</userinput></screen>
|
||
|
||
<variablelist>
|
||
<title>Значение опции <command>make install</command>:</title>
|
||
|
||
<varlistentry>
|
||
<term><parameter>DESTDIR=$LFS</parameter></term>
|
||
<listitem>
|
||
<para>Переменная make <envar>DESTDIR</envar> используется почти
|
||
всеми пакетами для определения места установки пакета. Если она
|
||
не задана, по умолчанию для установки используется корневой каталог (<filename
|
||
class="directory">/</filename>). Здесь мы указываем, что пакет должен
|
||
быть установлен в $LFS, который станет корневым каталогом в <xref linkend=
|
||
"ch-tools-chroot"/>.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
</variablelist>
|
||
|
||
<para>Исправьте жестко запрограммированный путь к исполняемому загрузчику в
|
||
<command>ldd</command>:</para>
|
||
|
||
<screen><userinput remap="install">sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd</userinput></screen>
|
||
|
||
<caution>
|
||
<para>На этом этапе необходимо остановиться и убедиться, что основные функции
|
||
(компиляция и компоновка) нового кросс-тулчейна работают должным образом.
|
||
Чтобы выполнить проверку работоспособности, выполните следующие команды:</para>
|
||
|
||
<screen><userinput>echo 'int main(){}' | $LFS_TGT-gcc -xc -
|
||
readelf -l a.out | grep ld-linux</userinput></screen>
|
||
|
||
<para>Если все работает правильно, ошибок быть не должно и вывод последней
|
||
команды будет иметь вид:</para>
|
||
|
||
<screen><computeroutput>[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]</computeroutput></screen>
|
||
|
||
<para arch="default">Обратите внимание, что для 32-разрядных машин имя интерпретатора будет
|
||
<filename>/lib/ld-linux.so.2</filename>.</para>
|
||
|
||
<para>Если выходные данные отображаются не так, как указано выше, или их вообще
|
||
нет, значит, что-то сделано неправильно. Разберитесь с проблемой и повторите шаги выше,
|
||
чтобы исправить ее. Эта проблема должна быть решена, прежде чем вы продолжите.</para>
|
||
|
||
<para>Как только все будет хорошо, удалите тестовый файл:</para>
|
||
|
||
<screen><userinput>rm -v a.out</userinput></screen>
|
||
|
||
</caution>
|
||
|
||
<note><para>Сборка пакетов в следующей главе послужит дополнительной проверкой
|
||
правильности сборки временного кросс-тулчейна. Если какой-либо пакет, особенно
|
||
Binutils или GCC, не удается собрать, это указывает на то, что что-то
|
||
пошло не так с установленными ранее Binutils, GCC, или Glibc.</para></note>
|
||
|
||
<!--
|
||
<para>Теперь, когда наш кросс-тулчейн собран, завершите установку заголовочного
|
||
файла limits.h. Для этого запустите утилиту, предоставляемую разработчиками GCC:</para>
|
||
|
||
<screen><userinput>$LFS/tools/libexec/gcc/$LFS_TGT/&gcc-version;/install-tools/mkheaders</userinput></screen>
|
||
-->
|
||
</sect2>
|
||
|
||
<!-- - - - - - - - - - -->
|
||
<!-- Multilib - 32bit -->
|
||
<!-- - - - - - - - - - -->
|
||
<sect2 arch="ml_32,ml_all">
|
||
<title>Сборка Glibc — 32-битная версия</title>
|
||
|
||
<para>Теперь перекомпилируйте Glibc для m32. Извлеченный исходный код можно использовать
|
||
повторно, но его необходимо очистить перед установкой версии Glibc m32.</para>
|
||
|
||
<para>Очистите каталог сборки и удалите артефакты от предыдущей сборки:</para>
|
||
|
||
<screen><userinput remap="pre">make clean
|
||
find .. -name "*.a" -delete</userinput></screen>
|
||
|
||
<para>Сконфигурируйте Glibc для m32 с помощью следующих команд:</para>
|
||
|
||
<screen><userinput remap="configure">CC="$LFS_TGT-gcc -m32" \
|
||
CXX="$LFS_TGT-g++ -m32" \
|
||
../configure \
|
||
--prefix=/usr \
|
||
--host=$LFS_TGT32 \
|
||
--build=$(../scripts/config.guess) \
|
||
--enable-kernel=&min-kernel; \
|
||
--with-headers=$LFS/usr/include \
|
||
--enable-multi-arch \
|
||
--libdir=/usr/lib32 \
|
||
--libexecdir=/usr/lib32 \
|
||
libc_cv_slibdir=/usr/lib32</userinput></screen>
|
||
|
||
<para>Скомпилируйте пакет:</para>
|
||
|
||
<screen><userinput remap="make">make</userinput></screen>
|
||
|
||
<para>Установите пакет:</para>
|
||
|
||
<screen><userinput remap="install">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</userinput></screen>
|
||
|
||
|
||
<caution>
|
||
<para>На этом этапе необходимо остановиться и убедиться, что основные функции
|
||
(компиляция и компоновка) нового кросс-тулчейна работают должным образом.
|
||
Чтобы выполнить проверку работоспособности, выполните следующие команды:</para>
|
||
|
||
<screen><userinput>echo 'int main(){}' > dummy.c
|
||
$LFS_TGT-gcc -m32 dummy.c
|
||
readelf -l a.out | grep '/ld-linux'</userinput></screen>
|
||
|
||
<para>Если все работает правильно, ошибок быть не должно и вывод последней
|
||
команды будет иметь вид:</para>
|
||
|
||
<screen><computeroutput>[Requesting program interpreter: /lib/ld-linux.so.2]</computeroutput></screen>
|
||
|
||
<para>Если выходные данные отображаются не так, как указано выше, или их вообще
|
||
нет, значит, что-то сделано неправильно. Разберитесь с проблемой и повторите шаги выше,
|
||
чтобы исправить ее. Эта проблема должна быть решена, прежде чем вы продолжите.</para>
|
||
|
||
<para>Как только все будет хорошо, удалите тестовый файл:</para>
|
||
|
||
<screen><userinput>rm -v dummy.c a.out</userinput></screen>
|
||
|
||
</caution>
|
||
|
||
</sect2><!-- m32 -->
|
||
|
||
<!-- - - - - - - - - - -->
|
||
<!-- Multilib - x32bit -->
|
||
<!-- - - - - - - - - - -->
|
||
|
||
<sect2 arch="ml_x32,ml_all">
|
||
<title>Сборка Glibc - с поддержкой x32 ABI</title>
|
||
|
||
<para>Теперь перекомпилируйте Glibc для mx32. Извлеченный исходный код можно использовать
|
||
повторно, но его необходимо очистить перед установкой версии Glibc mx32.</para>
|
||
|
||
<para>Очистите каталог сборки и удалите артефакты от предыдущей сборки:</para>
|
||
|
||
<screen><userinput remap="pre">make clean
|
||
find .. -name "*.a" -delete</userinput></screen>
|
||
|
||
<para>Сконфигурируйте Glibc для mx32 с помощью следующих команд:</para>
|
||
|
||
<screen><userinput remap="configure">CC="$LFS_TGT-gcc -mx32" \
|
||
CXX="$LFS_TGT-g++ -mx32" \
|
||
../configure \
|
||
--prefix=/usr \
|
||
--host=$LFS_TGTX32 \
|
||
--build=$(../scripts/config.guess) \
|
||
--enable-kernel=&min-kernel; \
|
||
--with-headers=$LFS/usr/include \
|
||
--enable-multi-arch \
|
||
--libdir=/usr/libx32 \
|
||
--libexecdir=/usr/libx32 \
|
||
libc_cv_slibdir=/usr/libx32</userinput></screen>
|
||
|
||
<para>Скомпилируйте пакет:</para>
|
||
|
||
<screen><userinput remap="make">make</userinput></screen>
|
||
|
||
<para>Установите пакет:</para>
|
||
|
||
<screen><userinput remap="install">make DESTDIR=$PWD/DESTDIR install
|
||
cp -a DESTDIR/usr/libx32 $LFS/usr/
|
||
install -vm644 DESTDIR/usr/include/gnu/{lib-names,stubs}-x32.h \
|
||
$LFS/usr/include/gnu/
|
||
ln -svf ../libx32/ld-linux-x32.so.2 $LFS/lib/ld-linux-x32.so.2</userinput></screen>
|
||
|
||
<caution>
|
||
<para>На этом этапе необходимо остановиться и убедиться, что основные функции
|
||
(компиляция и компоновка) нового кросс-тулчейна работают должным образом.
|
||
Чтобы выполнить проверку работоспособности, выполните следующие команды:</para>
|
||
|
||
<screen><userinput>echo 'int main(){}' > dummy.c
|
||
$LFS_TGT-gcc -mx32 dummy.c
|
||
readelf -l a.out | grep '/ld-linux-x32'</userinput></screen>
|
||
|
||
<para>Если все работает правильно, ошибок быть не должно и вывод последней
|
||
команды будет иметь вид:</para>
|
||
|
||
<screen><computeroutput>[Requesting program interpreter: /libx32/ld-linux-x32.so.2]</computeroutput></screen>
|
||
|
||
<para>Если выходные данные отображаются не так, как указано выше, или их вообще
|
||
нет, значит, что-то сделано неправильно. Разберитесь с проблемой и повторите шаги выше,
|
||
чтобы исправить ее. Эта проблема должна быть решена, прежде чем вы продолжите.</para>
|
||
|
||
<para>Как только все будет хорошо, удалите тестовый файл:</para>
|
||
|
||
<screen><userinput>rm -v dummy.c a.out</userinput></screen>
|
||
|
||
</caution>
|
||
|
||
</sect2><!-- mx32 -->
|
||
|
||
<sect2 role="content">
|
||
<title/>
|
||
|
||
<para>Подробная информация об этом пакете находится в
|
||
<xref linkend="contents-glibc" role="."/></para>
|
||
|
||
</sect2>
|
||
|
||
</sect1>
|