summaryrefslogtreecommitdiff
path: root/lfs-12.1-sysv/partintro/toolchaintechnotes.html
diff options
context:
space:
mode:
authorSn4il <sn4il@thedroth.rocks>2024-09-02 15:54:35 +0300
committerSn4il <sn4il@thedroth.rocks>2024-09-02 15:54:35 +0300
commit2203e654b389586650d553251b04544a34f189bf (patch)
tree0125b69fc70a2506c53158ba2020993a5b8985b7 /lfs-12.1-sysv/partintro/toolchaintechnotes.html
parent200d528e55ca954d37769f4d143f10c9519b00e7 (diff)
downloadsn4il-site-2203e654b389586650d553251b04544a34f189bf.tar.gz
sn4il-site-2203e654b389586650d553251b04544a34f189bf.zip
LFS 12.2
Diffstat (limited to 'lfs-12.1-sysv/partintro/toolchaintechnotes.html')
-rw-r--r--lfs-12.1-sysv/partintro/toolchaintechnotes.html743
1 files changed, 0 insertions, 743 deletions
diff --git a/lfs-12.1-sysv/partintro/toolchaintechnotes.html b/lfs-12.1-sysv/partintro/toolchaintechnotes.html
deleted file mode 100644
index f969bb1..0000000
--- a/lfs-12.1-sysv/partintro/toolchaintechnotes.html
+++ /dev/null
@@ -1,743 +0,0 @@
-<!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 Vsnapshot" />
- <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.1">
- <div class="navheader">
- <h4>
- Линукс с нуля - Версия 12.1
- </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.1">Начало</a>
- </li>
- </ul>
- </div>
- <h1 class="sect1">
- <a id="ch-tools-toolchaintechnotes" name=
- "ch-tools-toolchaintechnotes"></a>ii. Технические примечания по
- сборочным инструментам
- </h1>
- <div class="sect1" lang="ru" xml:lang="ru">
- <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="ru" xml:lang="ru">
- <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="ru" xml:lang="ru">
- <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.39;
- хост-дистрибутив может использовать либо другую реализацию
- 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="ru" xml:lang="ru">
- <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.1">Начало</a>
- </li>
- </ul>
- </div>
- </body>
-</html>