С появлением программного обеспечения с открытым исходным кодом и принятием этих решений в создании сложных систем становится важной возможность разрабатывать приложения, которые могут безупречно работать на различных аппаратных платформах. Постоянно возникает потребность в разработке программного обеспечения для одной архитектуры, но с возможностью выполнения на других целевых архитектурах. Одним из распространенных методов достижения этой цели является кросскомпиляция приложения для целевой архитектуры.
Кросс-компиляция имеет важное значение в встроенных системах, где цель заключается в запуске приложений на специализированном оборудовании, таком как платы ARM и PowerPC. Эти системы имеют ограниченные ресурсы, и поэтому прямая компиляция не является вариантом. Таким образом, разработчики используют общую архитектуру x86 в качестве хоста и применяют цепочки инструментов, специфичные для целевого оборудования, создавая двоичные файлы, совместимые с целевым оборудованием.
В этой статье рассматривается один такой случай, в котором была выполнена кросс-компиляция пакета с открытым исходным кодом для PowerPC. Статья охватит детали инструментов и цепочек инструментов, которые были использованы, а также пошаговое руководство о том, как была достигнута кросс-компиляция для этой архитектуры.
Задача:
Учитывая целевую плату с архитектурой PowerPC, целью было добавить возможности маршрутизации L3 на эту плату. Для этой цели был рассмотрен популярный набор протоколов маршрутизации с открытым исходным кодом, FRRouting (FRR).
FRR – это набор протоколов, который позволяет любому устройству на Linux выполнять функции полноценного маршрутизатора. Пакет предназначен для amd64, arm64, armhf, и i386, но не для PowerPC. Это потребовало кросс-компиляцию FRR.
Build host | target host | |
---|---|---|
Архитектура ЦП |
x86_64 |
Powerpc(32-бит) |
Операционная система |
Ubuntu 18.4 |
QorIQ SDK |
CPU |
12 |
2 (e5500) |
RAM |
12ГБ |
1ГБ |
Таблица 1. Разница в сборке и целевой платформе
Путешествие кросс-компиляции
В кросс-компиляции есть две основные стадии:
Настройка среды сборки и предварительно скомпилированной инструментальной цепочки
1. Установите необходимые инструменты сборки в среде. К общим инструментам сборки относятся autoconf, make, cmake, build-essentials, pkg-config, libtool и др.
2. Настройте предварительно скомпилированную инструментальную цепочку, специфичную для целевой хост-среды. Производители процессоров/плат предоставляют свои собственные инструментальные цепочки, специфичные для архитектуры. Инструментальная цепочка, специфичная для целевой платы, была получена с веб-сайта производителя.
3. Инструментальная цепочка поставляется с файлом среды, который используется для установки переменных среды, таких как CC, GCC, PKG_CONFIG_PATH и др., которые необходимы для кросс-компиляции. Отредактируйте файл среды /opt/fsl-qoriq/2.0/environment-setup-ppce5500-fsl-linux
и обновите путь переменных в соответствии с путем к каталогу инструментальной цепочки.
export SDKTARGETSYSROOT=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux
export PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$PATH
export CCACHE_PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$CCACHE_PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
export CONFIG_SITE=/opt/fsl-qoriq/2.0/site-config-ppce5500-fsl-linux
export PYTHONHOME=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr unset command_not_found_handle
export CC="powerpc-fsl-linux-gcc -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CXX="powerpc-fsl-linux-g++ -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CPP="powerpc-fsl-linux-gcc -E -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export AS="powerpc-fsl-linux-as "
export LD="powerpc-fsl-linux-ld --sysroot=$SDKTARGETSYSROOT"
export GDB=powerpc-fsl-linux-gdb
export STRIP=powerpc-fsl-linux-strip
export RANLIB=powerpc-fsl-linux-ranlib
export OBJCOPY=powerpc-fsl-linux-objcopy
export OBJDUMP=powerpc-fsl-linux-objdump
export AR=powerpc-fsl-linux-ar
export NM=powerpc-fsl-linux-nm
export M4=m4
export TARGET_PREFIX=powerpc-fsl-linux-
export CONFIGURE_FLAGS="--target=powerpc-fsl-linux --host=powerpc-fsl-linux --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
export OECORE_DISTRO_VERSION="2.0"
export OECORE_SDK_VERSION="2.0"
export ARCH=powerpc
export CROSS_COMPILE=powerpc-fsl-linux-
Разрешение зависимостей в предварительно скомпилированной инструментальной цепи
У каждого программного обеспечения есть свой набор зависимостей (инструменты/библиотеки), которые необходимо разрешить перед кросскомпиляцией.
В зависимости от доступности пакетов этих инструментов/библиотек на целевой архитектуре, существует два варианта их разрешения. Либо установить их напрямую из доступных пакетов, либо также скомпилировать их из исходного кода.
Специфически для компиляции FRR библиотеки libpcre2, libyang, clippy, libelf и json-c необходимо собирать из исходного кода. Кроме них, пакеты библиотек protobuf и libcap были доступны для архитектуры PPC (PowerPC) и могут быть установлены напрямую в инструментальную цепь.
1. Установка библиотек из пакетов
Пакеты библиотек, доступные для целевой архитектуры, могут быть установлены в корневую систему инструментальной цепи двумя способами:
- Первый способ использует инструмент
dpkg-deb
для установки пакетов Debian напрямую, как указано ниже:Shell$ dpkg-deb -x <pkg_name>.deb <toolchain_directory_path>
#Пример с libcap:
$ wget http://launchpadlibrarian.net/222364908/libcap-dev_2.24-12_powerpc.deb
$ dpkg-deb -x libcap-dev_2.24-12_powerpc.deb /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/
Примечание:
- Скачайте все зависимые пакеты и установите их в порядке.
- Библиотечные пакеты могут устанавливаться в различную структуру каталогов. Скопируйте эти библиотечные файлы в правильные каталоги в соответствии с цепочкой инструментов.
- Во втором способе пакеты debian/rpm извлекаются и вручную помещаются в каталог toolchain, как указано ниже:
- Для извлечения debian-пакета используйте инструменты
ar
иtar
, как указано ниже:Обычный текст$ ar -x <package>.deb
$ tar -xJf data.tar.xz
Примечание: Этот метод полезен для систем без поддержки
dpkg-deb
. - Для извлечения rpm-пакета используйте инструмент
rpm2cpio
по следующей команде:Обычный текст$ rpm2cpio <package>.rpm | cpio -idmv
Пример извлечения пакета и размещения файлов с libcap:
# Извлечение .deb пакета
$ ar -x libcap-dev_2.24-12_powerpc.deb
</
2. Кросс-компиляция библиотек
Библиотечные пакеты недоступны для целевой архитектуры и компилируются из исходного кода. Перед началом компиляции загрузите файл среды, упакованный с инструментарием, чтобы установить все необходимые параметры, требуемые для кросс-компиляции.
$ source <env_file_path>
Следуйте инструкциям по компиляции, указанным в файле README библиотеки. Кроме того, установите следующие параметры в процессе сборки:
- Установите
--параметр хоста
при запуске сценария./configure
Оболочка$ ./configure --host=<целевой_хостовый_параметр>
# Пример:
$ ./configure --host=powerpc-fsl-linux
Примечание:
- <целевой_хостовый_параметр> – это система, для которой создается библиотека/инструмент. Его можно найти в файле среды инструментария. Это общий префикс, который находится в $CC, $LD и т. д.
- Будет два типа зависимых библиотек. Одна требуется только для процесса компиляции, а другая – для выполнения на целевом хосте. Установите
--параметр хоста
соответственно.
- При использовании “make install” для построения зависимых библиотек установите DESTDIR в каталог корневой файловой системы инструментария.
Shell
$ make DESTDIR=<путь_к_каталогу_инструментария> install
Пример:
$ make DESTDIR=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/ install
Заключение
Различия в архитектурах систем, библиотеках, зависимостях и инструментах делают кросс-компиляцию сложной техникой для выполнения. Чтобы облегчить сложности, эта статья раскрывает этапы кросс-компиляции. FRR и PowerPC были выбраны в качестве примеров для желаемого программного обеспечения и целевого оборудования соответственно. Однако шаги, рассмотренные в этой статье, предоставляют разумную стратегию для кросс-компиляции любого программного обеспечения на конкретном оборудовании. Настройки окружения, инструменты и зависимости будут варьироваться в зависимости от требований.
Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation