summaryrefslogtreecommitdiff
path: root/lfs-12.0-sysv/partintro
diff options
context:
space:
mode:
authorSn4il <sn4il@thedroth.rocks>2024-01-10 16:57:29 +0300
committerSn4il <sn4il@thedroth.rocks>2024-01-10 16:57:29 +0300
commitc4d43142181a45b849a15cf8ec5ebe61cea33897 (patch)
tree459a90d19e6f1ece81fbf364c1b5292214d99615 /lfs-12.0-sysv/partintro
parenta044ba7b1561a513e33de0b7c1876aaa401a26d7 (diff)
downloadsn4il-site-c4d43142181a45b849a15cf8ec5ebe61cea33897.tar.gz
sn4il-site-c4d43142181a45b849a15cf8ec5ebe61cea33897.zip
LFS 12 mirror
Diffstat (limited to 'lfs-12.0-sysv/partintro')
-rw-r--r--lfs-12.0-sysv/partintro/generalinstructions.html264
-rw-r--r--lfs-12.0-sysv/partintro/introduction.html113
-rw-r--r--lfs-12.0-sysv/partintro/partintro.html102
-rw-r--r--lfs-12.0-sysv/partintro/toolchaintechnotes.html743
4 files changed, 1222 insertions, 0 deletions
diff --git a/lfs-12.0-sysv/partintro/generalinstructions.html b/lfs-12.0-sysv/partintro/generalinstructions.html
new file mode 100644
index 0000000..bdef636
--- /dev/null
+++ b/lfs-12.0-sysv/partintro/generalinstructions.html
@@ -0,0 +1,264 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+ <title>
+ Общие инструкции по компиляции
+ </title>
+ <link rel="stylesheet" type="text/css" href="../stylesheets/lfs.css" />
+ <meta name="generator" content="DocBook XSL Stylesheets V1.79.1" />
+ <link rel="stylesheet" href="../stylesheets/lfs-print.css" type=
+ "text/css" media="print" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ </head>
+ <body class="lfs" id="lfs-12.0">
+ <div class="navheader">
+ <h4>
+ Линукс с нуля - Версия 12.0
+ </h4>
+ <h3>
+ Важный предварительный материал
+ </h3>
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="toolchaintechnotes.html" title=
+ "Технические примечания по сборочным инструментам">Пред.</a>
+ <p>
+ Технические примечания по сборочным инструментам
+ </p>
+ </li>
+ <li class="next">
+ <a accesskey="n" href="../chapter05/chapter05.html" title=
+ "Сборка кросс-тулчейна">След.</a>
+ <p>
+ Сборка кросс-тулчейна
+ </p>
+ </li>
+ <li class="up">
+ <a accesskey="u" href="partintro.html" title=
+ "Важный предварительный материал">Наверх</a>
+ </li>
+ <li class="home">
+ <a accesskey="h" href="../index.html" title=
+ "Линукс с нуля - Версия 12.0">Начало</a>
+ </li>
+ </ul>
+ </div>
+ <div class="sect1" lang="en" xml:lang="en">
+ <h1 class="sect1">
+ <a id="ch-tools-generalinstructions" name=
+ "ch-tools-generalinstructions"></a>iii. Общие инструкции по
+ компиляции
+ </h1>
+ <p>
+ При сборке пакетов в инструкциях делается несколько допущений:
+ </p>
+ <div class="itemizedlist">
+ <ul>
+ <li class="listitem">
+ <p>
+ На некоторые пакеты необходимо наложить патчи перед
+ компиляцией, метод используется тогда, когда исправление
+ необходимо для решения проблем сборки. Патчи часто требуются
+ как в этой, так и в следующих главах, но иногда, когда один и
+ тот же пакет собирается более одного раза, патч требуется не
+ сразу. Поэтому не беспокойтесь, если инструкции для скачанного
+ патча отсутствуют. Предупреждающие сообщения о <span class=
+ "emphasis"><em>смещении (offset)</em></span> или <span class=
+ "emphasis"><em>размытии (fuzz)</em></span> также могут
+ появляться при применении патча. Не обращайте внимания на эти
+ предупреждения, патч все равно успешно применен.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Во время компиляции большинства пакетов на экране будут
+ отображаться предупреждения. Это нормально, и их можно смело
+ игнорировать. Предупреждения появляются, например, когда
+ используется устаревший, недопустимый синтаксис C или C++.
+ Стандарты C меняются довольно часто, и некоторые пакеты все еще
+ используют более старый стандарт. Это не является серьезной
+ проблемой, но вызывает появление предупреждений.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Проверьте в последний раз, что переменная среды <code class=
+ "envar">LFS</code> настроена правильно:
+ </p>
+ <pre class="userinput"><kbd class="command">echo $LFS</kbd></pre>
+ <p>
+ Убедитесь, что в выводе указан путь к точке монтирования
+ раздела LFS, то есть <code class="filename">/mnt/lfs</code>,
+ как в примере из этой книги.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Наконец, необходимо подчеркнуть два важных момента:
+ </p>
+ <div class="admon important">
+ <img alt="[Важно]" src="../images/important.png" />
+ <h3>
+ Важно
+ </h3>
+ <p>
+ Инструкции по сборке предполагают, что все <a class="xref"
+ href="../chapter02/hostreqs.html" title=
+ "2.2. Требования к хост-системе">Требования к
+ хост-системе</a>, включая символические ссылки, установлены
+ правильно:
+ </p>
+ <div class="itemizedlist">
+ <ul>
+ <li class="listitem">
+ <p>
+ <span class="command"><strong>bash</strong></span> это
+ используемая оболочка.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <span class="command"><strong>sh</strong></span> это
+ символическая ссылка на <span class=
+ "command"><strong>bash</strong></span>.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <span class=
+ "command"><strong>/usr/bin/awk</strong></span> это
+ символическая ссылка на <span class=
+ "command"><strong>gawk</strong></span>.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <span class=
+ "command"><strong>/usr/bin/yacc</strong></span> это
+ символическая ссылка на <span class=
+ "command"><strong>bison</strong></span> или небольшой
+ скрипт, который выполняет bison
+ </p>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="admon important">
+ <img alt="[Важно]" src="../images/important.png" />
+ <h3>
+ Важно
+ </h3>
+ <p>
+ Вот краткое описание процесса сборки:
+ </p>
+ <div class="orderedlist">
+ <ol class="compact">
+ <li class="listitem">
+ <p>
+ Поместите все исходники и патчи в каталог, который
+ будет доступен из среды chroot, например, <code class=
+ "filename">/mnt/lfs/sources/</code>.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Перейдите в каталог <code class=
+ "filename">/mnt/lfs/sources/</code>.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <a id="buildinstr" name="buildinstr"></a>Для каждого
+ пакета:
+ </p>
+ <div class="orderedlist">
+ <ol class="compact">
+ <li class="listitem">
+ <p>
+ С помощью программы <span class=
+ "command"><strong>tar</strong></span> извлеките
+ пакет для сборки. В <a class="xref" href=
+ "../chapter05/chapter05.html" title=
+ "Глава 5. Сборка кросс-тулчейна">Глава&nbsp;5</a>
+ и <a class="xref" href=
+ "../chapter06/chapter06.html" title=
+ "Глава 6. Кросс-Компиляция временных инструментов">
+ Глава&nbsp;6</a> убедитесь, что при извлечении
+ пакета вы залогинены под пользователем lfs.
+ </p>
+ <p>
+ Не используйте никаких методов, кроме команды
+ <span class=
+ "command"><strong>tar</strong></span>, для
+ извлечения исходного кода. Примечательно, что
+ использование команды <span class=
+ "command"><strong>cp -R</strong></span> для
+ копирования дерева исходного кода в другое место
+ может привести к уничтожению ссылок и меток
+ времени в дереве исходного кода и привести к сбою
+ сборки.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Перейдите в каталог, созданный при извлечении
+ пакета.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Следуйте инструкциям по сборке пакета.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Вернитесь в исходный каталог, когда сборка будет
+ завершена.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Удалите извлеченный каталог, если не указано
+ иное.
+ </p>
+ </li>
+ </ol>
+ </div>
+ </li>
+ </ol>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="navfooter">
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="toolchaintechnotes.html" title=
+ "Технические примечания по сборочным инструментам">Пред.</a>
+ <p>
+ Технические примечания по сборочным инструментам
+ </p>
+ </li>
+ <li class="next">
+ <a accesskey="n" href="../chapter05/chapter05.html" title=
+ "Сборка кросс-тулчейна">След.</a>
+ <p>
+ Сборка кросс-тулчейна
+ </p>
+ </li>
+ <li class="up">
+ <a accesskey="u" href="partintro.html" title=
+ "Важный предварительный материал">Наверх</a>
+ </li>
+ <li class="home">
+ <a accesskey="h" href="../index.html" title=
+ "Линукс с нуля - Версия 12.0">Начало</a>
+ </li>
+ </ul>
+ </div>
+ </body>
+</html>
diff --git a/lfs-12.0-sysv/partintro/introduction.html b/lfs-12.0-sysv/partintro/introduction.html
new file mode 100644
index 0000000..b3b98b1
--- /dev/null
+++ b/lfs-12.0-sysv/partintro/introduction.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+ <title>
+ Введение
+ </title>
+ <link rel="stylesheet" type="text/css" href="../stylesheets/lfs.css" />
+ <meta name="generator" content="DocBook XSL Stylesheets V1.79.1" />
+ <link rel="stylesheet" href="../stylesheets/lfs-print.css" type=
+ "text/css" media="print" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ </head>
+ <body class="lfs" id="lfs-12.0">
+ <div class="navheader">
+ <h4>
+ Линукс с нуля - Версия 12.0
+ </h4>
+ <h3>
+ Важный предварительный материал
+ </h3>
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="partintro.html" title=
+ "Важный предварительный материал">Пред.</a>
+ <p>
+ Важный предварительный материал
+ </p>
+ </li>
+ <li class="next">
+ <a accesskey="n" href="toolchaintechnotes.html" title=
+ "Технические примечания по сборочным инструментам">След.</a>
+ <p>
+ Технические примечания по сборочным инструментам
+ </p>
+ </li>
+ <li class="up">
+ <a accesskey="u" href="partintro.html" title=
+ "Важный предварительный материал">Наверх</a>
+ </li>
+ <li class="home">
+ <a accesskey="h" href="../index.html" title=
+ "Линукс с нуля - Версия 12.0">Начало</a>
+ </li>
+ </ul>
+ </div>
+ <div class="sect1" lang="en" xml:lang="en">
+ <h1 class="sect1">
+ <a id="ch-part3intro-intro" name="ch-part3intro-intro"></a>i.
+ Введение
+ </h1>
+ <p>
+ Эта часть разделена на три этапа: во-первых, сборка кросс-компилятора
+ и связанных с ним библиотек; во-вторых, использование этого набора
+ инструментов для сборки нескольких утилит таким образом, чтобы
+ изолировать их от основного дистрибутива; в-третьих, вход в среду
+ chroot (что ещё больше улучшает изоляцию от хоста), и сборка
+ оставшихся инструментов, необходимых для создания конечной системы.
+ </p>
+ <div class="admon important">
+ <img alt="[Важно]" src="../images/important.png" />
+ <h3>
+ Важно
+ </h3>
+ <p>
+ Именно здесь начинается настоящая работа по сборке новой системы.
+ Требуется очень тщательно следить за тем, чтобы инструкции
+ выполнялись точно так, как они приведены в книге. Вы должны
+ попытаться понять, что они делают, и каким бы ни было ваше желание
+ скорее закончить сборку, вам следует воздержаться от слепого набора
+ команд. Читайте документацию, если вы что-то не понимаете. Кроме
+ того, следите за результатом выполнения команд, отправляя лог в
+ файл с помощью утилиты <span class=
+ "command"><strong>tee</strong></span>. Это упрощает отладку, если
+ что-то пойдет не так.
+ </p>
+ </div>
+ <p>
+ Следующий раздел представляет собой техническое введение в процесс
+ сборки, а следующий за ним, содержит <span class=
+ "strong"><strong>очень важные</strong></span> общие инструкции по
+ компиляции.
+ </p>
+ </div>
+ <div class="navfooter">
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="partintro.html" title=
+ "Важный предварительный материал">Пред.</a>
+ <p>
+ Важный предварительный материал
+ </p>
+ </li>
+ <li class="next">
+ <a accesskey="n" href="toolchaintechnotes.html" title=
+ "Технические примечания по сборочным инструментам">След.</a>
+ <p>
+ Технические примечания по сборочным инструментам
+ </p>
+ </li>
+ <li class="up">
+ <a accesskey="u" href="partintro.html" title=
+ "Важный предварительный материал">Наверх</a>
+ </li>
+ <li class="home">
+ <a accesskey="h" href="../index.html" title=
+ "Линукс с нуля - Версия 12.0">Начало</a>
+ </li>
+ </ul>
+ </div>
+ </body>
+</html>
diff --git a/lfs-12.0-sysv/partintro/partintro.html b/lfs-12.0-sysv/partintro/partintro.html
new file mode 100644
index 0000000..25a670e
--- /dev/null
+++ b/lfs-12.0-sysv/partintro/partintro.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+ <title>
+ Важный предварительный материал
+ </title>
+ <link rel="stylesheet" type="text/css" href="../stylesheets/lfs.css" />
+ <meta name="generator" content="DocBook XSL Stylesheets V1.79.1" />
+ <link rel="stylesheet" href="../stylesheets/lfs-print.css" type=
+ "text/css" media="print" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ </head>
+ <body class="lfs" id="lfs-12.0">
+ <div class="navheader">
+ <h4>
+ Линукс с нуля - Версия 12.0
+ </h4>
+ <h3>
+ Часть&nbsp;III.&nbsp;Сборка кросс-компилятора и набора временных
+ инструментов
+ </h3>
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="../part3.html" title=
+ "Сборка кросс-компилятора и набора временных инструментов">Пред.</a>
+ <p>
+ Сборка кросс-компилятора и набора временных инструментов
+ </p>
+ </li>
+ <li class="next">
+ <a accesskey="n" href="introduction.html" title=
+ "Введение">След.</a>
+ <p>
+ Введение
+ </p>
+ </li>
+ <li class="up">
+ <a accesskey="u" href="../part3.html" title=
+ "Часть&nbsp;III.&nbsp;Сборка кросс-компилятора и набора временных инструментов">
+ Наверх</a>
+ </li>
+ <li class="home">
+ <a accesskey="h" href="../index.html" title=
+ "Линукс с нуля - Версия 12.0">Начало</a>
+ </li>
+ </ul>
+ </div>
+ <div class="preface" lang="en" xml:lang="en">
+ <h1 class="preface">
+ <a id="partintro-cross-temp" name="partintro-cross-temp"></a>Важный
+ предварительный материал
+ </h1>
+ <div class="toc">
+ <h3>
+ Содержание
+ </h3>
+ <ul>
+ <li class="sect1">
+ <a href="introduction.html">Введение</a>
+ </li>
+ <li class="sect1">
+ <a href="toolchaintechnotes.html">Технические примечания по
+ сборочным инструментам</a>
+ </li>
+ <li class="sect1">
+ <a href="generalinstructions.html">Общие инструкции по
+ компиляции</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="navfooter">
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="../part3.html" title=
+ "Сборка кросс-компилятора и набора временных инструментов">Пред.</a>
+ <p>
+ Сборка кросс-компилятора и набора временных инструментов
+ </p>
+ </li>
+ <li class="next">
+ <a accesskey="n" href="introduction.html" title=
+ "Введение">След.</a>
+ <p>
+ Введение
+ </p>
+ </li>
+ <li class="up">
+ <a accesskey="u" href="../part3.html" title=
+ "Часть&nbsp;III.&nbsp;Сборка кросс-компилятора и набора временных инструментов">
+ Наверх</a>
+ </li>
+ <li class="home">
+ <a accesskey="h" href="../index.html" title=
+ "Линукс с нуля - Версия 12.0">Начало</a>
+ </li>
+ </ul>
+ </div>
+ </body>
+</html>
diff --git a/lfs-12.0-sysv/partintro/toolchaintechnotes.html b/lfs-12.0-sysv/partintro/toolchaintechnotes.html
new file mode 100644
index 0000000..998168b
--- /dev/null
+++ b/lfs-12.0-sysv/partintro/toolchaintechnotes.html
@@ -0,0 +1,743 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+ <title>
+ Технические примечания по сборочным инструментам
+ </title>
+ <link rel="stylesheet" type="text/css" href="../stylesheets/lfs.css" />
+ <meta name="generator" content="DocBook XSL Stylesheets V1.79.1" />
+ <link rel="stylesheet" href="../stylesheets/lfs-print.css" type=
+ "text/css" media="print" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ </head>
+ <body class="lfs" id="lfs-12.0">
+ <div class="navheader">
+ <h4>
+ Линукс с нуля - Версия 12.0
+ </h4>
+ <h3>
+ Важный предварительный материал
+ </h3>
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="introduction.html" title=
+ "Введение">Пред.</a>
+ <p>
+ Введение
+ </p>
+ </li>
+ <li class="next">
+ <a accesskey="n" href="generalinstructions.html" title=
+ "Общие инструкции по компиляции">След.</a>
+ <p>
+ Общие инструкции по компиляции
+ </p>
+ </li>
+ <li class="up">
+ <a accesskey="u" href="partintro.html" title=
+ "Важный предварительный материал">Наверх</a>
+ </li>
+ <li class="home">
+ <a accesskey="h" href="../index.html" title=
+ "Линукс с нуля - Версия 12.0">Начало</a>
+ </li>
+ </ul>
+ </div>
+ <div class="sect1" lang="en" xml:lang="en">
+ <h1 class="sect1">
+ <a id="ch-tools-toolchaintechnotes" name=
+ "ch-tools-toolchaintechnotes"></a>ii. Технические примечания по
+ сборочным инструментам
+ </h1>
+ <p>
+ В этом разделе объясняются причины и некоторые технические детали,
+ лежащие в основе сборки пакетов. Не обязательно сразу понимать все,
+ что содержится в этом разделе. Большая часть этой информации станет
+ более понятной после выполнения фактической сборки. Возвращайтесь и
+ перечитывайте этот раздел в любое время по ходу сборки.
+ </p>
+ <p>
+ Основная задача <a class="xref" href="../chapter05/chapter05.html"
+ title="Глава 5. Сборка кросс-тулчейна">Глава&nbsp;5</a> и <a class=
+ "xref" href="../chapter06/chapter06.html" title=
+ "Глава 6. Кросс-Компиляция временных инструментов">Глава&nbsp;6</a>
+ состоит в том, чтобы создать временную область, содержащую заведомо
+ исправный набор инструментов, которые можно изолировать от
+ хост-системы. Использовании команды <span class=
+ "command"><strong>chroot</strong></span> в последующих главах,
+ обеспечит чистую и безотказную сборку целевой системы LFS. Процесс
+ сборки разработан таким образом, чтобы свести к минимуму риски для
+ новых читателей и в то же время обеспечить наибольшую образовательную
+ ценность.
+ </p>
+ <p>
+ Сборка инструментария основана на процессе <span class=
+ "emphasis"><em>кросс-компиляции</em></span>. Кросс-компиляция обычно
+ используется для сборки компилятора и его инструментов для машины,
+ отличной от той, которая используется для сборки. Строго говоря, это
+ не требуется для LFS, так как машина, на которой будет работать новая
+ система, та же, что и используемая для сборки. Но у кросс-компиляции
+ есть большое преимущество, заключающееся в том, что все, что
+ подвергается кросс-компиляции, не будет зависеть от окружения хоста.
+ </p>
+ <div class="sect2" lang="en" xml:lang="en">
+ <h2 class="sect2">
+ <a id="cross-compile" name="cross-compile"></a>О кросс-компиляции
+ </h2>
+ <div class="admon note">
+ <img alt="[Примечание]" src="../images/note.png" />
+ <h3>
+ Примечание
+ </h3>
+ <p>
+ Книга LFS не является руководством и не содержит общего
+ руководства по созданию кросс (или собственного) тулчейна. Не
+ используйте команды из книги для кросс-тулчейна, который
+ планируете использовать для каких-либо других целей, кроме
+ создания LFS, если у вас нет полного понимания, что вы делаете.
+ </p>
+ </div>
+ <p>
+ Кросс-компиляция включает в себя некоторые концепции, которые сами
+ по себе заслуживают отдельного раздела. Хотя этот раздел можно
+ пропустить при первом чтении, возвращение к нему позже будет
+ полезно для полного понимания процесса.
+ </p>
+ <p>
+ Давайте определим некоторые термины, используемые в этом контексте.
+ </p>
+ <div class="variablelist">
+ <dl class="variablelist">
+ <dt>
+ <span class="term">сборщик</span>
+ </dt>
+ <dd>
+ <p>
+ это машина, на которой мы собираем программы. Обратите
+ внимание, что этот компьютер упоминается как <span class=
+ "quote">«<span class="quote">хост</span>»</span> в других
+ разделах.
+ </p>
+ </dd>
+ <dt>
+ <span class="term">хост</span>
+ </dt>
+ <dd>
+ <p>
+ это машина/система, на которой будут выполняться встроенные
+ программы. Обратите внимание, что используемое здесь значение
+ слова <span class="quote">«<span class=
+ "quote">хост</span>»</span> отличается от того, которое
+ применяется в других разделах.
+ </p>
+ </dd>
+ <dt>
+ <span class="term">цель</span>
+ </dt>
+ <dd>
+ <p>
+ используется только для компиляторов. Это машина, для которой
+ компилятор создает код. Он может отличаться как от
+ <span class="quote">«<span class=
+ "quote">сборщика</span>»</span>, так и от <span class=
+ "quote">«<span class="quote">хоста</span>»</span>.
+ </p>
+ </dd>
+ </dl>
+ </div>
+ <p>
+ В качестве примера представим следующий сценарий (иногда называемый
+ <span class="quote">«<span class="quote">канадским
+ крестом</span>»</span>): у нас есть компилятор на медленной машине,
+ назовем ее машиной A и компилятор ccA. У нас также есть быстрая
+ машина (B), но без компилятора, и мы хотим создать код для другой
+ медленной машины (C). Чтобы собрать компилятор для машины C, у нас
+ будет три этапа:
+ </p>
+ <div class="informaltable">
+ <table class="informaltable" border="1">
+ <colgroup>
+ <col width="50pt" align="center" />
+ <col width="50pt" align="center" />
+ <col width="50pt" align="center" />
+ <col width="50pt" align="center" />
+ <col width="300pt" align="left" />
+ </colgroup>
+ <thead>
+ <tr>
+ <th align="center">
+ Этап
+ </th>
+ <th align="center">
+ Сборщик
+ </th>
+ <th align="center">
+ Хост
+ </th>
+ <th align="center">
+ Цель
+ </th>
+ <th align="left">
+ Действие
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td align="center">
+ 1
+ </td>
+ <td align="center">
+ A
+ </td>
+ <td align="center">
+ A
+ </td>
+ <td align="center">
+ B
+ </td>
+ <td align="left">
+ Сборка кросс-компилятора cc1 с использованием ccA на машине
+ A
+ </td>
+ </tr>
+ <tr>
+ <td align="center">
+ 2
+ </td>
+ <td align="center">
+ A
+ </td>
+ <td align="center">
+ B
+ </td>
+ <td align="center">
+ C
+ </td>
+ <td align="left">
+ Сборка кросс-компилятора cc2 с использованием cc1 на машине
+ A
+ </td>
+ </tr>
+ <tr>
+ <td align="center">
+ 3
+ </td>
+ <td align="center">
+ B
+ </td>
+ <td align="center">
+ C
+ </td>
+ <td align="center">
+ C
+ </td>
+ <td align="left">
+ Сборка компилятора ccC с использованием cc2 на машине B
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ Затем все другие программы, необходимые для машины C, могут быть
+ скомпилированы с помощью cc2 на быстрой машине B. Обратите
+ внимание, что до тех пор, пока B не может запускать программы,
+ собранные для C, нет способа протестировать программы, пока не
+ будет запущена сама машина C. Например, чтобы запустить набор
+ тестов на ccC мы можем добавить четвертый этап:
+ </p>
+ <div class="informaltable">
+ <table class="informaltable" border="1">
+ <colgroup>
+ <col width="50pt" align="center" />
+ <col width="50pt" align="center" />
+ <col width="50pt" align="center" />
+ <col width="50pt" align="center" />
+ <col width="300pt" align="left" />
+ </colgroup>
+ <thead>
+ <tr>
+ <th align="center">
+ Этап
+ </th>
+ <th align="center">
+ Сборщик
+ </th>
+ <th align="center">
+ Хост
+ </th>
+ <th align="center">
+ Цель
+ </th>
+ <th align="left">
+ Действие
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td align="center">
+ 4
+ </td>
+ <td align="center">
+ C
+ </td>
+ <td align="center">
+ C
+ </td>
+ <td align="center">
+ C
+ </td>
+ <td align="left">
+ Пересобрать и протестировать ccC, используя ccC на машине C
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ В приведенном выше примере только cc1 и cc2 являются
+ кросс-компиляторами, то есть они создают код для машины, отличной
+ от той, на которой они выполняются. Компиляторы ccA и ccC создают
+ код для машины, на которой они выполняются. Такие компиляторы
+ называются <span class="emphasis"><em>нативными</em></span>
+ компиляторами.
+ </p>
+ </div>
+ <div class="sect2" lang="en" xml:lang="en">
+ <h2 class="sect2">
+ <a id="lfs-cross" name="lfs-cross"></a>Реализация кросс-компиляции
+ для LFS
+ </h2>
+ <div class="admon note">
+ <img alt="[Примечание]" src="../images/note.png" />
+ <h3>
+ Примечание
+ </h3>
+ <p>
+ Все кросс-компилируемые пакеты в этой книге используют систему
+ сборки на основе autoconf. Система сборки на основе autoconf
+ принимает типы систем вида cpu-vendor-kernel-os, называемые
+ системным триплетом. Поскольку поле vendor часто не содержит
+ значения, autoconf позволяет вам опустить его.
+ </p>
+ <p>
+ Проницательный читатель может задаться вопросом, почему название
+ <span class="quote">«<span class="quote">триплет</span>»</span>
+ применяется к имени из четырех компонентов. Поле kernel и поле os
+ ранее применялись как единый элемент: <span class=
+ "quote">«<span class="quote">system</span>»</span>. Такая форма с
+ тремя полями все еще актуальна для некоторых систем, например,
+ <code class="literal">x86_64-unknown-freebsd</code>. Но две
+ системы могут использовать одно и то же ядро и все же быть
+ слишком разными, чтобы использовать одинаковый триплет для их
+ описания. Например, Android, работающий на мобильном телефоне
+ полностью отличается от Ubuntu, работающей на ARM64 сервере, хотя
+ они оба работают на одном и том же типе процессора (ARM64) и с
+ одним ядром (Linux).
+ </p>
+ <p>
+ Без слоя эмуляции вы не сможете запустить исполняемый файл c
+ сервера на мобильном телефоне и наоборот. Итак, поле <span class=
+ "quote">«<span class="quote">system</span>»</span> было разделено
+ на поля kernel и os, чтобы однозначно их интерпретировать. В
+ нашем примере Android обозначается как <code class=
+ "literal">aarch64-unknown-linux-android</code>, а Ubuntu
+ <code class="literal">aarch64-unknown-linux-gnu</code>.
+ </p>
+ <p>
+ Слово <span class="quote">«<span class=
+ "quote">триплет</span>»</span> сохранилось в лексиконе. Простой
+ способ определить триплет вашей машины — запустить скрипт
+ <span class="command"><strong>config.guess</strong></span>,
+ который входит в исходный код многих пакетов. Распакуйте
+ исходники binutils и запустите скрипт: <strong class=
+ "userinput"><code>./config.guess</code></strong>, обратите
+ внимание на вывод. Например, для 32-разрядного процессора Intel
+ вывод будет <span class=
+ "emphasis"><em>i686-pc-linux-gnu</em></span>. В 64-битной системе
+ это будет <span class=
+ "emphasis"><em>x86_64-pc-linux-gnu</em></span>. В большинстве
+ систем Linux используют еще более простую команду <span class=
+ "command"><strong>gcc -dumpmachine</strong></span>, которая
+ предоставит вам аналогичную информацию.
+ </p>
+ <p>
+ Вы также должны знать имя динамического компоновщика платформы,
+ часто называемого динамическим загрузчиком (не путать со
+ стандартным компоновщиком <span class=
+ "command"><strong>ld</strong></span>, который является частью
+ binutils). Динамический компоновщик, предоставляемый glibc,
+ находит и загружает общие библиотеки, необходимые программе,
+ подготавливает программу к запуску, а затем запускает ее. Имя
+ динамического компоновщика для 32-разрядной машины Intel —
+ <code class="filename">ld-linux.so.2</code>, а для 64-разрядных
+ систем — <code class="filename">ld-linux-x86-64.so.2</code>.
+ Надежный способ определить имя динамического компоновщика —
+ проверить случайный двоичный файл из хост-системы, выполнив
+ следующую команду: <strong class="userinput"><code>readelf -l
+ &lt;имя исполняемого файла&gt; | grep interpreter</code></strong>
+ и зафиксировать результат. Официальный источник, охватывающий все
+ платформы, находится в файле <code class=
+ "filename">shlib-versions</code> в корне дерева исходного кода
+ glibc.
+ </p>
+ </div>
+ <p>
+ Чтобы сымитировать кросс-компиляцию в LFS, имя триплета хоста
+ немного подкорректировали, изменив поле "vendor" в переменной
+ <code class="envar">LFS_TGT</code> таким образом, чтобы оно
+ указывало "lfs". Мы также используем параметр <em class=
+ "parameter"><code>--with-sysroot</code></em> при сборке
+ кросс-компоновщика и кросс-компилятора, чтобы сообщить им, где
+ найти необходимые файлы хоста. Это гарантирует, что ни одна из
+ программ, входящих в <a class="xref" href=
+ "../chapter06/chapter06.html" title=
+ "Глава 6. Кросс-Компиляция временных инструментов">Глава&nbsp;6</a>,
+ не сможет ссылаться на библиотеки на машине сборки. Для корректной
+ работы, обязательны всего два этапа, еще один рекомендуется для
+ тестирования:
+ </p>
+ <div class="informaltable">
+ <table class="informaltable" border="1">
+ <colgroup>
+ <col width="50pt" align="center" />
+ <col width="50pt" align="center" />
+ <col width="50pt" align="center" />
+ <col width="50pt" align="center" />
+ <col width="300pt" align="left" />
+ </colgroup>
+ <thead>
+ <tr>
+ <th align="center">
+ Этап
+ </th>
+ <th align="center">
+ Сборщик
+ </th>
+ <th align="center">
+ Хост
+ </th>
+ <th align="center">
+ Цель
+ </th>
+ <th align="left">
+ Действие
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td align="center">
+ 1
+ </td>
+ <td align="center">
+ ПК
+ </td>
+ <td align="center">
+ ПК
+ </td>
+ <td align="center">
+ LFS
+ </td>
+ <td align="left">
+ Сборка кросс-компилятора cc1 с использованием cc-pc на ПК
+ </td>
+ </tr>
+ <tr>
+ <td align="center">
+ 2
+ </td>
+ <td align="center">
+ ПК
+ </td>
+ <td align="center">
+ LFS
+ </td>
+ <td align="center">
+ LFS
+ </td>
+ <td align="left">
+ Сборка компилятора cc-lfs с использованием cc1 на ПК
+ </td>
+ </tr>
+ <tr>
+ <td align="center">
+ 3
+ </td>
+ <td align="center">
+ LFS
+ </td>
+ <td align="center">
+ LFS
+ </td>
+ <td align="center">
+ LFS
+ </td>
+ <td align="left">
+ Пересборка и тестирование cc-lfs, используя cc-lfs в lfs
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ В приведенной выше таблице <span class="quote">«<span class=
+ "quote">ПК</span>»</span> означает, что команды выполняются на
+ компьютере с использованием уже установленного дистрибутива.
+ <span class="quote">«<span class="quote">В lfs</span>»</span>
+ означает, что команды выполняются в chroot-окружении.
+ </p>
+ <p>
+ Это еще не конец истории. Язык С - это не просто компилятор; также
+ он определяет стандартную библиотеку. В этой книге используется
+ библиотека GNU C под названием glibc (есть альтернативный вариант -
+ "musl"). Эта библиотека должна быть скомпилирована для машины lfs,
+ то есть с использованием кросс-компилятора cc1. Но сам компилятор
+ использует внутреннюю библиотеку, реализующую сложные инструкции,
+ недоступные в наборе инструкций ассемблера. Эта внутренняя
+ библиотека называется libgcc, и для полноценной работы ее
+ необходимо связать с библиотекой glibc! Кроме того, стандартная
+ библиотека для C++ (libstdc++) также должна быть связана с glibc.
+ Решение этой проблемы курицы и яйца состоит в том, чтобы сначала
+ собрать деградированную libgcc на основе cc1, в которой отсутствуют
+ некоторые функциональные возможности, такие как потоки и обработка
+ исключений, затем собрать glibc с использованием этого
+ деградированного компилятора (сама glibc не деградирована), а затем
+ собрать libstdc++. В этой последней библиотеке будет не хватать
+ некоторых функциональных возможностей libgcc.
+ </p>
+ <p>
+ Выводом из предыдущего абзаца является то, что cc1 не может собрать
+ полнофункциональную libstdc++ с деградированной libgcc, но это
+ единственный компилятор, доступный для сборки библиотек C/C++ на
+ этапе 2. Есть две причины, по которым мы не используем сразу
+ компилятор cc-lfs, собранный на этапе 2, для сборки этих библиотек.
+ </p>
+ <div class="itemizedlist">
+ <ul>
+ <li class="listitem">
+ <p>
+ Вообще говоря, cc-lfs не может работать на ПК (хост-системе).
+ Хотя триплеты для ПК и LFS совместимы друг с другом,
+ исполняемый файл для lfs должен зависеть от glibc-2.38;
+ хост-дистрибутив может использовать либо другую реализацию
+ libc (например, musl), либо предыдущий выпуск glibc
+ (например, glibc-2.13).
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Даже если cc-lfs может работать на ПК, его использование на
+ ПК сопряжено с риском привязки к библиотекам ПК, так как
+ cc-lfs является родным компилятором.
+ </p>
+ </li>
+ </ul>
+ </div>
+ <p>
+ Поэтому, когда мы собираем gcc этап 2, мы даем указание системе
+ сборки пересобрать libgcc и libstdc++ с помощью cc1, но мы
+ связываем libstdc++ с новой пересобранной libgcc вместо старой,
+ деградированной. Это делает пересобранную библиотеку libstdc++
+ полностью функциональной.
+ </p>
+ <p>
+ В <a class="xref" href="../chapter08/chapter08.html" title=
+ "Глава 8. Установка базового системного программного обеспечения">Глава&nbsp;8</a>
+ (или <span class="quote">«<span class="quote">этап
+ 3</span>»</span>) собраны все пакеты, необходимые для системы LFS.
+ Даже если пакет уже был установлен в системе LFS в предыдущей
+ главе, мы все равно пересобираем пакет. Основная причина пересборки
+ этих пакетов состоит в том, чтобы сделать их стабильными: если мы
+ переустанавливаем пакет LFS в готовой системе LFS, содержимое
+ пакета должно совпадать с содержимым того же пакета при первой
+ установке в <a class="xref" href="../chapter08/chapter08.html"
+ title=
+ "Глава 8. Установка базового системного программного обеспечения">Глава&nbsp;8</a>.
+ Временные пакеты, установленные в <a class="xref" href=
+ "../chapter06/chapter06.html" title=
+ "Глава 6. Кросс-Компиляция временных инструментов">Глава&nbsp;6</a>
+ или <a class="xref" href="../chapter07/chapter07.html" title=
+ "Глава 7. Вход в окружение Chroot и создание дополнительных временных инструментов">
+ Глава&nbsp;7</a> не могут удовлетворять этому требованию, потому
+ что некоторые из них собраны без необязательных зависимостей и
+ autoconf не может выполнить некоторые проверки функций в <a class=
+ "xref" href="../chapter06/chapter06.html" title=
+ "Глава 6. Кросс-Компиляция временных инструментов">Глава&nbsp;6</a>
+ из-за кросс-компиляции, в результате чего во временных пакетах
+ отсутствуют дополнительные функции или используются не оптимальные
+ процедуры кода. Кроме того, второстепенной причиной для пересборки
+ пакетов является выполнение тестов.
+ </p>
+ </div>
+ <div class="sect2" lang="en" xml:lang="en">
+ <h2 class="sect2">
+ <a id="other-details" name="other-details"></a>Другие детали
+ процесса
+ </h2>
+ <p>
+ Кросс-компилятор будет установлен в отдельный каталог <code class=
+ "filename">$LFS/tools</code>, так как он не будет частью конечной
+ системы.
+ </p>
+ <p>
+ Сначала устанавливается Binutils, потому что во время выполнения
+ команды <span class="command"><strong>configure</strong></span> gcc
+ и glibc выполняются различные тесты функций на ассемблере и
+ компоновщике, чтобы определить, какие программные функции следует
+ включить или отключить. Это важнее, чем может показаться на первый
+ взгляд. Неправильно настроенный gcc или glibc может привести к
+ незначительной поломке сборочных инструментов, где последствия
+ такой поломки могут проявиться ближе к концу сборки всего
+ дистрибутива. Сбой тестов обычно выявляет эту ошибку до того, как
+ будет выполнено много дополнительной работы.
+ </p>
+ <p>
+ Binutils устанавливает свой ассемблер и компоновщик в двух местах:
+ <code class="filename">$LFS/tools/bin</code> и <code class=
+ "filename">$LFS/tools/$LFS_TGT/bin</code>. Инструменты в одном
+ месте жестко связаны с другими. Важным аспектом компоновщика
+ является порядок поиска в библиотеке. Подробную информацию можно
+ получить от <span class="command"><strong>ld</strong></span>,
+ передав ей флаг <em class="parameter"><code>--verbose</code></em>.
+ Например, <span class="command"><strong>$LFS_TGT-ld --verbose |
+ grep SEARCH</strong></span> покажет текущие пути поиска и их
+ порядок. Он показывает, какие файлы связаны с помощью <span class=
+ "command"><strong>ld</strong></span>, путем компиляции фиктивной
+ программы и передачи параметра <em class=
+ "parameter"><code>--verbose</code></em> компоновщику. Например,
+ <span class="command"><strong>$LFS_TGT-gcc dummy.c -Wl,--verbose
+ 2&gt;&amp;1 | grep succeeded</strong></span> покажет все файлы,
+ успешно открытые во время компоновки.
+ </p>
+ <p>
+ Следующий устанавливаемый пакет — gcc. Пример того, что можно
+ увидеть во время запуска <span class=
+ "command"><strong>configure</strong></span>:
+ </p>
+ <pre class="screen"><code class=
+ "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</code></pre>
+ <p>
+ Это важно по причинам, упомянутым выше. Также здесь
+ демонстрируется, что сценарий настройки gcc не просматривает
+ значения переменной PATH, чтобы найти, какие инструменты
+ использовать. Однако во время фактической работы самого
+ <span class="command"><strong>gcc</strong></span> не обязательно
+ используются одни и те же пути поиска. Чтобы узнать, какой
+ стандартный компоновщик будет использовать <span class=
+ "command"><strong>gcc</strong></span>, запустите: <span class=
+ "command"><strong>$LFS_TGT-gcc -print-prog-name=ld</strong></span>.
+ </p>
+ <p>
+ Подробную информацию можно получить из <span class=
+ "command"><strong>gcc</strong></span>, передав ему параметр
+ <em class="parameter"><code>-v</code></em> при компиляции фиктивной
+ программы. Например, <span class="command"><strong>gcc -v
+ dummy.c</strong></span> покажет подробную информацию об этапах
+ препроцессора, компиляции и сборки, включая указанные в
+ <span class="command"><strong>gcc</strong></span> пути поиска и их
+ порядок.
+ </p>
+ <p>
+ Далее устанавливаются очищенные заголовочные файлы Linux API. Они
+ позволяют стандартной библиотеке C (Glibc) взаимодействовать с
+ функциями, предоставляемыми ядром Linux.
+ </p>
+ <p>
+ Следующий устанавливаемый пакет — glibc. Наиболее важными при
+ сборке glibc являются компилятор, бинарные инструменты и
+ заголовочные файлы ядра. С компилятором, как правило, не бывает
+ проблем, поскольку glibc всегда будет использовать компилятор,
+ указанный в параметре <em class=
+ "parameter"><code>--host</code></em>, переданный скрипту configure;
+ например, в нашем случае компилятором будет <span class=
+ "command"><strong>$LFS_TGT-gcc</strong></span>. С бинарными
+ инструментами и заголовки ядра может быть немного сложнее. Поэтому
+ мы не рискуем и используем доступные параметры конфигурации, чтобы
+ обеспечить правильный выбор. После запуска <span class=
+ "command"><strong>configure</strong></span> проверьте содержимое
+ файла <code class="filename">config.make</code> в каталоге
+ <code class="filename">сборки</code> на наличие всех важных
+ деталей. Обратите внимание на использование опции <em class=
+ "parameter"><code>CC="$LFS_TGT-gcc"</code></em> (с переменной
+ <code class="envar">$LFS_TGT</code>) для управления используемыми
+ бинарными инструментами и использование флагов <em class=
+ "parameter"><code>-nostdinc</code></em> и <em class=
+ "parameter"><code>-isystem</code></em> для управления включаемым
+ путем поиска компилятора. Эти пункты подчеркивают важный аспект
+ пакета glibc — он очень самодостаточен с точки зрения своего
+ механизма сборки и, как правило, не полагается на значения по
+ умолчанию.
+ </p>
+ <p>
+ Как было сказано выше, затем компилируется стандартная библиотека
+ C++, а затем в <a class="xref" href="../chapter06/chapter06.html"
+ title=
+ "Глава 6. Кросс-Компиляция временных инструментов">Глава&nbsp;6</a>
+ все остальные программы, которым необходимо разрешить проблему
+ циклических зависимостей во время сборки. На этапе установки всех
+ этих пакетов используется переменная DESTDIR, для принудительной
+ установки в файловую систему LFS.
+ </p>
+ <p>
+ В конце <a class="xref" href="../chapter06/chapter06.html" title=
+ "Глава 6. Кросс-Компиляция временных инструментов">Глава&nbsp;6</a>
+ устанавливается собственный компилятор lfs. Сначала собирается
+ binutils с той же переменной <code class="envar">DESTDIR</code>,
+ что и другие программы, затем повторно собирается gcc, без сборки
+ некоторых некритических библиотек. Из-за какой-то странной логики в
+ сценарии настройки GCC <code class="envar">CC_FOR_TARGET</code>
+ заканчивается как <span class="command"><strong>cc</strong></span>,
+ когда хост совпадает с целью, но отличается от системы сборки.
+ Поэтому значение <em class=
+ "parameter"><code>CC_FOR_TARGET=$LFS_TGT-gcc</code></em> явно
+ указывается в параметрах конфигурации.
+ </p>
+ <p>
+ После входа в среду chroot в <a class="xref" href=
+ "../chapter07/chapter07.html" title=
+ "Глава 7. Вход в окружение Chroot и создание дополнительных временных инструментов">
+ Глава&nbsp;7</a> первой задачей является установка libstdc++. Затем
+ выполняется установка временных программ, необходимых для
+ правильной работы тулчейна. С этого момента основной набор
+ инструментов является самодостаточным и автономным. В <a class=
+ "xref" href="../chapter08/chapter08.html" title=
+ "Глава 8. Установка базового системного программного обеспечения">Глава&nbsp;8</a>
+ собираются, тестируются и устанавливаются окончательные версии всех
+ пакетов, необходимых для полнофункциональной системы.
+ </p>
+ </div>
+ </div>
+ <div class="navfooter">
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="introduction.html" title=
+ "Введение">Пред.</a>
+ <p>
+ Введение
+ </p>
+ </li>
+ <li class="next">
+ <a accesskey="n" href="generalinstructions.html" title=
+ "Общие инструкции по компиляции">След.</a>
+ <p>
+ Общие инструкции по компиляции
+ </p>
+ </li>
+ <li class="up">
+ <a accesskey="u" href="partintro.html" title=
+ "Важный предварительный материал">Наверх</a>
+ </li>
+ <li class="home">
+ <a accesskey="h" href="../index.html" title=
+ "Линукс с нуля - Версия 12.0">Начало</a>
+ </li>
+ </ul>
+ </div>
+ </body>
+</html>