Инструменты пользователя

Инструменты сайта

  • Показать страницу
  • История страницы
  • Ссылки сюда
  • Оставить на чай
  • Экспорт в PDF
  • Наверх

  • software:linux_server:lfs:chapter05

    Различия

    Показаны различия между двумя версиями страницы.

    Ссылка на это сравнение

    Следующая версия
    Предыдущая версия
    software:linux_server:lfs:chapter05 [2024/07/02 00:11] – создано vladpolskiysoftware:linux_server:lfs:chapter05 [2024/07/02 12:36] (текущий) – [5. Сборка кросс-тулчейна] vladpolskiy
    Строка 1: Строка 1:
    -======5. Заключительный этап подготовки======+======Часть III. Глава 5. Сборка кросс-тулчейна======
     Содержание Содержание
       * [[software:linux_server:lfs:chapter05#5.1. Введение|5.1. Введение]]   * [[software:linux_server:lfs:chapter05#5.1. Введение|5.1. Введение]]
    Строка 204: Строка 204:
      
     =====5.4. Заголовочные файлы Linux-6.7.4 API===== =====5.4. Заголовочные файлы Linux-6.7.4 API=====
     +
     +|Заголовочные файлы Linux API (в linux-6.7.4.tar.xz) предоставляют API ядра для использования Glibc.||
     +|Приблизительное время сборки:|менее 0.1 SBU|
     +|Требуемое дисковое пространство:|1.5 GB|
     +
     +====5.4.1. Установка заголовочных файлов====
     +
     +Ядро Linux должно предоставлять интерфейс прикладного программирования (API) для использования системной библиотекой C (Glibc в LFS). Это делается путем установки заголовочных файлов C, которые поставляются в архиве с исходным кодом ядра Linux.
     +
     +Убедитесь, что в пакете нет устаревших файлов:
     +
     +<code>
     +make mrproper
     +</code>
     +
     +Теперь извлеките видимые пользователю заголовочные файлы ядра из исходного кода. Рекомендуемый способ make «headers_install» использовать нельзя, так как для этого требуется rsync, который может быть недоступен. Заголовочные файлы сначала помещаются в /usr, а затем копируются в нужное место.
     +
     +<code>
     +make headers
     +find usr/include -type f ! -name '*.h' -delete
     +cp -rv usr/include $LFS/usr
     +</code>
     +
     +====5.4.2. Содержимое заголовочных файлов Linux API====
     +
     +|**Установленные заголовочные файлы:**|/usr/include/asm/*.h, /usr/include/asm-generic/*.h, /usr/include/drm/*.h, /usr/include/linux/*.h, /usr/include/misc/*.h, /usr/include/mtd/*.h, /usr/include/rdma/*.h, /usr/include/scsi/*.h, /usr/include/sound/*.h, /usr/include/video/*.h, and /usr/include/xen/*.h|
     +|**Созданные каталоги:**|/usr/include/asm, /usr/include/asm-generic, /usr/include/drm, /usr/include/linux, /usr/include/misc, /usr/include/mtd, /usr/include/rdma, /usr/include/scsi, /usr/include/sound, /usr/include/video, and /usr/include/xen|
     +
     +===Краткое описание===
     +
     +|/usr/include/asm/*.h|Заголовочные файлы Linux API ASM|
     +|/usr/include/asm-generic/*.h|Заголовочные файлы Linux API ASM Generic|
     +|/usr/include/drm/*.h|Заголовочные файлы Linux API DRM|
     +|/usr/include/linux/*.h|Заголовочные файлы Linux API Linux|
     +|/usr/include/misc/*.h|Заголовочные файлы Linux API Miscellaneous|
     +|/usr/include/mtd/*.h|Заголовочные файлы API MTD|
     +|/usr/include/rdma/*.h|Заголовочные файлы Linux API RDMA|
     +|/usr/include/scsi/*.h|Заголовочные файлы Linux API SCSI|
     +|/usr/include/sound/*.h|Заголовочные файлы Linux API Sound|
     +|/usr/include/video/*.h|Заголовочные файлы Linux API Video|
     +|/usr/include/xen/*.h|Заголовочные файлы Linux API Xen|
     +
     +=====5.5. Glibc-2.39=====
     +
     +|Пакет Glibc содержит основную библиотеку C. Эта библиотека предоставляет основные процедуры для выделения памяти, поиска в каталогах, открытия и закрытия файлов, чтения и записи файлов, обработки строк, сопоставления с образцом, арифметики и так далее||
     +|Приблизительное время сборки:|1.5 SBU|
     +|Требуемое дисковое пространство:|846 MB|
     +
     +====5.5.1. Установка пакета Glibc====
     +
     +Во-первых, создайте символическую ссылку для соответствия требованиям LSB. Кроме того, для совместимости с x86_64 создайте символическую ссылку, необходимую для правильной работы загрузчика динамической библиотеки:
     +
     +<code>
     +case $(uname -m) in
     +    i?86)   ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
     +    ;;
     +    x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
     +            ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3
     +    ;;
     +esac
     +</code>
     +
     +<WRAP left round info 100%>
     +**Примечание** \\  
     +Приведенная выше команда верна. Команда ln имеет несколько вариантов синтаксиса, поэтому обязательно ознакомьтесь с info coreutils ln и [[https://man.archlinux.org/man/ln.1|ln(1)]], прежде чем сообщать об ошибке.
     +</WRAP>
     +
     +Некоторые программы, использующие Glibc, применяют несовместимый с FHS каталог /var/db для хранения своих данных времени выполнения. Установите следующий патч, чтобы такие программы хранили свои данные в местах, совместимых с FHS:
     +
     +<code>
     +patch -Np1 -i ../glibc-2.39-fhs-1.patch
     +</code>
     +
     +В документации к Glibc рекомендуется собирать Glibc в отдельном каталоге:
     +
     +<code>
     +mkdir -v build
     +cd       build
     +</code>
     +
     +Убедитесь, что утилиты ldconfig and sln установлены в /usr/sbin:
     +
     +<code>
     +echo "rootsbindir=/usr/sbin" > configparms
     +</code>
     +
     +Затем подготовьте Glibc к компиляции:
     +
     +<code>
     +../configure                             \
     +      --prefix=/usr                      \
     +      --host=$LFS_TGT                    \
     +      --build=$(../scripts/config.guess) \
     +      --enable-kernel=4.19               \
     +      --with-headers=$LFS/usr/include    \
     +      --disable-nscd                     \
     +      libc_cv_slibdir=/usr/lib
     +</code>
     +
     +===Значение параметров настройки:===
     +
     +  * **--host=$LFS_TGT, --build=$(../scripts/config.guess)**
     +Комбинация этих опций указывает на то, что система сборки Glibc настраивается на кросс-компиляцию с использованием кросс-компоновщика и кросс-компилятора в $LFS/tools.
     +
     +  * **--enable-kernel=4.19**
     +Этот параметр позволяет Glibc выполнять компиляцию библиотеки с поддержкой ядра 4.19 и более поздних версий. Поддержка более старых ядер не включена.
     +
     +  * **--with-headers=$LFS/usr/include**
     +Этот аргумент позволяет скомпилировать библиотеку с заголовочными файлами, недавно установленными в каталоге $LFS/usr/include, таким образом, пакету будет известно, какие функции есть у ядра, чтобы оптимизировать себя.
     +
     +  * **libc_cv_slibdir=/usr/lib**
     +Этот аргумент гарантирует, что библиотека будет установлена в /usr/lib вместо стандартного /lib64 на 64-битных машинах.
     +
     +  * **--disable-nscd**
     +Параметр отключает сборку демона кэша службы имен, который больше не используется.
     +
     +На этом этапе может появиться следующее предупреждение:
     +
     +<code>
     +configure: WARNING:
     +*** These auxiliary programs are missing or
     +*** incompatible versions: msgfmt
     +*** some features will be disabled.
     +*** Check the INSTALL file for required versions.
     +</code>
     +
     +Отсутствующая или несовместимая программа msgfmt, как правило, безвредна. msgfmt является частью пакета Gettext, который должен предоставлять хост-дистрибутив.
     +
     +<WRAP left round info 100%>
     +**Примечание** \\  
     +Поступали сообщения о том, что этот пакет может не компилироваться при «параллельной сборке». Если это произойдет, повторно запустите команду make с параметром -j1.
     +</WRAP>
     +
     +Скомпилируйте пакет:
     +
     +<code>
     +make
     +</code>
     +
     +Установите пакет:
     +
     +<WRAP left round alert 100%>
     +**Важно** \\  
     +Если переменная LFS настроена неправильно, и, несмотря на рекомендации, вы выполняете сборку от имени пользователя root, следующая команда установит только что собранный Glibc в вашу хост-систему, что, скорее всего, сделает её непригодной для использования. Поэтому дважды проверьте, правильность настройки среды и что вы вошли в систему не под учетной записью root, прежде чем запускать следующую команду.
     +</WRAP>
     +
     +<code>
     +make DESTDIR=$LFS install
     +</code>
     +
     +===Значение опции make install:===
     +
     +  * **DESTDIR=$LFS**
     +Переменная make DESTDIR используется почти всеми пакетами для определения места установки пакета. Если она не задана, по умолчанию для установки используется корневой каталог (/). Здесь мы указываем, что пакет должен быть установлен в $LFS, который станет корневым каталогом в [[software:linux_server:lfs:chapter07#7.4. Вход в окружение Chroot|Разделе 7.4. «Вход в окружение Chroot»»]] .
     +
     +Исправьте жестко запрограммированный путь к исполняемому загрузчику в ldd:
     +
     +<code>
     +sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
     +</code>
     +
     +<WRAP left round important 100%>
     +**Внимание** \\  
     +На этом этапе необходимо остановиться и убедиться, что основные функции (компиляция и компоновка) нового кросс-тулчейна работают должным образом. Чтобы выполнить проверку работоспособности, выполните следующие команды:
     +<code>
     +echo 'int main(){}' | $LFS_TGT-gcc -xc -
     +readelf -l a.out | grep ld-linux
     +</code>
     +Если все работает правильно, ошибок быть не должно и вывод последней команды будет иметь вид:
     +<code>
     +[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
     +</code>
     +Обратите внимание, что для 32-разрядных машин имя интерпретатора будет /lib/ld-linux.so.2.
     +
     +Если выходные данные отображаются не так, как указано выше, или их вообще нет, значит, что-то сделано неправильно. Разберитесь с проблемой и повторите шаги выше, чтобы исправить ее. Эта проблема должна быть решена, прежде чем вы продолжите.
     +
     +Как только все будет хорошо, удалите тестовый файл:
     +<code>
     +rm -v a.out
     +</code>
     +</WRAP>
     +
     +
     +<WRAP left round info 100%>
     +**Примечание** \\  
     +Сборка пакетов в следующей главе послужит дополнительной проверкой правильности сборки временного кросс-тулчейна. Если какой-либо пакет, особенно Binutils или GCC, не удается собрать, это указывает на то, что что-то пошло не так с установленными ранее Binutils, GCC, или Glibc.
     +</WRAP>
     +
     +Подробная информация об этом пакете находится в [[software:linux_server:lfs:chapter08#8.5.3. Содержимое пакета Glibc|Раздел 8.5.3. «Содержимое пакета Glibc.»]]
     +
     +=====5.6. Libstdc++ из GCC-13.2.0=====
     +
     +|Libstdc++ — это стандартная библиотека C++. Она нужна для компиляции кода C++ (часть GCC написана на C++), когда мы собирали [[software:linux_server:lfs:chapter05#5.3. GCC-13.2.0 - Проход 1|GCC-Проход 1]], нам пришлось отложить её установку, потому что она зависит от библиотеки Glibc, которой еще не было в целевом каталоге.||
     +|Приблизительное время сборки:|0.2 SBU|
     +|Требуемое дисковое пространство:|1.1 GB|
     +
     +====5.6.1. Установка библиотеки Libstdc++====
     +
     +<WRAP left round info 100%>
     +**Примечание** \\  
     +Libstdc++ является частью исходников GCC. Сначала вы должны распаковать архив GCC и перейти в каталог gcc-13.2.0.
     +</WRAP>
     +
     +Создайте отдельный каталог сборки для libstdc++ и перейдите в него:
     +
     +<code>
     +mkdir -v build
     +cd       build
     +</code>
     +
     +Подготовьте libstdc++ к компиляции:
     +
     +<code>
     +../libstdc++-v3/configure           \
     +    --host=$LFS_TGT                 \
     +    --build=$(../config.guess)      \
     +    --prefix=/usr                   \
     +    --disable-multilib              \
     +    --disable-nls                   \
     +    --disable-libstdcxx-pch         \
     +    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/13.2.0
     +</code>
     +
     +===Значение параметров настройки:===
     +
     +  * **--host=...**
     +Указывает, что должен использоваться кросс-компилятор, который мы только что собрали, вместо того, который находится в /usr/bin.
     +
     +  * **--disable-libstdcxx-pch**
     +Этот аргумент предотвращает установку предварительно скомпилированных include-файлов, которые на данном этапе не нужны.
     +
     +  * **--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/13.2.0**
     +Указывает каталог установки для include-файлов. Поскольку libstdc++ является стандартной библиотекой C++ для LFS, этот каталог должен соответствовать местоположению, в котором компилятор C++ ($LFS_TGT-g++) будет искать стандартные включаемые файлы C++. При обычной сборке эта информация автоматически передается в Libstdc++ при выполнении configure из каталога верхнего уровня. В нашем случае эта информация должна быть указана явно. Компилятор C++ добавит путь sysroot $LFS (указанный при сборке GCC Проход 1) к пути поиска include-файлов, поэтому фактически он будет искать в $LFS/tools/$LFS_TGT/include/c++/13.2.0. Комбинация переменной DESTDIR (в приведенной ниже команде make install) и этого аргумента обеспечивает установку заголовочных файлов туда.
     +
     +Скомпилируйте Libstdc++, выполнив:
     +
     +<code>
     +make
     +</code>
     +
     +Установите библиотеку:
     +
     +<code>
     +make DESTDIR=$LFS install
     +</code>
     +
     +Удалите архивные файлы libtool, поскольку они потенциально опасны при кросс-компиляции:
     +
     +<code>
     +rm -v $LFS/usr/lib/lib{stdc++{,exp,fs},supc++}.la
     +</code>
     +
     +Подробная информация об этом пакете находится в [[software:linux_server:lfs:chapter08#8.28.2. Содержимое пакета GCC|Разделе 8.28.2. «Содержимое пакета GCC.»]]
    software/linux_server/lfs/chapter05.1719868298.txt.gz · Последнее изменение: 2024/07/02 00:11 — vladpolskiy