В сети есть достаточно много источников на тему сборки приложений под архитектуру ARM, но когда я впервые столкнулся с такой задачей, то набил не одну шишку. Этот топик будет про самые начала кросскомпиляции и различные подходы к этому вопросу.
Моё устройство принадлежит к архитектуре ARMv5TE и разработка велась на x86 машине с Ubuntu Linux.
Так как это введение, то собирать будем простую программу для высчитывания факториала числа.
Подход 1. Коммерческий.
Компанией CodeSourcery выпускается коммерческая интегрированная среду разработки Sourcery G++, основанная на инструментах GNU (gcc, gdb, binutils) и имеющая интерфейс на базе Eclipse. Пожалуй, это самый простой и быстрый способ создания приложений, так как при установке ставятся и все необходимые библиотеки, и сам кросскомпилятор. На официальном сайте кроме возможности покупки можно воспользоваться триальной версией на 30 дней. Благодаря близкому «родству» с Eclipse настройки интуитивно понятны и писать подробно нет смысла.
Для разовых задач подходит идеально, но есть и абсолютно бесплатные решения.
Подход 2. QEMU.
Широко известная программа эмуляции QEMU поддерживает в том числе и ARM платформу, чем грех не воспользоваться.
Для начала устанавливаем саму программу:
sudo apt-get install qemu-kvm-extras-static
Разработчики QEMU сделали отдельную команду для простоты установки окружения (в моём случае это debian lenny):
sudo build-arm-chroot lenny qemu
В результате у нас создастся каталог qemu с образом системы lenny под нужную нам архитектуру.
Не хватает сети и необходимых пакетов для компиляции. Отредактируем sources.list нашей qemu-машины:
sudo nano qemu/etc/apt/sources.list
И добавим туда
deb ftp.us.debian.org/debian lenny main contrib non-free
deb-src ftp.us.debian.org/debian lenny main contrib non-free
Обновляемся, устанавливаем необходимые пакеты и в самой QEMU собираем наш factorial.
Подход 3. Собираем crosstool.
Crosstool — это набор скриптов для сборки и проверки работы gcc и glibc для всех архитектур, поддерживаемых glibc. При сборке различных кросстулов (так или так ) у меня возникали проблемы с совместимостью различных компонентов. Так, например, gcc не дружил с binutils из-за разницы в версиях и приходилось чуть ли не методом тыка подбирать работающие связки. К счастью, и этот процесс уже был автоматизирован и сделан предельно простым. За что спасибо пользователю сайта linux.org.ru mskmsk1985 :
Написанный им скрипт собирает тулчейн для arm-linux-gnueabi- архитектуры из последних версий GNU инструментов. Собираются С и С++ кросс компиляторы, кросс-отладчик и отладочный сервер для целевой архитектуры. Подробнее можно прочитать тут .
Подход 4. Gentoo-way.
Как и писал, собиралось это всё на компьютере с Ubuntu, но стоит всё же сказать, что в Gentoo есть отдельная программа crossdev , которая занимается тем же самым и собирает бинарники для нужной архитектуры.
Подход 5. Ubuntu-way.
Мои долгие поиски наиболее простого способа кросскомпиляции шли весьма запутанно и, конечно же, я пропустил решение, которое было слишком очевидным и простым чтобы даже об этом думать. Но оказалось что да, кросскомпилятор можно поставить из репозиториев и одной командой:
sudo apt-get install libc6-dev-armel-cross gcc-arm-linux-gnueabi
Вместо заключения.
Способы кросскомпиляции не ограничиваются приведенными выше примерами. Существуют многостраничные описания, варианты создания необходимых инструментов 'from scratch', но если нужно быстро написать и запустить простенькое приложение на другой архитектуре, часто не хватает времени для полного изучения, да и количество нюансов и программных несовместимостей могут отбить любое желание заниматься этим.
Надеюсь, мой небольшой обзор поможет вам избежать моих ошибок и быстро получить работающий инструмент для создания приложение на ARM-архитектуре. Удачи!