Expand description
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.
§Quick start
In an empty directory, on Linux, with Rust nightly, run these commands:
cargo init
cargo add origin_studio
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.
§What are those commands doing?
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.
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’smain
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.
§Similar crates
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.
§Why?
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!
Modules§
- alloc
- Memory allocation APIs
- any
- Utilities for dynamic typing or type reflection.
- arch
- SIMD and vendor intrinsics module.
- array
- Utilities for the array primitive type.
- ascii
- Operations on ASCII strings and characters.
- borrow
- A module for working with borrowed data.
- boxed
- The
Box<T>
type for heap allocation. - cell
- Shareable mutable containers.
- char
- Utilities for the
char
primitive type. - clone
- The
Clone
trait for types that cannot be ‘implicitly copied’. - cmp
- Utilities for comparing and ordering values.
- collections
- Collection types.
- convert
- Traits for conversions between types.
- default
- The
Default
trait for types with a default value. - env
- Inspection and manipulation of the process’s environment.
- error
- Interfaces for working with Errors.
- f32
- Constants for the
f32
single-precision floating point type. - f64
- Constants for the
f64
double-precision floating point type. - ffi
- Utilities related to FFI bindings.
- fmt
- Utilities for formatting and printing
String
s. - fs
- Filesystem APIs.
- future
- Asynchronous basic functionality.
- hash
- Generic hashing support.
- hint
- Hints to compiler that affects how code should be emitted or optimized.
- i8
Deprecation planned - Redundant constants module for the
i8
primitive type. - i16
Deprecation planned - Redundant constants module for the
i16
primitive type. - i32
Deprecation planned - Redundant constants module for the
i32
primitive type. - i64
Deprecation planned - Redundant constants module for the
i64
primitive type. - i128
Deprecation planned - Redundant constants module for the
i128
primitive type. - io
- Traits, helpers, and type definitions for core I/O functionality.
- isize
Deprecation planned - Redundant constants module for the
isize
primitive type. - iter
- Composable external iteration.
- marker
- Primitive traits and types representing basic properties of types.
- mem
- Basic functions for dealing with memory.
- net
- Networking primitives for IP communication.
- num
- Numeric traits and functions for the built-in numeric types.
- ops
- Overloadable operators.
- option
- Optional values.
- panic
- Panic support in the standard library.
- pin
- Types that pin data to a location in memory.
- prelude
- The Rust Prelude
- primitive
- This module reexports the primitive types to allow usage that is not possibly shadowed by other declared types.
- ptr
- Manually manage memory through raw pointers.
- rc
- Single-threaded reference-counting pointers. ‘Rc’ stands for ‘Reference Counted’.
- result
- Error handling with the
Result
type. - slice
- Utilities for the slice primitive type.
- str
- Utilities for the
str
primitive type. - string
- A UTF-8–encoded, growable string.
- sync
- Useful synchronization primitives.
- task
- Types and Traits for working with asynchronous tasks.
- thread
- Native threads.
- time
- Temporal quantification.
- u8
Deprecation planned - Redundant constants module for the
u8
primitive type. - u16
Deprecation planned - Redundant constants module for the
u16
primitive type. - u32
Deprecation planned - Redundant constants module for the
u32
primitive type. - u64
Deprecation planned - Redundant constants module for the
u64
primitive type. - u128
Deprecation planned - Redundant constants module for the
u128
primitive type. - usize
Deprecation planned - Redundant constants module for the
usize
primitive type. - vec
- A contiguous growable array type with heap-allocated contents, written
Vec<T>
. - assert_
matches Experimental - Unstable module containing the unstable
assert_matches
macro. - async_
iter Experimental - Composable asynchronous iteration.
- autodiff
Experimental - Unstable module containing the unstable
autodiff
macro. - bstr
Experimental - The
ByteStr
type and trait implementations. - contracts
Experimental - Unstable module containing the unstable contracts lang items and attribute macros.
- f16
Experimental - Constants for the
f16
half-precision floating point type. - f128
Experimental - Constants for the
f128
quadruple-precision floating point type. - intrinsics
Experimental - Compiler intrinsics.
- panicking
Experimental - Panic support for core
- pat
Experimental - Helper module for exporting the
pattern_type
macro - random
Experimental - Random value generation.
- range
Experimental - Experimental replacement range types
- simd
Experimental - Portable SIMD module.
- ub_
checks Experimental - Provides the
assert_unsafe_precondition
macro as well as some utility functions that cover common preconditions. - unicode
Experimental - unsafe_
binder Experimental - Operators used to turn types into unsafe binders and back.
Macros§
- assert
- Asserts that a boolean expression is
true
at runtime. - assert_
eq - Asserts that two expressions are equal to each other (using
PartialEq
). - assert_
ne - Asserts that two expressions are not equal to each other (using
PartialEq
). - cfg
- Evaluates boolean combinations of configuration flags at compile-time.
- column
- Expands to the column number at which it was invoked.
- compile_
error - Causes compilation to fail with the given error message when encountered.
- concat
- Concatenates literals into a static string slice.
- debug_
assert - Asserts that a boolean expression is
true
at runtime. - debug_
assert_ eq - Asserts that two expressions are equal to each other.
- debug_
assert_ ne - Asserts that two expressions are not equal to each other.
- env
- Inspects an environment variable at compile time.
- eprint
- Prints to the standard error.
- eprintln
- Prints to the standard error< with a newline.
- file
- Expands to the file name in which it was invoked.
- format_
args - Constructs parameters for the other string-formatting macros.
- include
- Parses a file as an expression or an item according to the context.
- include_
bytes - Includes a file as a reference to a byte array.
- include_
str - Includes a UTF-8 encoded file as a string.
- line
- Expands to the line number on which it was invoked.
- matches
- Returns whether the given expression matches the provided pattern.
- module_
path - Expands to a string that represents the current module path.
- no_
problem - 🌟
- option_
env - Optionally inspects an environment variable at compile time.
- panic
- Panics the current thread.
- Prints to the standard output.
- println
- Prints to the standard output, with a newline.
- stringify
- Stringifies its arguments.
- todo
- Indicates unfinished code.
- try
Deprecated - Unwraps a result or propagates its error.
- unimplemented
- Indicates unimplemented code by panicking with a message of “not implemented”.
- unreachable
- Indicates unreachable code.
- vec
- Creates a
Vec
containing the arguments. - write
- Writes formatted data into a buffer.
- writeln
- Writes formatted data into a buffer, with a newline appended.
- assert_
unsafe_ precondition Experimental - Checks that the preconditions of an unsafe function are followed.
- cfg_
match Experimental - A macro for defining
#[cfg]
match-like statements. - concat_
bytes Experimental - Concatenates literals into a byte slice.
- concat_
idents Experimental - Concatenates identifiers into one identifier.
- const_
format_ args Experimental - Same as
format_args
, but can be used in some const contexts. - format_
args_ nl Experimental - Same as
format_args
, but adds a newline in the end. - log_
syntax Experimental - Prints passed tokens into the standard output.
- pattern_
type Experimental - Creates a pattern type.
- trace_
macros Experimental - Enables or disables tracing functionality used for debugging other macros.