【问题标题】:Error "__aeabi_unwind_cpp_pr0" while linking for Arm on WSL在 WSL 上链接 Arm 时出现错误“__aeabi_unwind_cpp_pr0”
【发布时间】:2018-02-09 22:18:37
【问题描述】:

大家晚上好,

我正在尝试在 Ada 中为基于 Arm 的微控制器编译一个简单的程序。 我在 Windows 的 Linux 子系统上安装了 gnat-5-arm-linux-gnueabi 包。

现在,使用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(不识别arm 目标)。

我的一个理论是我可能在编译或链接时使用了错误的 GNAT 包或二进制文件。因此,如果有人知道在哪里可以找到这些描述,它也可能对我有帮助:-)(有很多 GNAT 包,但只有 2 个名称中带有“arm”)

编辑:/usr/lib/gcc-cross/arm-linux-gnueabi/5/ 下有一个文件libgcc_eh.a,其中包含符号“unwind”;将此文件添加到链接器输入似乎可以解决此错误,但会出现一些新的“未定义引用”:

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'

【问题讨论】:

  • 要检查的一件事是您是否使用了正确的异常样式 - 寻找 SJLJ 与 ZCX(Setjump/Longjump 与零成本异常)的编译指示或编译器选项,因为您的运行时可能不支持两者(并且“展开”表示涉及异常处理代码)
  • 这个包好像用的是ZCX,SJLJ有不同的:gnat-5-sjlj-arm-linux-gnueabi,所以这可能不是问题
  • 哪个基于 ARM 的 MCU?并且,您是否需要在 Linux 子系统中构建,或者 Windows 工具集可以吗?
  • @BrianDrummond 我尝试这样做,但无论我使用什么组合,总会有多个未定义的引用
  • @SimonWright STM32,但在这个阶段我猜应该没关系。 Ada 程序只是一个空循环,没有任何 MCU 特定的指令。至于 Windows 工具集 - 我已经在本地 Linux 计算机上尝试过,效果相同,所以 WSL 没有问题

标签: linux gcc ada windows-subsystem-for-linux gnat


【解决方案1】:

当您编译 program.adb 时,生成的目标代码将包含对运行时系统的引用(例如,异常支持、文本 i/o)。

gnat-5-arm-linux-gnueabi 包默认编译为基于 Linux 的 RTS,因此未定义引用。

您可以通过为您的电路板指定适当的 RTS (--RTS=/where/ever) 来使用此软件包 - 如果您有的话!

我认为开始时最好的选择是从 AdaCore 下载其中一个编译器套件]1。这会将您带到与您的操作系统兼容的主机版本的下载页面;单击右下角的“更多包、平台、版本和源”链接,然后选择您的平台:“ARM ELF(托管在 linux)”或“ARM ELF(托管在 Windows)”。

在 Linux 上,有一个安装 README:(a) 您可能需要以 root 身份安装,(b) 相关示例位于 <installation root>/share/examples/gnat-cross。我记得,led-flasher-stm32f4 示例实际上是针对 STM32F429I 的,它具有不同且更少的板载 LED 引脚分配!见src/lights.ads

您应该在<installation root>/share/doc 中找到文档。请参阅 gps 了解 AdaCore IDE,gnat 了解各种组件,包括 Ada 参考手册(混淆地称为“ARM”),gnat-cross 了解交叉编译问题。

【讨论】:

  • 感谢您的建议!我从 Adacore 的网站安装了“ARM ELF(托管在 Windows 上)”版本。不幸的是,当我尝试运行 arm-eabi-gcc -mcpu=cortex-m4 -mthumb program.adb 时,出现错误:fatal error, run-time library not installed correctly cannot locate file system.ads compilation abandoned
  • 好的,灯光示例编译并闪烁到板上。所以我将假设前面提到的命令不正确,但配置工作正常。再次感谢您的帮助:-)
  • 啊,听起来您是裸机编程,或者至少,您未指定的“基于 ARM 的微控制器”在 Linux 操作系统级别以下的某个地方工作。如果没有完整的 Ada RTS,您将无法访问完整的 Ada,这会限制例如如何处理异常。解决方案是限制您的 Ada 使用(这可以用诸如“No_Exception_Propagation”之类的编译指示来表示,有时在 system.ads 中可以找到)或扩展 RTS。您很快就会发现 Simon 自己的 ARM RTS 作品。 (按编辑添加 EH 代码无异于扩展 RTS,但您不想这样做)
  • 是的,我正在尝试进行裸机编程。我尝试按照这个教程:link,作者使用原生工具,但提到交叉编译可以以相同的方式使用,只是使用不同的命令;显然没那么简单。
  • 如果您进入Chapter 2 of the Inspirel tutorial交叉编译 部分,您会看到当Maciej 说gcc 时,他的意思是arm-eabi-gcc;即不是主机工具。除非你在 Pi 上。
猜你喜欢
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多