我正在开发一个在嵌入式设备上使用Rust的项目,在这个项目中,我尝试用Rust编写可以从C调用的函数。我编译这个项目时没有标准库,大致遵循本教程:现在就嵌入锈病!
我的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的代码。
有没有人知道这些错误意味着什么,为什么链接器不能解决这些问题?谢谢!
发布于 2015-12-15 11:38:07
问题是,LLVM (您的rustc (可能还有您的cc)是在它的基础上构建的)引用编译器内置的或者有时是本质的,这是编译器假设的针对目标平台的小助手例程。
通常它们都是随编译器一起出现的,所以你会在网上看到很多评论,上面写着“为什么不链接到libgcc.a”,这似乎对裸金属项目毫无帮助,而且实际上行不通,因为LLVM调用的内部结构与gcc略有不同。
您可以为这些例程提供实现,一个真正的裸金属操作系统可能需要花费大约5分钟的时间来考虑它。你可以把它们写在汇编或锈蚀中:
// 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;
} 完成梦想之后,开始为目标编译compiler-rt (相当于libgcc.a),并将其链接起来。
在rustc和multirust增加对安装额外的交叉编译目标的支持之前,您必须下载Rust源代码,并尝试自己构建交叉编译器和libs (包括compiler-rt)。
目前,arm-none-eabi并不是一个受支持的目标,构建还很困难,原因有很多,包括arm-none-eabi-gcc不会链接一个可执行文件,这是Rust的jemalloc所坚持的。我的解决办法是从compiler-rt中获取源文件,并单独构建和链接它们。
https://stackoverflow.com/questions/31494087
复制相似问题