17个不稳定版本 (8个破坏性更新)
0.10.0 | 2024年7月8日 |
---|---|
0.9.0 | 2023年12月5日 |
0.8.5 | 2023年11月20日 |
#107 in 无标准库
每月下载量187次
35KB
677 行
Origin Stdio是建立在std
之上的一个替代实现。
目前,它仅适用于Linux(x86-64、aarch64、riscv64、32位x86),需要Rust nightly版本,缺乏完整的std
兼容性,整体上属于实验性质。但它支持线程等功能。
快速入门
在Linux的空目录中,使用Rust nightly版本,运行以下命令
cargo init
cargo add origin_studio
cargo add compiler_builtins --features=mem
echo 'fn main() { println!("cargo:rustc-link-arg=-nostartfiles"); }' > build.rs
sed -i '1s/^/#![no_std]\n#![no_main]\norigin_studio::no_problem!();\n\n/' src/main.rs
cargo run --quiet
这将生成一个crate并打印"Hello, world!"。
是的,你可能会说,我已经可以用前一个和最后一个命令做到了。但这个版本使用origin
来启动和停止程序,并使用rustix
来进行打印。
除此之外,Origin Studio使用origin
来启动和停止线程,使用rustix-futex-sync
和lock_api
来对线程进行锁定,使用rustix-dlmalloc
来进行内存分配,并使用unwinding
来进行堆栈回溯,因此完全不使用libc。
这些命令做了什么?
cargo init
这将在一个新的Rust项目中创建一个包含"Hello, world!"程序的文件。
cargo add origin_studio
这将为origin_studio
添加依赖,这是一个crate。
cargo add compiler_builtins --features=mem
这将为compiler_builtins
添加依赖,这是一个提供rustc
和libcore
使用的库函数定义的crate。启用mem
功能将实现memcpy
、memset
、strlen
等。
echo 'fn main() { println!("cargo:rustc-link-arg=-nostartfiles"); }' > build.rs
这会创建一个 build.rs 文件,该文件将 -nostartfiles
传递给链接命令,这将禁用使用 libc 的 crt1.o
和其他启动对象文件。这允许 origin 定义名为 _start
的自己的符号,该符号作为程序入口点,并处理启动程序的整个过程。
sed -i '1s/^/#![no_std]\n#![no_main]\norigin_studio::no_problem!();\n\n/' src/main.rs
这将在 src/main.rs 的顶部插入三行。
#![no_std]
,这会禁用 Rust 标准库的实现,因为 Origin Studio 提供了自己的实现,使用 rustix 和 origin。#![no_main]
,这告诉 Rust 禁用其调用用户main
函数的代码,因为 Origin Studio 将处理这一点。origin_studio::no_problem!()
插入代码以设置 Rust 的 panic 处理器,并且可选地设置全局分配器(具有 "alloc" 功能)。
cargo run --quiet
这将运行程序,该程序将由 origin 启动,使用 Origin Studio 的 println!
宏打印 "Hello, world!",该宏使用 Origin Studio 的 std::io::stdout()
和 std::io::Write
以及 rustix-futex-sync
的 Mutex
进行锁定,并使用 rustix
进行实际的 I/O 系统调用,然后使用 origin 结束程序。
类似的包
其他 std 的替代实现包括 steed、tiny-std 和 veneer。
Mustang 和 Eyra 是使用 origin 构建 libc 实现的包,该实现可以滑入现有 std 构建之下,而不是拥有自己的 std 实现。
relibc 还包括程序和线程启动和关闭的 Rust 实现。
为什么?
目前,这是一个使用 origin
的演示。如果您想看到它成长为某个特定事物,或者对可能受到这种做法启发的项目感兴趣,请与我们联系!
依赖项
~7–16MB
~272K SLoC