#linux #origin #std #experimental #thread #built #nightly

nightly no-std origin-studio

基于origin构建的类似std的实现

17个不稳定版本 (8个破坏性更新)

0.10.0 2024年7月8日
0.9.0 2023年12月5日
0.8.5 2023年11月20日

#107 in 无标准库

Download history 27/week @ 2024-07-01 126/week @ 2024-07-08 35/week @ 2024-07-29

每月下载量187次

Apache-2.0…

35KB
677

Origin Studio

基于Origin构建的类似std的实现

Github Actions CI Status zulip chat crates.io page docs.rs docs

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-synclock_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添加依赖,这是一个提供rustclibcore使用的库函数定义的crate。启用mem功能将实现memcpymemsetstrlen等。

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-syncMutex 进行锁定,并使用 rustix 进行实际的 I/O 系统调用,然后使用 origin 结束程序。

类似的包

其他 std 的替代实现包括 steedtiny-stdveneer

MustangEyra 是使用 origin 构建 libc 实现的包,该实现可以滑入现有 std 构建之下,而不是拥有自己的 std 实现。

relibc 还包括程序和线程启动和关闭的 Rust 实现。

为什么?

目前,这是一个使用 origin 的演示。如果您想看到它成长为某个特定事物,或者对可能受到这种做法启发的项目感兴趣,请与我们联系!

依赖项

~7–16MB
~272K SLoC