Каталог товаров

Кросс-компиляция для Omega

Кросс-компиляция - это компиляция исполняемого файла, предназначенного для платформы, отличной от той, на которой выполняется компиляция. Например, вы можете использовать компьютер с архитектурой x86 для компиляции исполняемого файла для Omega с архитектурой MIPS.

LEDE build system лежит в основе кросс-компиляции; он будет собираться в набор инструментов, который мы затем будем использовать для кросс-компиляции нашего кода C/C ++ для Omega.

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

Основное преимущество кросс-компиляции по сравнению с компиляцией программы непосредственно на Omega состоит в двух моментах:

- ваша программа сможет использовать библиотеки, отличные от программных пакетов LEDE;

- на компьютере компиляция будет проходить быстрее чем на Omega.

В этой статье объясняется, как настроить LEDE build system, что необходимо сделать для кросс-компиляции программы, а затем будет рассмотрен пример кросс-компиляции.

Настройка LEDE build system

LEDE build system можно использовать для сборки инструментов кросс-компиляции, создания образов прошивки и создания пакетов ПО, которые можно установить с помощью opkg. Эта статья только о создании инструментария кросс-компиляции.

Примечание: Onion не несет ответственности за любой ущерб или проблемы, вызванные использованием прошивок или пакетов, которые были разработаны не Onion.

Для начала нужно настроить LEDE build system на компьютере, настроить ее для Omega, а затем собрать инструментарий (toolchain). Эта процедура успешно проведена на Ubuntu Linux, рекомендуем следовать этому примеру. Используйте виртуальную машину, если у вас нет установленной ОС.

Это руководство основано на инструкциях по установке LEDE build system, посмотрите, если что-то неясно.

Настройка системы

LEDE build system требует много пакетов, выполните следующую команду в Linux:

sudo apt-get install -y git wget subversion build-essential libncurses5-dev zlib1g-dev gawk flex quilt git-core unzip libssl-dev python-dev python-pip libxml-parser-perl

Это может занять некоторое время.

Загрузка LEDE build system

Используйте git для загрузки build system, настроенной Onion для Omega2:

git clone https://github.com/OnionIoT/source.git

Это займет некоторое время, но не так много, как предыдущий шаг.

Настройка build system

Теперь нужно настроить build system, чтобы она была для Omega2 и Omega2+.

Поскольку вы используете build system от Onion, эта часть уже выполнена, и вы можете перейти к компиляции. Эта инструкция на случай, если вы используете оригинальную LEDE build system.

Перейдите в каталог source и зайдите в меню:

cd source

make menuconfig

build system Omega

В появившемся меню нужно сделать следующее:

  • В Target System выберите MediaTek Ralink MIPS.
  • В Subtarget выберите MT7688 based boards.
  • В Target Profile выберите Multiple Devices
  • В главном меню появится новый пункт, Target Devices
  • В Target Devices выберите Onion Omega2 и Onion Omega2+.
  • Выйдите и сохраните вашу конфигурацию

Теперь LEDE build system настроена на создание инструментария, прошивок и пакетов, совместимых с Omega2 и Omega2+.

Компиляция

Осталось скомпилировать toolchain. Build system основана на make-файлах, команда make запустит процесс.

Если у вас процессор, который может обрабатывать несколько потоков, можно использовать команду:

make -j8

Где число 8 определяет количество одновременных компиляций.

В зависимости от вашей системы, компиляция займет некоторое времени и будет очень ресурсоемкой. На серверных системах компиляция займет около получаса, на настольных компьютерах или ноутбуках – может занять часы.

Кросс-компиляция

Теперь, когда появился toolchain, можно перейти к кросс-компиляции программ.

Концепции и Местоположения

Рассмотрим несколько важных идей и положений скомпилированной LEDE build system.

Toolchain:

  • Toolchain - это кросс-компилятор и стандартная библиотека, которые используются для компиляции кода для Omega.
    • Обратите внимание, что кросс-компилятор зависит от типа процессора.
  • Toolchain можно найти в каталоге staging_dir с именем: staging_dir/toolchain- _gcc-_/
    • В нашем случае: staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl/
  • Инструменты для компиляции можно найти в каталоге: staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl/bin/, в том числе:
    • mipsel-openwrt-linux-ar
    • mipsel-openwrt-linux-g++
    • mipsel-openwrt-linux-gcc
    • mipsel-openwrt-linux-gcc-nm
    • mipsel-openwrt-linux-gcc-ranlib
    • mipsel-openwrt-linux-gdb
    • mipsel-openwrt-linux-ld 
  • Каталог staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl/include/ содержит все header-файлы стандартной C-библиотеки
  • А каталог staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl/lib содержит динамические объекты стандартной С-библиотеки

