移除Rust标准库依赖

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2021/10/12/remove-rust-std/



现代通用操作系统对于应用程序的支持很多,在硬件平台上操作系统做了管理,操作系统之上还有标准库对应用程序提供系统调用。然后如果只从跑起来的角度来说,只要有最上面和最下面的就行了。

如下图:

中间两层提供的都是抽象。而有些时候我们的应用程序需要运行在一个相对底层的情况下,我们就需要移除标准库的依赖,更进一步可能要减少对于部分操作系统的依赖。

nothing程序

如果编译一个空的rust程序,比如nothing.rs

fn main(){}

在Ubuntu下查看系统调用如下图

我这里的芯片是riscv的,所以第一步是新增.cargo/config文件

[build]
target = "riscv64gc-unknown-none-elf"

在代码头部取消标准库

这里编译会失败,因为println!也是std提供的,而core中没有。

移除后编译也是失败

panic_handler是致命错误处理函数,默认也是std提供,这里我们加一个空实现

由于我们的main函数在被调用前,其实有很多初始化工作被做了,现在移除了std也没有了。直接删除main方法,然后加上no_main配置就行了。现在编译可以通过。

查看产出物的信息,可以看到入口是0,这个产出物本质上是没有用处的。还需要补充上后面需要的内容。

这里需要加上_start函数

#[no_mangle]
extern "C" fn _start() {
    loop{};
}


本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2021/10/12/remove-rust-std/

发表评论