Translated part3intro

This commit is contained in:
Poltern 2023-06-23 12:26:42 +05:00
parent f5f243bc93
commit ed06c0d730
3 changed files with 144 additions and 90 deletions

View File

@ -18,11 +18,12 @@
<listitem>
<para>На некоторые пакеты необходимо наложить патчи перед компиляцией,
метод использется тогда, когда исправление необходимо для решения проблем сборки.
Патчи часто требются как в этой, так и в следующих главах, но иногда только в одном
месте. Поэтому не беспокойтесь, если инструкции для скачанного патча отсутствуют.
Предупреждающие сообщения о <emphasis>смещении</emphasis> или
<emphasis>размытии</emphasis> также могут появляться при применении патча. Не
обращайте внимания на эти предупреждения, когда патч был успешно применен.</para>
Патчи часто требются как в этой, так и в следующих главах, но иногда, когда один
и тот же пакет собирается более одного раза, патч требуется не сразу. Поэтому не
беспокойтесь, если инструкции для скачанного патча отсутствуют.
Предупреждающие сообщения о <emphasis>смещении (offset)</emphasis> или
<emphasis>размытии (fuzz)</emphasis> также могут появляться при применении патча. Не
обращайте внимания на эти предупреждения, патч все равно успешно применен.</para>
</listitem>
<listitem>
@ -30,7 +31,8 @@
предупреждения. Это нормально, и их можно смело игнорировать. Предупреждения
появляются, например, когда используется устаревший, недопустимый синтаксис
C или C++. Стандарты C меняются довольно часто, и некоторые пакеты все еще
используют более старый стандарт. Это не является проблемой, но вызывает предупреждения.</para>
используют более старый стандарт. Это не является серьезной проблемой, но вызывает
появление предупреждений.</para>
</listitem>
<listitem>
@ -73,7 +75,7 @@
</important>
<important>
<para>Еще раз обратим внимание на процесс сборки:</para>
<para>Вот краткое описание процесса сборки:</para>
<orderedlist numeration="arabic" spacing="compact">
<listitem>
@ -83,7 +85,7 @@
<filename class="directory">/mnt/lfs/tools/</filename>. --></para>
</listitem>
<listitem>
<para>Перейдите в каталог с исходными кодами.</para>
<para>Перейдите в каталог <filename class="directory">/mnt/lfs/sources/</filename>.</para>
</listitem>
<listitem id='buildinstr' xreflabel='Инструкции по сборке пакетов'>
<para>Для каждого пакета:</para>
@ -94,20 +96,20 @@
<xref linkend="chapter-temporary-tools"/> убедитесь, что при извлечении
пакета вы залогинены под пользователем lfs.</para>
<para>Все методы получения дерева исходного кода на месте сборки, кроме
извлечения tar-архива, не поддерживаются. Примечательно, что использование
<command>cp -R</command> для копирования дерева исходного кода в другое
место может привести к уничтожению ссылок и временных меток в дереве
исходного кода и вызвать сбой сборки.</para>
<para>Не используйте никаких методов, кроме команды <command>tar</command>,
для извлечения исходного кода. Примечательно, что использование команды
<command>cp -R</command> для копирования дерева исходного кода в другое
место может привести к уничтожению ссылок и меток времени в дереве исходного
кода и привести к сбою сборки.</para>
</listitem>
<listitem>
<para>Перейдите в каталог, созданный при извлечении пакета.</para>
</listitem>
<listitem>
<para>Следуйте инструкциям книги по сборке пакета.</para>
<para>Следуйте инструкциям по сборке пакета.</para>
</listitem>
<listitem>
<para>Вернитесь в исходный каталог.</para>
<para>Вернитесь в исходный каталог, когда сборка будет завершена.</para>
</listitem>
<listitem>
<para>Удалите извлеченный каталог, если не указано иное.</para>

View File

