Eyra is a package that supports building Rust programs implemented entirely in Rust. It's complete enough to run programs like ripgrep and uutils coreutils.
It uses [Origin] for program and thread startup and shutdown, and [c-gull] for ABI-compatible libc functions.
Check out [this hello world example].
Eyra needs three things. First, a cargo.toml dependency:
toml
[dependencies]
libc = { version = "<current-version>", package = "eyra" }
This uses the trick of calling the library libc
while actually using
eyra
. This trick isn't necessary, but it sometimes means we can skip
the next step.
The next step is to mention libc
somewhere. If there are no other
mentions of libc
, adding an extern crate
is sufficient:
```rust extern crate libc;
fn main() { println!("Hello, world!"); } ```
This tells Rust that Eyra is actually used and the libraries should actually be linked in.
And finally, a build.rs file to add -nostartfiles
to the link flags to
disable the host startup code, so that Eyra can provide its own. build.rs:
rust
fn main() {
println!("cargo:rustc-link-arg=-nostartfiles");
}
With these three steps, this crate prints "Hello, world!". And under the
covers, it uses [Origin] to start and stop the program, [c-ward] to handle
libc calls from std
, and [rustix] to do the printing, so it's completely
implemented in Rust.
Eyra has a log
feature to enable Rust log
tracing of program and thread
startup and shutdown, and an env_logger
feature to install env_logger
as the logger, which can be enabled in Cargo.toml:
toml
[dependencies]
libc = { version = "<current-version>", package = "eyra", features = ["log", "env_logger"] }
With this, and setting the RUST_LOG
environment variable to "trace", the
hello world program output like this:
[TRACE origin::program] Program started
[TRACE origin::thread] Main Thread[Pid(51383)] initialized
[TRACE origin::program] Calling `.init_array`-registered function `0x55e86306bb80(1, 0x7ffd0f76aad8, 0x7ffd0f76aae8)`
[TRACE origin::program] Calling `origin_main(1, 0x7ffd0f76aad8, 0x7ffd0f76aae8)`
Hello, world!
[TRACE origin::program] `origin_main` returned `0`
[TRACE origin::thread] Thread[51383] calling `at_thread_exit`-registered function
[TRACE origin::thread] Thread[51383] calling `at_thread_exit`-registered function
[TRACE origin::program] Program exiting
Eyra is similar to [Mustang] and uses the same underlying code, but instead
of using a custom target and -Z build-std, Eyra just needs users to add
-nostartfiles
to their link line, such as via build.rs in the example.
Like Mustang, Eyra currently runs on Rust Nightly on Linux on x86-64, x86, aarch64, and riscv64. It aims to support all Linux versions [supported by Rust], though at this time it's only tested on relatively recent versions.