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.
Quick start
Check out this hello world example.
In detail
Eyra needs three things. First, a cargo.toml dependency:
[]
= { = "<current-version>", = "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:
extern crate libc;
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:
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.
Optional logging
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:
[]
= { = "<current-version>", = "eyra", = ["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
Background
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.