Гетерогенность вычислительных сред с использованием кросс-компиляции

С появлением программного обеспечения с открытым исходным кодом и принятием этих решений в создании сложных систем становится важной возможность разрабатывать приложения, которые могут безупречно работать на различных аппаратных платформах. Постоянно возникает потребность в разработке программного обеспечения для одной архитектуры, но с возможностью выполнения на других целевых архитектурах. Одним из распространенных методов достижения этой цели является кросскомпиляция приложения для целевой архитектуры. 

Кросс-компиляция имеет важное значение в встроенных системах, где цель заключается в запуске приложений на специализированном оборудовании, таком как платы 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 и обновите путь переменных в соответствии с путем к каталогу инструментальной цепочки. 

Shell

 

Разрешение зависимостей в предварительно скомпилированной инструментальной цепи

У каждого программного обеспечения есть свой набор зависимостей (инструменты/библиотеки), которые необходимо разрешить перед кросскомпиляцией.

В зависимости от доступности пакетов этих инструментов/библиотек на целевой архитектуре, существует два варианта их разрешения. Либо установить их напрямую из доступных пакетов, либо также скомпилировать их из исходного кода.

Специфически для компиляции FRR библиотеки libpcre2, libyang, clippy, libelf и json-c необходимо собирать из исходного кода. Кроме них, пакеты библиотек protobuf и libcap были доступны для архитектуры PPC (PowerPC) и могут быть установлены напрямую в инструментальную цепь.

1. Установка библиотек из пакетов

Пакеты библиотек, доступные для целевой архитектуры, могут быть установлены в корневую систему инструментальной цепи двумя способами:

  1. Первый способ использует инструмент dpkg-deb для установки пакетов Debian напрямую, как указано ниже:
    Shell

     

    Примечание:

    • Скачайте все зависимые пакеты и установите их в порядке.
    • Библиотечные пакеты могут устанавливаться в различную структуру каталогов. Скопируйте эти библиотечные файлы в правильные каталоги в соответствии с цепочкой инструментов.
  2. Во втором способе пакеты debian/rpm извлекаются и вручную помещаются в каталог toolchain, как указано ниже:
  3. Для извлечения debian-пакета используйте инструменты ar и tar, как указано ниже:
    Обычный текст

     

    Примечание: Этот метод полезен для систем без поддержки dpkg-deb.

  4. Для извлечения rpm-пакета используйте инструмент rpm2cpio по следующей команде:
    Обычный текст

     

  5. Пример извлечения пакета и размещения файлов с libcap:

    Оболочка

     

    </

2. Кросс-компиляция библиотек

Библиотечные пакеты недоступны для целевой архитектуры и компилируются из исходного кода. Перед началом компиляции загрузите файл среды, упакованный с инструментарием, чтобы установить все необходимые параметры, требуемые для кросс-компиляции.

Shell

 

Следуйте инструкциям по компиляции, указанным в файле README библиотеки. Кроме того, установите следующие параметры в процессе сборки:

  1. Установите --параметр хоста при запуске сценария ./configure
    Оболочка

    Примечание:

    • <целевой_хостовый_параметр> – это система, для которой создается библиотека/инструмент. Его можно найти в файле среды инструментария. Это общий префикс, который находится в $CC, $LD и т. д.
    • Будет два типа зависимых библиотек. Одна требуется только для процесса компиляции, а другая – для выполнения на целевом хосте. Установите --параметр хоста соответственно.
  2. При использовании “make install” для построения зависимых библиотек установите DESTDIR в каталог корневой файловой системы инструментария.
    Shell

     

Заключение

Различия в архитектурах систем, библиотеках, зависимостях и инструментах делают кросс-компиляцию сложной техникой для выполнения. Чтобы облегчить сложности, эта статья раскрывает этапы кросс-компиляции. FRR и PowerPC были выбраны в качестве примеров для желаемого программного обеспечения и целевого оборудования соответственно. Однако шаги, рассмотренные в этой статье, предоставляют разумную стратегию для кросс-компиляции любого программного обеспечения на конкретном оборудовании. Настройки окружения, инструменты и зависимости будут варьироваться в зависимости от требований.

Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation