software:linux_server:lfs:chapter05
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
software:linux_server:lfs:chapter05 [2024/07/02 11:56] – [5.5.1. Установка пакета Glibc] vladpolskiy | software:linux_server:lfs:chapter05 [Дата неизвестна] (текущий) – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ======5. Заключительный этап подготовки====== | ||
- | Содержание | ||
- | * [[software: | ||
- | * [[software: | ||
- | * [[software: | ||
- | * [[software: | ||
- | * [[software: | ||
- | * [[software: | ||
- | =====5.1. Введение===== | ||
- | В этой главе дано описание, | ||
- | |||
- | Программы, | ||
- | |||
- | =====5.2. Binutils-2.42 - Проход 1===== | ||
- | |||
- | |Пакет Binutils содержит компоновщик, | ||
- | |Приблизительное время сборки: | ||
- | |Требуемое дисковое пространство: | ||
- | |||
- | <WRAP left round info 100%> | ||
- | **Примечание** \\ | ||
- | Вернитесь назад и перечитайте примечания в разделе Общие инструкции по компиляции. Понимание информации, | ||
- | </ | ||
- | |||
- | Очень важно, чтобы Binutils был скомпилированным первым, | ||
- | |||
- | В документации пакета Binutils рекомендуется выполнять сборку в отдельном каталоге, | ||
- | |||
- | < | ||
- | mkdir -v build | ||
- | cd build | ||
- | </ | ||
- | |||
- | <WRAP left round info 100%> | ||
- | **Примечание** \\ | ||
- | Для того, чтобы значения SBU, перечисленные в остальной части книги, были вам полезны, | ||
- | </ | ||
- | |||
- | Теперь подготовьте Binutils к компиляции: | ||
- | |||
- | < | ||
- | ../ | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | </ | ||
- | |||
- | **Значение параметров настройки: | ||
- | |||
- | * **--prefix=$LFS/ | ||
- | Указывает сценарию configure подготовить к установке пакет Binutils в каталог $LFS/tools. | ||
- | |||
- | * **--with-sysroot=$LFS** | ||
- | Для кросс-компляции указывает системе сборки искать в $LFS библиотеки целевой системы, | ||
- | |||
- | * **--target=$LFS_TGT** | ||
- | Поскольку название машины в значении переменной LFS_TGT может отличаться от значения, | ||
- | |||
- | * **--disable-nls** | ||
- | Этот параметр отключает интернационализацию, | ||
- | |||
- | * **--enable-gprofng=no** | ||
- | Этот параметр отключает сборку gprofng, который не нужен для временного инструментария. | ||
- | |||
- | * **--disable-werror** | ||
- | Этот параметр предотвращает остановку сборки в случае появления предупреждений от компилятора хоста. | ||
- | |||
- | * **--enable-default-hash-style=gnu** | ||
- | По умолчанию компоновщик генерирует как хеш-таблицу в стиле GNU, так и классическую хеш-таблицу ELF для общих библиотек и динамически связанных исполняемых файлов. Хеш-таблицы необходимы только для динамического компоновщика, | ||
- | |||
- | Скомпилируйте пакет: | ||
- | |||
- | < | ||
- | make | ||
- | </ | ||
- | |||
- | Установите пакет: | ||
- | |||
- | < | ||
- | make install | ||
- | </ | ||
- | |||
- | Подробная информация об этом пакете находится в [[software: | ||
- | |||
- | =====5.3. GCC-13.2.0 - Проход 1===== | ||
- | |||
- | |Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.|| | ||
- | |Приблизительное время сборки: | ||
- | |Требуемое дисковое пространство: | ||
- | |||
- | <WRAP left round info 100%> | ||
- | **Примечание** \\ | ||
- | В этой главе часто возникают недоразумения, | ||
- | </ | ||
- | |||
- | < | ||
- | tar -xf ../ | ||
- | mv -v mpfr-4.2.1 mpfr | ||
- | tar -xf ../ | ||
- | mv -v gmp-6.3.0 gmp | ||
- | tar -xf ../ | ||
- | mv -v mpc-1.3.1 mpc | ||
- | </ | ||
- | |||
- | На хостах x86_64 измените имя каталога по умолчанию для 64-битных библиотек на «lib»: | ||
- | |||
- | < | ||
- | case $(uname -m) in | ||
- | x86_64) | ||
- | sed -e '/ | ||
- | -i.orig gcc/ | ||
- | ;; | ||
- | esac | ||
- | </ | ||
- | |||
- | В документации к GCC рекомендуется собирать GCC в отдельном каталоге: | ||
- | |||
- | < | ||
- | mkdir -v build | ||
- | cd build | ||
- | </ | ||
- | |||
- | Подготовьте GCC к компиляции: | ||
- | |||
- | < | ||
- | ../ | ||
- | --target=$LFS_TGT | ||
- | --prefix=$LFS/ | ||
- | --with-glibc-version=2.39 \ | ||
- | --with-sysroot=$LFS | ||
- | --with-newlib | ||
- | --without-headers | ||
- | --enable-default-pie | ||
- | --enable-default-ssp | ||
- | --disable-nls | ||
- | --disable-shared | ||
- | --disable-multilib | ||
- | --disable-threads | ||
- | --disable-libatomic | ||
- | --disable-libgomp | ||
- | --disable-libquadmath | ||
- | --disable-libssp | ||
- | --disable-libvtv | ||
- | --disable-libstdcxx | ||
- | --enable-languages=c, | ||
- | </ | ||
- | |||
- | **Значение параметров настройки: | ||
- | |||
- | * **--with-glibc-version=2.39** | ||
- | Этот параметр указывает версию Glibc, которая будет использоваться на целевой системе. Он не имеет отношения к libc хост-дистрибутива, | ||
- | |||
- | * **--with-newlib** | ||
- | Поскольку работающая библиотека C еще недоступна, | ||
- | |||
- | * **--without-headers** | ||
- | При создании полного кросс-компилятора GCC требует наличия стандартных заголовков, | ||
- | |||
- | * **--enable-default-pie и --enable-default-ssp** | ||
- | Эти параметры позволяют GCC по умолчанию компилировать программы с некоторые функциями усиливающими безопасность (более подробная информация о них приведена в примечание о PIE и SSP в Главе 8). На данном этапе это не является строго обязательным, | ||
- | |||
- | * **--disable-shared** | ||
- | Этот параметр заставляет GCC статически связывать свои внутренние библиотеки. Он необходим потому что общие библиотеки требуют Glibc, который еще не установлен в целевой системе. | ||
- | |||
- | * **--disable-multilib** | ||
- | На x86_64, LFS не поддерживает конфигурацию multilib. Этот аргумент никак не влияет на работу с архитектурой x86. | ||
- | |||
- | * **--disable-threads, | ||
- | Эти аргументы отключают поддержку расширений для работы с многопоточностью, | ||
- | |||
- | * **--enable-languages=c, | ||
- | Этот параметр обеспечивает сборку только компиляторов C и C++. Это единственные языки, которые нужны сейчас. | ||
- | |||
- | Скомпилируйте GCC, выполнив: | ||
- | |||
- | < | ||
- | make | ||
- | </ | ||
- | |||
- | Установите пакет: | ||
- | |||
- | < | ||
- | make install | ||
- | </ | ||
- | |||
- | Во время сборки GCC установил пару внутренних системных заголовочных файлов. Обычно один из файлов limits.h, включает соответствующие системные ограничения **limits.h**, | ||
- | |||
- | <WRAP left round info 100%> | ||
- | **Примечание** \\ | ||
- | В приведенной ниже команде показан пример подстановки вложенных команд, | ||
- | </ | ||
- | |||
- | < | ||
- | cd .. | ||
- | cat gcc/ | ||
- | `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/ | ||
- | </ | ||
- | |||
- | Подробная информация об этом пакете находится в [[software: | ||
- | |||
- | =====5.4. Заголовочные файлы Linux-6.7.4 API===== | ||
- | |||
- | |Заголовочные файлы Linux API (в linux-6.7.4.tar.xz) предоставляют API ядра для использования Glibc.|| | ||
- | |Приблизительное время сборки: | ||
- | |Требуемое дисковое пространство: | ||
- | |||
- | ====5.4.1. Установка заголовочных файлов==== | ||
- | |||
- | Ядро Linux должно предоставлять интерфейс прикладного программирования (API) для использования системной библиотекой C (Glibc в LFS). Это делается путем установки заголовочных файлов C, которые поставляются в архиве с исходным кодом ядра Linux. | ||
- | |||
- | Убедитесь, | ||
- | |||
- | < | ||
- | make mrproper | ||
- | </ | ||
- | |||
- | Теперь извлеките видимые пользователю заголовочные файлы ядра из исходного кода. Рекомендуемый способ make «headers_install» использовать нельзя, | ||
- | |||
- | < | ||
- | make headers | ||
- | find usr/include -type f ! -name ' | ||
- | cp -rv usr/include $LFS/usr | ||
- | </ | ||
- | |||
- | ====5.4.2. Содержимое заголовочных файлов Linux API==== | ||
- | |||
- | |**Установленные заголовочные файлы: | ||
- | |**Созданные каталоги: | ||
- | |||
- | ===Краткое описание=== | ||
- | |||
- | |/ | ||
- | |/ | ||
- | |/ | ||
- | |/ | ||
- | |/ | ||
- | |/ | ||
- | |/ | ||
- | |/ | ||
- | |/ | ||
- | |/ | ||
- | |/ | ||
- | |||
- | =====5.5. Glibc-2.39===== | ||
- | |||
- | |Пакет Glibc содержит основную библиотеку C. Эта библиотека предоставляет основные процедуры для выделения памяти, | ||
- | |Приблизительное время сборки: | ||
- | |Требуемое дисковое пространство: | ||
- | |||
- | ====5.5.1. Установка пакета Glibc==== | ||
- | |||
- | Во-первых, | ||
- | |||
- | < | ||
- | case $(uname -m) in | ||
- | i?86) ln -sfv ld-linux.so.2 $LFS/ | ||
- | ;; | ||
- | x86_64) ln -sfv ../ | ||
- | ln -sfv ../ | ||
- | ;; | ||
- | esac | ||
- | </ | ||
- | |||
- | <WRAP left round info 100%> | ||
- | **Примечание** \\ | ||
- | Приведенная выше команда верна. Команда ln имеет несколько вариантов синтаксиса, | ||
- | </ | ||
- | |||
- | Некоторые программы, | ||
- | |||
- | < | ||
- | patch -Np1 -i ../ | ||
- | </ | ||
- | |||
- | В документации к Glibc рекомендуется собирать Glibc в отдельном каталоге: | ||
- | |||
- | < | ||
- | mkdir -v build | ||
- | cd build | ||
- | </ | ||
- | |||
- | Убедитесь, | ||
- | |||
- | < | ||
- | echo " | ||
- | </ | ||
- | |||
- | Затем подготовьте Glibc к компиляции: | ||
- | |||
- | < | ||
- | ../ | ||
- | --prefix=/ | ||
- | --host=$LFS_TGT | ||
- | --build=$(../ | ||
- | --enable-kernel=4.19 | ||
- | --with-headers=$LFS/ | ||
- | --disable-nscd | ||
- | libc_cv_slibdir=/ | ||
- | </ | ||
- | |||
- | ===Значение параметров настройки: | ||
- | |||
- | * **--host=$LFS_TGT, | ||
- | Комбинация этих опций указывает на то, что система сборки Glibc настраивается на кросс-компиляцию с использованием кросс-компоновщика и кросс-компилятора в $LFS/tools. | ||
- | |||
- | * **--enable-kernel=4.19** | ||
- | Этот параметр позволяет Glibc выполнять компиляцию библиотеки с поддержкой ядра 4.19 и более поздних версий. Поддержка более старых ядер не включена. | ||
- | |||
- | * **--with-headers=$LFS/ | ||
- | Этот аргумент позволяет скомпилировать библиотеку с заголовочными файлами, | ||
- | |||
- | * **libc_cv_slibdir=/ | ||
- | Этот аргумент гарантирует, | ||
- | |||
- | * **--disable-nscd** | ||
- | Параметр отключает сборку демона кэша службы имен, который больше не используется. | ||
- | |||
- | На этом этапе может появиться следующее предупреждение: | ||
- | |||
- | < | ||
- | configure: WARNING: | ||
- | *** These auxiliary programs are missing or | ||
- | *** incompatible versions: msgfmt | ||
- | *** some features will be disabled. | ||
- | *** Check the INSTALL file for required versions. | ||
- | </ | ||
- | |||
- | Отсутствующая или несовместимая программа msgfmt, как правило, | ||
- | |||
- | <WRAP left round info 100%> | ||
- | **Примечание** \\ | ||
- | Поступали сообщения о том, что этот пакет может не компилироваться при «параллельной сборке». Если это произойдет, | ||
- | </ | ||
- | |||
- | Скомпилируйте пакет: | ||
- | |||
- | < | ||
- | make | ||
- | </ | ||
- | |||
- | Установите пакет: | ||
- | |||
- | <WRAP left round alert 100%> | ||
- | **Важно** \\ | ||
- | Если переменная LFS настроена неправильно, | ||
- | </ | ||
- | |||
- | < | ||
- | make DESTDIR=$LFS install | ||
- | </ | ||
- | |||
- | ===Значение опции make install:=== | ||
- | |||
- | * **DESTDIR=$LFS** | ||
- | Переменная make DESTDIR используется почти всеми пакетами для определения места установки пакета. Если она не задана, | ||
- | |||
- | Исправьте жестко запрограммированный путь к исполняемому загрузчику в ldd: | ||
- | |||
- | < | ||
- | sed '/ | ||
- | </ | ||
- | |||
- | <WRAP left round important 100%> | ||
- | **Внимание** \\ | ||
- | На этом этапе необходимо остановиться и убедиться, | ||
- | < | ||
- | echo 'int main(){}' | ||
- | readelf -l a.out | grep ld-linux | ||
- | </ | ||
- | Если все работает правильно, | ||
- | < | ||
- | [Requesting program interpreter: | ||
- | </ | ||
- | Обратите внимание, | ||
- | |||
- | Если выходные данные отображаются не так, как указано выше, или их вообще нет, значит, | ||
- | |||
- | Как только все будет хорошо, | ||
- | < | ||
- | rm -v a.out | ||
- | </ | ||
- | </ | ||
- | |||
- | |||
- | <WRAP left round info 100%> | ||
- | **Примечание** \\ | ||
- | Сборка пакетов в следующей главе послужит дополнительной проверкой правильности сборки временного кросс-тулчейна. Если какой-либо пакет, особенно Binutils или GCC, не удается собрать, | ||
- | </ | ||
- | |||
- | Подробная информация об этом пакете находится в [[software: | ||
- | |||
- | =====5.6. Libstdc++ из GCC-13.2.0===== | ||
- | |||
- | |Libstdc++ — это стандартная библиотека C++. Она нужна для компиляции кода C++ (часть GCC написана на C++), когда мы собирали [[software: | ||
- | |Приблизительное время сборки: | ||
- | |Требуемое дисковое пространство: | ||
- | |||
- | ====5.6.1. Установка библиотеки Libstdc++==== | ||
- | |||
- | <WRAP left round info 100%> | ||
- | **Примечание** \\ | ||
- | Libstdc++ является частью исходников GCC. Сначала вы должны распаковать архив GCC и перейти в каталог gcc-13.2.0. | ||
- | </ | ||
- | |||
- | Создайте отдельный каталог сборки для libstdc++ и перейдите в него: | ||
- | |||
- | < | ||
- | mkdir -v build | ||
- | cd build | ||
- | </ | ||
- | |||
- | Подготовьте libstdc++ к компиляции: | ||
- | |||
- | < | ||
- | ../ | ||
- | --host=$LFS_TGT | ||
- | --build=$(../ | ||
- | --prefix=/ | ||
- | --disable-multilib | ||
- | --disable-nls | ||
- | --disable-libstdcxx-pch | ||
- | --with-gxx-include-dir=/ | ||
- | </ | ||
- | |||
- | ===Значение параметров настройки: | ||
- | |||
- | * **--host=...** | ||
- | Указывает, | ||
- | |||
- | * **--disable-libstdcxx-pch** | ||
- | Этот аргумент предотвращает установку предварительно скомпилированных include-файлов, | ||
- | |||
- | * **--with-gxx-include-dir=/ | ||
- | Указывает каталог установки для include-файлов. Поскольку libstdc++ является стандартной библиотекой C++ для LFS, этот каталог должен соответствовать местоположению, | ||
- | |||
- | Скомпилируйте Libstdc++, выполнив: | ||
- | |||
- | < | ||
- | make | ||
- | </ | ||
- | |||
- | Установите библиотеку: | ||
- | |||
- | < | ||
- | make DESTDIR=$LFS install | ||
- | </ | ||
- | |||
- | Удалите архивные файлы libtool, поскольку они потенциально опасны при кросс-компиляции: | ||
- | |||
- | < | ||
- | rm -v $LFS/ | ||
- | </ | ||
- | |||
- | Подробная информация об этом пакете находится в [[software: |
software/linux_server/lfs/chapter05.1719910579.txt.gz · Последнее изменение: 2024/07/02 11:56 — vladpolskiy