【发布时间】:2015-07-18 18:13:34
【问题描述】:
我正在开发一个在嵌入式设备上使用 Rust 的项目,我正在尝试用 Rust 编写可以从 C 调用的函数。我在没有标准库的情况下编译项目,或多或少遵循本教程: Embedded Rust Right Now!
我的 Rust 代码可以很好地编译为 .o 文件,但是在尝试使用 arm-none-eabi-ld 将 C 和 Rust 目标文件链接在一起时遇到了麻烦。我收到了几个类似于这些的错误:
rustfunc.o: In function `func':
rustfunc.0.rs:(.text.hash+0x18): undefined reference to `__aeabi_memclr8'
...
/rust/src/libcore/slice.rs:1446: undefined reference to `__aeabi_memcpy'
/rust/src/libcore/fmt/num.rs:196: undefined reference to `__aeabi_memclr4'
最让我困惑的是,即使我只是将目标文件链接在一起,错误也引用了我的 Rust 代码和来自 libcore 的代码。
是否有人知道这些错误的含义以及链接器为何无法解决这些问题?谢谢!
【问题讨论】:
-
在 ABI 中看起来不匹配。我会检查它们是否兼容或需要包装器。这些符号似乎是
memclr(这是memset的特殊变体)和memcpy的一些 libgcc 特殊版本 -
作为一个新手,你能指出我寻找检查这个的方向吗?
-
这取决于操作系统和 CPU 以及编译器设置。对于 ARM,当前的 PCS 是 AAPCS 和 ABI 规范(免费下载),但 gcc 也允许其他一些。这适用于 C 和其他一些语言,但不知道 Rust。
-
我现在正在处理这个问题。你解决了吗?我认为我们需要更多地了解您的代码——cargo.toml、makefile 等。我的理论是 arm-none-eabi 工具的工作方式与 thumbv7 略有不同。有这些例程的 asm 版本(llvm 的内置函数)。
-
不,没有解决。代码在这里:github.com/halseth/embedded_rust我使用的架构是ARM Cortex-M0,我相信是thumbv6m。