Статьи

Кросс-компиляция ARM ASM на Mac для Raspberry Pi

Недавно я писал о своем опыте изучения некоторых сборок ARM и, в частности, о попытке разработать простой алгоритм сортировки. Первоначально я только использовал редакторы Atom и TextMate на своем Mac, а затем передал исходный текст в Pi для компиляции и запуска, но я понял, что это не приведет к сокращению работы над что-то немного больше, поэтому я начал смотреть на то, как Eclipse C ++ работает с кросс-компиляторами ( кросс-компиляция позволяет компилировать код для одного типа аппаратной архитектуры для запуска на другом)

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

Первая попытка — Компиляция в Eclipse C ++ на Mac

Пропустив несколько шагов, чтобы перейти к более интересным деталям, предполагая, что Eclipse для C ++ уже загружен и установлен вместе с набором инструментов GNU для ARM , вот что я получил при создании своего проекта впервые:


11:54:51 **** Build of configuration arm cross compile for project ASMCrossCompile ****
make all
Building file: ../test.S
Invoking: Cross GCC Assembler
/Applications/EclipseIDEs/gcc-arm-none-eabi-4_9-2015q2/bin/arm-none-eabi-as-o "test.o" "../test.S"
Finished building: ../test.S
Building target: ASMCrossCompile
Invoking: Cross GCC Linker
/Applications/EclipseIDEs/gcc-arm-none-eabi-4_9-2015q2/bin/arm-none-eabi-gcc-L/Applications/EclipseIDEs/gcc-arm-none-eabi-4_9-2015q2/arm-none-eabi/lib -o "ASMCrossCompile" ./test.o
/Applications/EclipseIDEs/gcc-arm-none-eabi-4_9-2015q2/arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
collect2: error: ld returned 1 exit status
make: *** [ASMCrossCompile] Error 1

Эта ошибка «неопределенная ссылка на« _exit »описана в этой публикации SO здесь:
http://stackoverflow.com/questions/19419782/exit-c-text0x18-undefined-reference-to-exit-when-using-arm- ни-EABI-НКУ

Эта проблема, по-видимому, напрямую связана с кросс-компиляцией на другой аппаратной архитектуре, и решение заключается в добавлении опции -specs = nosys.specs в конфигурацию загрузчика. Я добавил это в Eclipse в свойствах проекта, C / C ++ Build / Settings / Cross GCC Linker и добавил в шаблон командной строки параметров эксперта, и это устранило эту проблему.

Передача исполняемого файла пи

В Eclipse C ++, в настройках Run Configuration вы можете выбрать «New Connection» и настроить ssh-соединение с вашим Pi. Вам также необходимо установить полный путь на Pi для того, куда файл будет отброшен.

В этот момент я получаю эту ошибку: «Ошибка при загрузке: ошибка ввода или вывода файловой системы». Выполняя файл на самом Пи, я получаю ошибку Сег.

При поиске вокруг, общее предложение, кажется, запускает «файл» для исполняемого файла, чтобы проверить, что он был скомпилирован и связан с правильной архитектурой.

Для моего недавно кросс-файла компиляции я получаю это:


pi@raspberrypi~/asm $ file ASMCrossCompile
ASMCrossCompile: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped

И для исполняемого файла, работающего правильно на Pi, я получаю это:

pi@raspberrypi~/asm $</span><span class="s2"> file loopNums
loopNums: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x91189f47c9216e8d281238cba56b56042bcf8e6b, not stripped

Хорошо, ясно, что я близко, но еще не там.

Из других постов, подобных этому  (некоторые из ключевых скриншотов в этом, кажется, отсутствуют), и этот , кажется, гораздо проще и прямее использовать готовую к использованию компиляторную цепочку из проекта RaspberryPi, доступного здесь, на  github (и не только более общий набор инструментов для процессоров ARM, но не специально для Pi и / или Raspbian). Это скомпилировано для Linux, поэтому, следуя советам в предыдущих двух статьях, это была моя следующая попытка.

Вторая попытка: набор инструментов Eclipse C ++ плюс Raspberry Pi Tools… в Ubuntu… в VirtualBox… в Mac

Клонируйте проект Tools.git из приведенного выше URL-адреса проекта github.

Создание проекта C

Создайте новый проект C, выберите значения по умолчанию для этого снимка экрана:

Создать проект

 Далее в этом диалоговом окне — укажите, где вы клонировали источник инструментов Raspberry Pi:

  • Установите префикс компилятора: arm-linux-gnueabihf-Настроить путь цепочки инструментов
  • Установите путь к / rpi_tools_download_dir / arm-bcm2708 / gcc-linaro-arm-linux-gnueabihf-raspbian / bin

Чтобы построить проект, выберите Build and Build All.

Выполнено.

Вы должны увидеть запись Binaries в вашем древовидном представлении Project Explorer.

Чтобы развернуть код на Pi, мы можем настроить Run Configuration, выбрав опцию Remote Application снова, использовать ssh и указать его на Pi.

Теперь я все еще получаю ту же общую ошибку ввода / вывода, что и раньше, поэтому я перешел к Pi, чтобы взглянуть на новый файл, который там появился, и заметил, что он не исполняемый, поэтому на шаге «Удаленное выполнение» вам все равно нужно выполнить команду chmod + x.

Ошибка ввода / вывода

Создание файла для него показывает настройки, которые совпадают с настройками исполняемых файлов, скомпилированных и связанных с Pi, так что теперь мы выглядим хорошо:

pi@raspberrypi ~/asm $ file asm_test
asm_test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x9f6ace58f6cc2d036ea113e69dc40a5f7fc5521d, not stripped

Теперь мы куда-то добираемся!

Быстрый привет мир, вызывающий syscall 4 для записи в консоль:

.global main
main:
MOV R7, #4 @ Syscall 4 = write to screen
MOV R0, #1 @ 1=stdout: move 1 to R0
MOV R2, #13 @ length of string to R2
LDR R1, =string
SWI 0
BX lr
string:
.asciz "hello world!\n"

Добавление chmod, кажется, дает нам исполняемый файл на стороне Pi, но все равно вызывает ошибку ввода-вывода.

Однако! ssh’ing к Pi и выполнение недавно переданного файла:

pi@raspberrypi ~/asm $ ./asm_test
hello world!

Успех! Теперь я могу использовать Eclipse на своем Mac для разработки asm для Pi! (Хотя его нужно запускать в Ubuntu на VirtualBox на Mac, но я могу жить с этим