Target:

  • Target содержит все, что нужно LEDE build system
  • Target можно найти в каталоге staging_dir с именем: staging_dir/target-_/
    • В нашем случае: staging_dir/target-mipsel_24kc_musl/
  • Header-файлы библиотек, добавленные в виде пакетов находятся в каталоге staging_dir/ target-mipsel_24kc_musl/usr/include/
    • Это важно, так как код будет использовать header-файлы из этого места
  • Динамические объекты для библиотек, добавленные в виде пакетов находятся в каталоге staging_dir/target-mipsel_24kc_musl/usr/lib/
    • Это важно, поскольку код, который использует эти библиотеки, должен быть связан с динамическими объектами во время компиляции.

Процесс кросс-компиляции

Процесс кросс-компиляции прост, нам просто нужно убедиться в следующем:

  • Используется версия gcc/g++ для кросс-компиляции
  • Используется версия линкера (linker) для кросс-компиляции
  • Компилятор имеет расширенный список путей (path) для поиска при вызове include, а именно директории:
    • Каталог header-файлов toolchain, staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl/include/
    • Каталог header-файлов target, staging_dir/target-mipsel_24kc_musl/usr/include/
  • Линкер имеет расширенный список путей (path) для поиска библиотек, включая следующие директории:
    • Каталог динамических объектов библиотеки toolchain, staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl/lib
    • Каталог динамических объектов библиотеки target, staging_dir/target-mipsel_24kc_musl/usr/lib/

Дополнения к пути поиска позволяют компилятору также проверять эти каталоги при поиске header-файлов, которые включены (#include) в программе. Аналогично, дополнения к пути поиска библиотеке позволяют компилятору/линкеру проверять эти каталоги при поиске динамических объектов.

Требования,указанные выше, могут быть достигнуты несколькими способами:

  1. Непосредственное использование кросс-компилятора и библиотек
  2. Использование make-файла, который делает все вышеперечисленное
  3. Использование универсального make-файла и скрипта для его вызова

См. руководство по кросс-компиляции с информацией о первых двух способах. См. пример ниже с реализацией третьего метода.

Пример кросс-компиляции

Этот пример покажет, как С-проект может быть кросс-скомпилирован для Omega с использованием универсального make-файла и скрипта для его вызова таким образом, чтобы он выводил кросс-скомпилированный бинарный исполняемый файл. Код примера доступен в репозитории Onion c-cross-compile-example на GitHub.

С-программа использует библиотеку libugpio для считывания и печати входного значения на указанном GPIO-выводе раз в секунду в течение 20 секунд. Как упоминалось ранее, эта программа не может быть скомпилирована на Omega, поскольку в файловую систему Omega включены только файлы заголовков стандартной C-библиотеки. Можно скопировать header-файлы в Omega, но кросс-компиляция - более масштабируемый вариант.

Посмотрев на make-файл в репозитории, вы заметите, что компилятор и все флаги являются переменными. Станет еще яснее, есть взглянуть на скрипт xCompile.sh. Он выполняет следующие действия:

  • Составляет пути к:
    • Toolchain Кросс-компилятора
    • Header-файлам библиотек
    • Динамическим объектам библиотек
  • Расширяет пути поиска библиотек и пути поиска include.
  • Вызывает make-файл, связывающий все вышеперечисленное

Для выполнения этого, пользователю необходимо запустить скрипт с аргументами, которые определят, где можно найти LEDE build system и с какими библиотеками необходимо связать:

sh -buildroot -lib

Если LEDE build system находится в /root/source, команда будет выглядеть следующим образом:

sh xCompile.sh -buildroot ~/source/ -lib ugpio

Получится кросс-скомпилированный исполняемый файл gpioRead.

root@b6b5a4128ee3:~/c-cross-compile-example# file gpioRead

gpioRead: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld-musl-mipsel-sf.so.1, not stripped

Только что была кросс-скомпилирована программа для Omega! Перенесите ее в Omega, используя chmod + x gpioRead, чтобы дать необходимые права, и запустите: ./gpioRead.

Контакты

г. Москва, Пятницкое ш. д. 18, пав. 566

zakaz@compacttool.ru

8-495-752-55-22

Информация представленная на данном информационном ресурсе преследует исключительно рекламные цели и не является договором-офертой !

© Все права защищены 2021г https://compacttool.ru