@ -10,23 +10,23 @@
<title>Введение</title>
<para>Эта часть разделена на три этапа: сначала соберите кросс-компилятор и
связанные с ним библиотеки; во-вторых, используйте этот набор инструментов для
создания нескольких утилит таким образом, чтобы изолировать их от основного
дистрибутива; в-третьих, войдите в среду chroot, чтобы ещё больше улучшить
изоляцию от хоста, и соберите остальные инструменты, необходимые для
сборки окончательной системы.</para>
<para>Эта часть разделена на три этапа: во-первых, сборка кросс-компилятора и
связанных с ним библиотек; во-вторых, использование этого набора инструментов
для сборки нескольких утилит таким образом, чтобы изолировать их от основного
дистрибутива; в-третьих, вход в среду chroot (что ещё больше улучшает
изоляцию от хоста), и сборка оставшихся инструментов, необходимых для
создания конечной системы.</para>
<important><para>С этой части начинается настоящая работа по созданию новой
<important><para>Именно здесь начинается настоящая работа по сборке новой
системы. Требуется очень тщательно следить за тем, чтобы инструкции выполнялись
точно так, как они приведены в книге. Вы должны попытаться понять, что они делают,
и каким бы ни было ваше желание закончить сборку, вы следует воздерживаться от
слепого ввода команд, лучше читать документацию, когда есть что-то, что вы не
понимаете. Кроме того, следите за выводом команд, отправляя их в файл с помощью
утилиты <command>tee</command>. Это позволит провести диагностку, если что-то
и каким бы ни было ваше желание скорее закончить сборку, вам следует воздержаться от
слепого набора команд. Читайте документацию, если вы что-то не понимаете. Кроме
того, следите за результатом выполнения команд, отправляя лог в файл
с помощью утилиты <command>tee</command>. Это упрощает отладку, если что-то
пойдет не так.</para></important>
<para>В следующем разделе дается техническое введение в процесс сборки, а следующий
содержит <emphasis role="strong">очень важные</emphasis> общие инструкции по компиляции.</para>
<para>Следующий раздел представляет собой техническое введение в процесс сборки, а следующий
за ним, содержит <emphasis role="strong">очень важные</emphasis> общие инструкции по компиляции.</para>
</sect1>

View File

@ -10,10 +10,10 @@
<title>Технические примечания по сборочным инструментам</title>
<para>В этом разделе объясняются технические детали, лежащие в основе сборки
пакетов. Не обязательно сразу понимать все, что содержится в этом разделе.
Большая часть этой информации станет более понятной после выполнения фактической
сборки. К этому разделу можно обратиться в любое время по ходу процесса.</para>
<para>В этом разделе объясняются причины и некоторые технические детали, лежащие в
основе сборки пакетов. Не обязательно сразу понимать все, что содержится в этом
разделе. Большая часть этой информации станет более понятной после выполнения фактической
сборки. Возвращайтесь и перечитывайте этот раздел в любое время по ходу сборки.</para>
<para>Основная задача <xref linkend="chapter-cross-tools"/> и <xref
linkend="chapter-temporary-tools"/> состоит в том, чтобы создать временную
@ -47,11 +47,11 @@
заслуживают отдельного раздела. Хотя этот раздел можно пропустить при первом
чтении, возвращение к нему позже будет полезно для полного понимания процесса.</para>
<para>Давайте определим некоторые термины, используемые в этом контексте:</para>
<para>Давайте определим некоторые термины, используемые в этом контексте.</para>
<variablelist>
<varlistentry><term>сборщик</term><listitem>
<para>это машина, на которой мы создаем программы. Обратите внимание, что
<para>это машина, на которой мы собираем программы. Обратите внимание, что
этот компьютер упоминается как <quote>хост</quote> в других разделах.</para></listitem>
</varlistentry>
@ -71,7 +71,7 @@
<para>В качестве примера представим следующий сценарий (иногда называемый
<quote>канадским крестом</quote>): у нас есть компилятор на медленной
машине, назовем ее машиной A, а компилятор ccA. У нас также есть быстрая
машине, назовем ее машиной A и компилятор ccA. У нас также есть быстрая
машина (B), но без компилятора, и мы хотим создать код для другой медленной
машины (C). Чтобы собрать компилятор для машины C, у нас будет три этапа:</para>
@ -89,25 +89,25 @@
<tbody>
<row>
<entry>1</entry><entry>A</entry><entry>A</entry><entry>B</entry>
<entry>сборка кросс-компилятора cc1 с использованием ccA на машине A</entry>
<entry>Сборка кросс-компилятора cc1 с использованием ccA на машине A</entry>
</row>
<row>
<entry>2</entry><entry>A</entry><entry>B</entry><entry>C</entry>
<entry>сборка кросс-компилятора cc2 с использованием cc1 на машине A</entry>
<entry>Сборка кросс-компилятора cc2 с использованием cc1 на машине A</entry>
</row>
<row>
<entry>3</entry><entry>B</entry><entry>C</entry><entry>C</entry>
<entry>сборка компилятора ccC с использованием cc2 на машине B</entry>
<entry>Сборка компилятора ccC с использованием cc2 на машине B</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Затем все другие программы, необходимые для машины C, могут быть
скомпилированы с помощью cc2 на быстрой машине B. Обратите внимание, что
если B не может запускать программы, созданные для C, нет способа
протестировать собранные программы, пока не будет запущена сама машина C.
Например, для тестирования ccC мы можем добавить четвертый этап:</para>
<para>Затем все другие программы, необходимые для машины C, могут быть
скомпилированы с помощью cc2 на быстрой машине B. Обратите внимание, что
до тех пор, пока B не может запускать программы, собранные для C, нет
способа протестировать программы, пока не будет запущена сама машина C.
Например, чтобы запустить набор тестов на ccC мы можем добавить четвертый этап:</para>
<informaltable align="center">
<tgroup cols="5">
@ -123,7 +123,7 @@
<tbody>
<row>
<entry>4</entry><entry>C</entry><entry>C</entry><entry>C</entry>
<entry>пересобрать и протестировать ccC, используя себя на машине C</entry>
<entry>Пересобрать и протестировать ccC, используя ccC на машине C</entry>
</row>
</tbody>
</tgroup>
@ -140,39 +140,57 @@
<title>Реализация кросс-компиляции для LFS</title>
<note>
<para>Почти все системы сборки используют имена вида cpu-vendor-kernel-os,
называемые машинным триплетом. Проницательный читатель может задаться
вопросом, почему <quote>триплет</quote> относится к имени из четырех компонентов.
Так сложилось исторически: изначально для однозначного обозначения машины было
достаточно трех компонентов, но с появлением новых машин и систем этого оказалось
недостаточно. Слово <quote>триплет</quote> осталось. Простой способ определить
<para>Все кросс-компилируемые пакеты в этой книге используют систему сборки на основе
autoconf. Система сборки на основе autoconf принимает типы систем вида cpu-vendor-kernel-os,
называемые системным триплетом. Поскольку поле vendor часто не содержит значения,
autoconf позволяет вам опустить его.</para>
<para>Проницательный читатель может задаться вопросом, почему название <quote>триплет</quote>
применяется к имени из четырех компонентов. Поле kernel и поле os ранее применялись как единый
элемент: <quote>system</quote>. Такая форма с тремя полями все еще актуальна для некоторых
систем, например, <literal>x86_64-unknown-freebsd</literal>. Но две системы могут использовать
одно и то же ядро и все же быть слишком разными, чтобы использовать одинаковый триплет для их
описания. Например, Android, работающий на мобильном телефоне полностью отличается от Ubuntu,
работающей на ARM64 сервере, хотя они оба работают на одном и том же типе процессора (ARM64) и
с одним ядром (Linux).</para>
<para>Без слоя эмуляции вы не сможете запустить исполняемый файл c сервера на мобильном телефоне
и наоборот. Итак, поле <quote>system</quote> было разделено на поля kernel и os, чтобы однозначно
их интерпретировать. В нашем примере Android обозначается как
<literal>aarch64-unknown-linux-android</literal>, а Ubuntu
<literal>aarch64-unknown-linux-gnu</literal>.</para>
<para>Слово <quote>триплет</quote> сохранилось в лексиконе. Простой способ определить
триплет вашей машины — запустить скрипт <command>config.guess</command>, который
входит в исходный код многих пакетов. Распакуйте исходники binutils и запустите
скрипт: <userinput>./config.guess</userinput>, обратите внимание на выходные данные.
скрипт: <userinput>./config.guess</userinput>, обратите внимание на вывод.
Например, для 32-разрядного процессора Intel вывод будет
<emphasis>i686-pc-linux-gnu</emphasis>. В 64-битной системе это будет
<emphasis>x86_64-pc-linux-gnu</emphasis>.</para>
<emphasis>x86_64-pc-linux-gnu</emphasis>. В большинстве систем Linux используют еще более
простую команду <command>gcc -dumpmachine</command>, которая предоставит вам аналогичную
информацию.</para>
<para>Также обратите внимание на название динамического компоновщика платформы,
<para>Вы также должны знать имя динамического компоновщика платформы,
часто называемого динамическим загрузчиком (не путать со стандартным компоновщиком
<command>ld</command>, который является частью binutils). Динамический компоновщик,
предоставляемый Glibc, находит и загружает общие библиотеки, необходимые программе,
предоставляемый glibc, находит и загружает общие библиотеки, необходимые программе,
подготавливает программу к запуску, а затем запускает ее. Имя динамического
компоновщика для 32-разрядной машины Intel — <filename
class="libraryfile">ld-linux.so.2</filename>, а для 64-разрядных систем — <filename
class="libraryfile">ld-linux-x86-64.so.2</filename>. Надежный способ определить
имя динамического компоновщика — проверить случайный двоичный файл из хост-системы,
выполнив следующую команду: <userinput>readelf -l
&lt;name of binary&gt; | grep interpreter</userinput> и зафиксировать результат.
&lt;имя исполняемого файла&gt; | grep interpreter</userinput> и зафиксировать результат.
Официальный источник, охватывающий все платформы, находится в файле
<filename>shlib-versions</filename> в корне дерева исходного кода Glibc.</para>
<filename>shlib-versions</filename> в корне дерева исходного кода glibc.</para>
</note>
<para>Чтобы сымитировать кросс-компиляцию в LFS, имя триплета хоста немного
подкорректировали, изменив поле &quot;vendor&quot; в переменной <envar>LFS_TGT</envar>.
подкорректировали, изменив поле &quot;vendor&quot; в переменной <envar>LFS_TGT</envar>
таким образом, чтобы оно указывало &quot;lfs&quot;.
Мы также используем параметр <parameter>--with-sysroot</parameter> при сборке
кросс-компоновщика и кросс-компилятора, чтобы сообщить им, где найти необходимые
файлы хоста. Это гарантирует, что ни одна из программ, созданных в <xref
файлы хоста. Это гарантирует, что ни одна из программ, входящих в <xref
linkend="chapter-temporary-tools"/>, не сможет ссылаться на библиотеки на машине
сборки. Для корректной работы, обязательны всего два этапа, еще один
рекомендуется для тестирования:</para>
@ -191,15 +209,15 @@
<tbody>
<row>
<entry>1</entry><entry>ПК</entry><entry>ПК</entry><entry>LFS</entry>
<entry>сборка кросс-компилятора cc1 с использованием cc-pc на ПК</entry>
<entry>Сборка кросс-компилятора cc1 с использованием cc-pc на ПК</entry>
</row>
<row>
<entry>2</entry><entry>ПК</entry><entry>LFS</entry><entry>LFS</entry>
<entry>сборка компилятора cc-lfs с использованием cc1 на ПК</entry>
<entry>Сборка компилятора cc-lfs с использованием cc1 на ПК</entry>
</row>
<row>
<entry>3</entry><entry>LFS</entry><entry>LFS</entry><entry>LFS</entry>
<entry>пересборка и тестирование cc-lfs, используя себя в lfs</entry>
<entry>Пересборка и тестирование cc-lfs, используя cc-lfs в lfs</entry>
</row>
</tbody>
</tgroup>
@ -209,27 +227,61 @@
выполняются на компьютере с использованием уже установленного дистрибутива.
<quote>В lfs</quote> означает, что команды выполняются в chroot-окружении.</para>
<para>Теперь подробнее о кросс-компиляции: язык C - это не просто компилятор,
<para>Это еще не конец истории. Язык С - это не просто компилятор;
также он определяет стандартную библиотеку. В этой книге используется библиотека
GNU C под названием glibc. Эта библиотека должна быть скомпилирована для машины
GNU C под названием glibc (есть альтернативный вариант - &quot;musl&quot;).
Эта библиотека должна быть скомпилирована для машины
lfs, то есть с использованием кросс-компилятора cc1. Но сам компилятор использует
внутреннюю библиотеку, реализующую сложные инструкции, недоступные в наборе
инструкций ассемблера. Эта внутренняя библиотека называется libgcc, и для
полноценной работы ее необходимо связать с библиотекой glibc! Кроме того,
стандартная библиотека для C++ (libstdc++) также должна быть связана с glibc.
Решение этой проблемы курицы и яйца состоит в том, чтобы сначала собрать
деградированный libgcc на основе cc1, в котором отсутствуют некоторые функции,
такие как потоки и обработка исключений, затем собрать glibc с использованием
этого деградированного компилятора (сам glibc не деградирован), а затем собрать
libstdc++. Но в этой библиотеке не будет хватать тех же функций, что и в libgcc.</para>
деградированную libgcc на основе cc1, в которой отсутствуют некоторые функциональные
возможности, такие как потоки и обработка исключенийй, затем собрать glibc с использованием
этого деградированного компилятора (сама glibc не деградирована), а затем собрать
libstdc++. В этой последней библиотеке будет нехватать некоторых функциональных
возможностей libgcc.</para>
<para>Это не конец истории: вывод из предыдущего абзаца заключается в том, что cc1
не может собрать полнофункциональную libstdc++, но это единственный компилятор,
доступный для сборки библиотек C/C++ на этапе 2! Конечно, компилятор, созданный на
этапе 2, cc-lfs, сможет собрать эти библиотеки, но (1) система сборки GCC не
знает, что ее можно использовать на ПК, и (2) ее использование на ПК сопряжено
с риском привязки к библиотекам ПК, поскольку cc-lfs является родным компилятором.
Поэтому мы должны собрать libstdc++ позже, в chroot.</para>
<para>Выводом из предыдущего абзаца является то, что cc1
не может собрать полнофункциональную libstdc++ с деградированной libgcc, но это
единственный компилятор, доступный для сборки библиотек C/C++ на этапе 2. Есть
две причины, по которым мы не используем сразу компилятор cc-lfs,
собранный на этапе 2, для сборки этих библиотек.</para>
<itemizedlist>
<listitem>
<para>
Вообще говоря, cc-lfs не может работать на ПК (хост-системе). Хотя триплеты для ПК и
LFS совместимы друг с другом, исполняемый файл для lfs должен зависеть от
glibc-&glibc-version;; хост-дистрибутив может использовать либо другую реализацию
libc (например, musl), либо предыдущий выпуск glibc (например, glibc-2.13).
</para>
</listitem>
<listitem>
<para>
Даже если cc-lfs может работать на ПК, его использование на ПК сопряжено с риском
привязки к библиотекам ПК, так как cc-lfs является родным компилятором.
</para>
</listitem>
</itemizedlist>
<para>Поэтому, когда мы собираем gcc этап 2, мы даем указание системе сборки пересобрать
libgcc и libstdc++ с помощью cc1, но мы связываем libstdc++ с новой пересобранной libgcc
вместо старой, деградированной. Это делает пересобранную библиотеку libstdc++
полностью функциональной.</para>
<para>В &ch-final; (или <quote>этап 3</quote>) собраны все пакеты, необходимые для системы
LFS. Даже если пакет уже был установлен в системе LFS в предыдущей главе, мы все равно
пересобираем пакет. Основная причина пересборки этих пакетов состоит в том, чтобы сделать
их стабильными: если мы переустанавливаем пакет LFS в готовой системе LFS, содержимое пакета
должно совпадать с содержимым того же пакета при первой установке в &ch-final;. Временные
пакеты, установленные в &ch-tmp-cross; или &ch-tmp-chroot; не могут удовлетворять
этому требованию, потому что некоторые из них собраны без необязательных зависимостей и autoconf
не может выполнить некоторые проверки функций в &ch-tmp-cross; из-за кросс-компиляции, в результате
чего во временных пакетах отсутствуют дополнительные функции или используются неоптимальные
процедуры кода. Кроме того, второстепенной причиной для пересборки пакетов является выполнение
тестов.
</sect2>
@ -241,10 +293,10 @@
class="directory">$LFS/tools</filename>, так как он не будет частью конечной системы.</para>
<para>Сначала устанавливается Binutils, потому что во время выполнения команды
<command>configure</command> GCC и Glibc выполняются различные тесты функций
<command>configure</command> gcc и glibc выполняются различные тесты функций
на ассемблере и компоновщике, чтобы определить, какие программные функции
следует включить или отключить. Это важнее, чем может показаться на первый взгляд.
Неправильно настроенный GCC или Glibc может привести к незначительной поломке
Неправильно настроенный gcc или glibc может привести к незначительной поломке
сборочных инструментов, где последствия такой поломки могут проявиться ближе
к концу сборки всего дистрибутива. Сбой тестов обычно выявляет эту ошибку до того,
как будет выполнено много дополнительной работы.
@ -263,14 +315,14 @@
<command>$LFS_TGT-gcc dummy.c -Wl,--verbose 2&gt;&amp;1 | grep succeeded</command>
покажет все файлы, успешно открытые во время компоновки.</para>
<para>Следующий устанавливаемый пакет — GCC. Пример того, что можно увидеть
<para>Следующий устанавливаемый пакет — gcc. Пример того, что можно увидеть
во время запуска <command>configure</command>:</para>
<screen><computeroutput>checking what assembler to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/as
checking what linker to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/ld</computeroutput></screen>
<para>Это важно по причинам, упомянутым выше. Также здесь демонстрируется, что
сценарий настройки GCC не просматривает значеня переменной PATH, чтобы найти,
сценарий настройки gcc не просматривает значеня переменной PATH, чтобы найти,
какие инструменты использовать. Однако во время фактической работы самого
<command>gcc</command> не обязательно используются одни и те же пути поиска.
Чтобы узнать, какой стандартный компоновщик будет использовать <command>gcc</command>,
@ -286,9 +338,9 @@ checking what linker to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/ld</compute
стандартной библиотеке C (Glibc) взаимодействовать с функциями, предоставляемыми
ядром Linux.</para>
<para>Следующий устанавливаемый пакет — Glibc. Наиболее важными при сборке Glibc
<para>Следующий устанавливаемый пакет — glibc. Наиболее важными при сборке glibc
являются компилятор, бинарные инструменты и заголовочные файлы ядра. С компилятором,
как правило, не бывает проблем, поскольку Glibc всегда будет использовать компилятор,
как правило, не бывает проблем, поскольку glibc всегда будет использовать компилятор,
указанный в параметре <parameter>--host</parameter>, переданный скрипту configure;
например, в нашем случае компилятором будет <command>$LFS_TGT-gcc</command>. С бинарными
инструментами и заголовки ядра может быть немного сложнее. Поэтому мы не рискуем и
@ -300,19 +352,19 @@ checking what linker to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/ld</compute
(с переменной <envar>$LFS_TGT</envar>) для управления используемыми бинарными
инструментами и использование флагов <parameter>-nostdinc</parameter> и
<parameter>-isystem</parameter> для управления включаемым путем поиска компилятора.
Эти пункты подчеркивают важный аспект пакета Glibc &mdash; он очень самодостаточен
Эти пункты подчеркивают важный аспект пакета glibc &mdash; он очень самодостаточен
с точки зрения своего механизма сборки и, как правило, не полагается на значения по
умолчанию.</para>
<para>Как было сказано выше, затем компилируется стандартная библиотека C++, а
затем в <xref linkend="chapter-temporary-tools"/> все программы, которые необходимо
собрать. На этапе установки всех этих пакетов используется переменная DESTDIR,
чтобы программы помещались в файловую систему LFS.</para>
затем в <xref linkend="chapter-temporary-tools"/> все остальные программы, которым необходимо
разрешить проблему циклических зависимостей во время сборки. На этапе установки всех этих пакетов используется переменная DESTDIR,
для принудительной установки в файловую систему LFS.</para>
<para>В конце <xref linkend="chapter-temporary-tools"/> устанавливается
собственный компилятор lfs. Сначала собирается binutils-pass2 с той же
переменной <envar>DESTDIR</envar>, что и другие программы, затем собирается
второй проход GCC, опуская libstdc++ и другие не важные библиотеки. Из-за
собственный компилятор lfs. Сначала собирается binutils с той же
переменной <envar>DESTDIR</envar>, что и другие программы, затем повторно собирается
gcc, без сборки некоторых некритических библиотек. Из-за
какой-то странной логики в сценарии настройки GCC <envar>CC_FOR_TARGET</envar>
заканчивается как <command>cc</command>, когда хост совпадает с целью, но
отличается от системы сборки. Поэтому значение
@ -321,9 +373,9 @@ checking what linker to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/ld</compute
<para>После входа в среду chroot в <xref
linkend="chapter-chroot-temporary-tools"/> первой задачей является установка
libstdc++. Затем выполняется установка временных программ, необходимых для
правильной работы тулчейна. С этого момента основная цепочка инструментов является
самодостаточной и автономной. В <xref linkend="chapter-building-system"/>
libstdc++. Затем выполняется установка временных программ, необходимых для
правильной работы тулчейна. С этого момента основной набор инструментов является
самодостаточным и автономным. В <xref linkend="chapter-building-system"/>
собираются, тестируются и устанавливаются окончательные версии всех пакетов,
необходимых для полнофункциональной системы.</para>