Crates.io | origin-studio |
lib.rs | origin-studio |
version | 0.10.0 |
source | src |
created_at | 2023-08-26 15:35:46.905698 |
updated_at | 2024-07-08 14:41:51.384707 |
description | An alternative `std`-like implementation built on origin |
homepage | |
repository | https://github.com/sunfishcode/origin-studio |
max_upload_size | |
id | 955588 |
size | 82,038 |
Origin Stdio is an alternative std
-like implementation built on origin
.
At this time, it only works on Linux (x86-64, aarch64, riscv64, 32-bit x86),
requires Rust nightly, lacks full std
compatibility, and is overall
experimental. But it supports threads and stuff.
In an empty directory, on Linux, with Rust nightly, run these commands:
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
This will produce a crate and print "Hello, world!".
Yes, you might say, I could have already done that, with just the first and
last commands. But this version uses origin
to start and stop the program,
and rustix
to do the printing.
And beyond that, Origin Studio uses origin
to start and stop threads,
rustix-futex-sync
and lock_api
to do locking for threads,
rustix-dlmalloc
to do memory allocation, and unwinding
to do stack
unwinding, so it doesn't use libc at all.
cargo init
This creates a new Rust project containing a "Hello, world!" program.
cargo add origin_studio
This adds a dependency on origin_studio
, which is this crate.
cargo add compiler_builtins --features=mem
This adds a dependency on compiler_builtins
, which is a crate that provides
definitions of library functions that rustc
and libcore
use. The mem
feature enables implementations of memcpy
, memset
, strlen
, and others.
echo 'fn main() { println!("cargo:rustc-link-arg=-nostartfiles"); }' > build.rs
This creates a build.rs file that arranges for -nostartfiles
to be passed
to the link command, which disables the use of libc's crt1.o
and other startup
object files. This allows origin to define its own symbol named _start
which
serves as the program entrypoint, and handle the entire process of starting the
program itself.
sed -i '1s/^/#![no_std]\n#![no_main]\norigin_studio::no_problem!();\n\n/' src/main.rs
This inserts three lines to the top of src/main.rs:
#![no_std]
, which disables the use of Rust's standard library
implementation, since Origin Studio provides its own implementation that
using rustix and origin.#![no_main]
, which tells Rust to disable its code that calls the user's
main
function, since Origin Studio will be handling that.origin_studio::no_problem!()
inserts code to set up a Rust panic handler,
and optionally a global allocator (with the "alloc" feature).cargo run --quiet
This runs the program, which will be started by origin, prints "Hello, world!"
using Origin Studio's println!
macro, which uses Origin Studio's
std::io::stdout()
and std::io::Write
and rustix-futex-sync
's Mutex
to
do the locking, and rustix
to do the actual I/O system call, and ends the
program, using origin.
Other alternative implementations of std include steed, tiny-std and veneer.
Mustang and Eyra are crates that use origin to build a libc implementation that can slide underneath existing std builds, rather than having their own std implementations.
relibc also includes a Rust implementation of program and thread startup and shutdown.
Right now, this is a demo of how to use origin
. If you're interested in
seeing this grow into something specific, or interested in seeing projects
which might be inspired by this, please reach out!