移除Rust标准库依赖

作者:

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

如下图:

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

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{};
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注