【问题标题】:Linking Rust with C: undefined reference to '__aeabi' functions将 Rust 与 C 链接:未定义的对 '__aeabi' 函数的引用
【发布时间】: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。

标签: c gcc rust libc eabi


【解决方案1】:

问题在于构建您的rustc(可能还有您的cc)的LLVM,引用编译器builtins或有时intrinsics,它们很小编译器假定已针对目标平台优化的辅助例程。

通常它们与编译器一起提供,因此您会在 'Net 上看到很多 commentary 说“你为什么不链接到 libgcc.a”。这对于裸机项目似乎没有帮助,实际上也不起作用,因为 LLVM 调用的内置函数与 gcc 略有不同。

您可以为这些例程提供实现,真正的裸机操作系统可能应该花大约五分钟的时间来考虑它。你可以用汇编或 Rust 编写它们:

// Use this at your peril
#[no_mangle]
pub unsafe extern fn __aeabi_memclr4(s: *mut u8, n: usize) -> *mut u8 {
    let mut i = 0;
    while i < n {
        *s.offset(i as isize) = 0u8;
        i += 1;
    }
    return s;
} 

完成梦想后,您开始为您的目标编译 llvm's compiler-rt(相当于 libgcc.a)并链接它。

rustcmultirust 增加对installing extra targets for cross-compilation 的支持之前,您必须下载Rust 源并尝试自己构建交叉编译器和库(包括compiler-rt)。

目前arm-none-eabi 不是一个受支持的目标,并且由于一系列原因,包括arm-none-eabi-gcc 不会链接一个可执行文件,Rust 的 jemalloc 坚持认为构建是粗糙的。我的解决方法是从compiler-rt 获取源文件并单独构建和链接它们。

【讨论】:

  • 我会将其标记为已接受的答案,因为它解释了我遇到问题的原因。如果您想出完整的解决方案,请务必告诉我!谢谢。
  • 不太顺利,不过我是rust/llvm/os新手。
  • 感谢@Shepmaster 的一些高质量编辑,并提高了标准。
猜你喜欢
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多