将Rust与C链接:未定义引用到'__aeabi'函数

6
我正在使用Rust在嵌入式设备上开发项目,试图编写可以从C中调用的Rust函数。我按照这篇教程的步骤,在不使用标准库的情况下编译项目: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中的代码。

有人知道这些错误的含义以及为什么链接器无法解决这些问题吗?谢谢!


1
看起来ABIs不匹配。我会检查它们是否兼容或需要包装器。这些符号似乎是memclrmemset的特殊变体)和memcpy的一些libgcc特殊版本。 - too honest for this site
作为一个新手,你能指导我在哪里查找这个吗? - Jambaman
1
这取决于操作系统、CPU和编译器设置。对于ARM,当前的PCS是AAPCS和ABI规范(免费下载),但gcc也允许使用其他一些规范。这适用于C和其他一些语言,但我不知道Rust的情况。 - too honest for this site
我正在处理这个问题。你解决了吗?我认为我们需要看到更多你的代码 - cargo.toml,makefile等等。我的理论是arm-none-eabi工具与thumbv7略有不同。这些例程有汇编版本(llvm内置),可以使用。 - Alister Lee
不,我没有解决它。代码在这里:https://github.com/halseth/embedded_rust 我使用的架构是ARM Cortex-M0,我相信是thumbv6m。 - Jambaman
此外,该代码仓库仅用于将Rust代码构建为目标文件。我最终得到了sha256.o,但当我尝试将其链接到我的C项目时出现了问题。不幸的是,我无法提供完整的Makefile以进行链接处理,因为其中包含一些专有代码,但如果我知道要查找什么,我可以提供片段。 - Jambaman
1个回答

7
问题在于,你的rustc(以及可能的cc)构建在LLVM上,它引用编译器内置函数或者有时候是内部函数,这些小的辅助程序假定已经为目标平台进行了优化。
通常它们随着编译器一起提供,因此你会看到很多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的compiler-rt(相当于libgcc.a)以供目标使用,并进行链接。

rustcmultirust增加对安装额外交叉编译目标的支持之前,你需要下载Rust源代码并尝试自己构建交叉编译器和库(包括compiler-rt)。

目前不支持arm-none-eabi作为目标平台,而且由于多种原因构建困难,其中之一是arm-none-eabi-gcc无法链接可执行文件,而Rust的jemalloc坚持要求链接。我的解决方法是从compiler-rt中收集源文件并逐个构建和链接。


我会将这个标记为被接受的答案,因为它解释了我遇到问题的原因。如果你想出一个完整的解决方案,请务必告诉我!谢谢。 - Jambaman
进展不太顺利,但我是一个 Rust/LLVM/OS 新手。 - Alister Lee
感谢 @Shepmaster 提供的高质量编辑和提高标准。 - Alister Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接