Ошибка __aeabi_unwind_cpp_pr0 при связывании для Arm на WSL

Добрый вечер всем,

Я пытаюсь скомпилировать простую программу в Ada для микроконтроллера на базе Arm. Я установил пакет gnat-5-arm-linux-gnueabi в подсистему Linux для Windows.

Теперь компиляция с arm-linux-gnueabi-gcc-5 -mcpu=cortex-m4 -mthumb program.adb работает нормально, однако компоновка с arm-linux-gnueabi-ld -T flash.ld -o program.elf program.o приводит к ошибке:

program.o:(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'

Я просмотрел существующие решения, однако ни одно из них не сработало для меня. Я попытался установить пакет gcc-arm-none-eabi и использовать его компоновщик (та же ошибка), а также использовать ld (не распознает цель руки).

Одна из моих теорий заключается в том, что я мог использовать неправильный пакет GNAT или двоичный файл либо для компиляции, либо для компоновки. Поэтому, если кто-то знает, где найти их описание, мне это тоже может помочь :-) (пакетов GNAT довольно много, но только 2 со словом «рука» в названии)

РЕДАКТИРОВАТЬ: есть файл libgcc_eh.a под /usr/lib/gcc-cross/arm-linux-gnueabi/5/, который содержит символ «раскрутить»; добавление этого файла к входным данным компоновщика, похоже, решает эту ошибку, но приводит к появлению нескольких новых «неопределенных ссылок»:

Incl/libgcc_eh.a(unwind-arm.o): In function 'get_eit_entry':
(.text+0x238): undefined reference to '__exidx_start'
Incl/libgcc_eh.a(unwind-arm.o): In function 'get_eit_entry':
(.text+0x23c): undefined reference to '__exidx_end'
Incl/libgcc_eh.a(unwind-arm.o): In function 'unwind_phase2':
(.text+0x334): undefined reference to 'abort'
Incl/libgcc_eh.a(unwind-arm.o): In function 'unwind_phase2_forced':
(.text+0x424): undefined reference to 'memcpy'
Incl/libgcc_eh.a(unwind-arm.o): In function 'unwind_phase2_forced':
(.text+0x478): undefined reference to 'memcpy'
Incl/libgcc_eh.a(unwind-arm.o): In function '__gnu_Unwind_Resume':
(.text+0x5b8): undefined reference to 'abort'
Incl/libgcc_eh.a(unwind-arm.o): In function '__gnu_Unwind_Resume':
(.text+0x5f4): undefined reference to 'abort'
Incl/libgcc_eh.a(pr-support.o): In function '_Unwind_GetTextRelBase':
(.text+0x4f0): undefined reference to 'abort'

person micmys    schedule 09.02.2018    source источник
comment
Нужно проверить, используете ли вы правильный стиль исключений — ищите прагмы или параметры компилятора для SJLJ по сравнению с ZCX (исключения Setjump/Longjump по сравнению с нулевой стоимостью), поскольку ваша среда выполнения может не поддерживать и то, и другое (и раскрутка предполагает, что задействован код обработки исключений). )   -  person user_1818839    schedule 10.02.2018
comment
Похоже, этот пакет использует ZCX, а для SJLJ есть другой: gnat-5-sjlj-arm-linux-gnueabi, так что, вероятно, это не проблема.   -  person micmys    schedule 10.02.2018
comment
Какой MCU на базе ARM? и нужно ли встраивать подсистему Linux, или подойдет набор инструментов Windows?   -  person Simon Wright    schedule 10.02.2018
comment
@BrianDrummond Я пытался это сделать, но какую бы комбинацию я ни использовал, всегда есть несколько неопределенных ссылок.   -  person micmys    schedule 10.02.2018
comment
@SimonWright STM32, но на данном этапе это не имеет значения, я думаю. Программа Ада — это просто пустой цикл без каких-либо инструкций, специфичных для MCU. Что касается набора инструментов Windows - я пробовал его на собственном компьютере с Linux с идентичным эффектом, так что это не проблема с WSL.   -  person micmys    schedule 10.02.2018
comment
Извините, это моя ошибка. Я добавил их к вопросу сейчас.   -  person micmys    schedule 10.02.2018
comment
Связано: включая ссылки на некоторые полезные ресурсы ARM... " title="требуется ли для реального времени ada базовая операционная система"> stackoverflow.com/questions/34721811/   -  person user_1818839    schedule 11.02.2018


