首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Rust与C链接:未定义的对“__aeabi”函数的引用

将Rust与C链接:未定义的对“__aeabi”函数的引用
EN

Stack Overflow用户
提问于 2015-07-18 18:13:34
回答 1查看 4.4K关注 0票数 5

我正在开发一个在嵌入式设备上使用Rust的项目,在这个项目中,我尝试用Rust编写可以从C调用的函数。我编译这个项目时没有标准库,大致遵循本教程:现在就嵌入锈病!

我的Rust代码可以很好地编译成.o文件,但是当我试图使用arm-none-eabi-ld将C和Rust对象文件链接到一起时,我遇到了麻烦。我得到了几个类似的错误:

代码语言:javascript
复制
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的代码。

有没有人知道这些错误意味着什么,为什么链接器不能解决这些问题?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-15 11:38:07

问题是,LLVM (您的rustc (可能还有您的cc)是在它的基础上构建的)引用编译器内置的或者有时是本质的,这是编译器假设的针对目标平台的小助手例程。

通常它们都是随编译器一起出现的,所以你会在网上看到很多评论,上面写着“为什么不链接到libgcc.a”,这似乎对裸金属项目毫无帮助,而且实际上行不通,因为LLVM调用的内部结构与gcc略有不同。

您可以为这些例程提供实现,一个真正的裸金属操作系统可能需要花费大约5分钟的时间来考虑它。你可以把它们写在汇编或锈蚀中:

代码语言:javascript
复制
// 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),并将其链接起来。

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

目前,arm-none-eabi并不是一个受支持的目标,构建还很困难,原因有很多,包括arm-none-eabi-gcc不会链接一个可执行文件,这是Rust的jemalloc所坚持的。我的解决办法是从compiler-rt中获取源文件,并单独构建和链接它们。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31494087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档