Ответы (1)


Когда вы компилируете program.adb, результирующий объектный код будет содержать ссылки на систему времени выполнения (например, для поддержки исключений, текстового ввода-вывода).

Пакет gnat-5-arm-linux-gnueabi по умолчанию компилируется для RTS на базе Linux, отсюда и неопределенные ссылки.

Вероятно, вы могли бы обойтись этим пакетом, указав соответствующий RTS для вашей платы (--RTS=/where/ever) - если он у вас есть!

Я думаю, что для начала лучше всего загрузить один из наборов компиляторов с сайта AdaCore]1. Это приведет вас на страницу загрузки хост-версии, совместимой с вашей ОС; щелкните ссылку «Другие пакеты, платформы, версии и источники» в правом нижнем углу и выберите свою платформу: либо «ARM ELF (размещено в Linux)», либо «ARM ELF (размещено в Windows)».

В Linux есть файл README по установке: (а) вам, вероятно, потребуется установить от имени пользователя root, (б) соответствующие примеры находятся в <installation root>/share/examples/gnat-cross. Насколько я помню, пример led-flasher-stm32f4 на самом деле для STM32F429I, который имеет другое и меньшее количество назначений контактов для встроенных светодиодов! см. src/lights.ads.

Вы должны найти документацию в <installation root>/share/doc. См. gps для AdaCore IDE, gnat для различных компонентов, включая Справочное руководство по Ada (известное как "ARM"), gnat-cross для проблем кросс-компиляции.

person Simon Wright    schedule 10.02.2018
comment
Спасибо за это предложение! Я установил версию ARM ELF (размещенную на Windows) с веб-сайта Adacore. К сожалению, когда я пытаюсь запустить arm-eabi-gcc -mcpu=cortex-m4 -mthumb program.adb, я получаю сообщение об ошибке: fatal error, run-time library not installed correctly cannot locate file system.ads compilation abandoned - person micmys; 11.02.2018
comment
Хорошо, пример с огнями компилируется и записывается на плату. Поэтому я просто предполагаю, что ранее упомянутая команда неверна, но конфигурация работает иначе. Еще раз спасибо за вашу помощь :-) - person micmys; 11.02.2018
comment
ах, похоже, что вы программируете на «голом железе», или, по крайней мере, ваш неуказанный микроконтроллер на базе ARM работает где-то ниже уровня ОС Linux. Без полной Ada RTS у вас нет доступа к полной Ada, и это накладывает ограничения, например, на как вы можете обрабатывать исключения. Решения заключаются либо в ограничении использования Ada (это можно выразить с помощью прагм вроде No_Exception_Propagation, иногда встречающихся в system.ads), либо в расширении RTS. Вскоре вы найдете собственную работу Саймона на ARM RTS. (Добавление кода EH в соответствии с редактированием равносильно расширению RTS, но вы не хотите делать это специально) - person user_1818839; 11.02.2018
comment
Да, я пытался программировать на «голом железе». Я пытался следовать этому руководству: ссылка, где автор использует собственные инструменты, но упоминает что кросс-компиляцию можно использовать точно так же, только с другими командами; видимо не все так просто. - person micmys; 11.02.2018
comment
Если вы перейдете к разделу Кросс-компиляция Главы 2 Inspirel учебник вы увидите, что когда Мацей говорит gcc, он имеет в виду arm-eabi-gcc; то есть не инструменты хоста. Если только вы не на Пи. - person Simon Wright; 11.02.2018
comment
Ну, если он использует кросс-компиляцию, то я точно следовал его руководству, и я понятия не имею, почему он не столкнулся с теми же проблемами. - person micmys; 11.02.2018
comment
Хм. Я думаю, что он, должно быть, работал на Linux-машине на базе ARM, например. a Pi, поэтому компилятор увидел хост system.ads. Посмотрим, смогу ли я найти простой обходной путь и доложу ... о, попробуйте поместить system.ads в текущий каталог, package System is\nend System; (\n => новая строка, должна быть там эта новая строка!) - person Simon Wright; 11.02.2018
comment
Спасибо, это сработало! Кроме того, что помогло решить исходную проблему, так это добавление pragma Restrictions (No_Exception_Propagation); в system.ads. Так что я думаю, что моя проблема решена полностью (или, по крайней мере, так кажется). В любом случае спасибо вам обоим за помощь! - person micmys; 12.02.2018