c-ward is an implementation of the libc ABI written in Rust.
It consists of two crates:
- c-scape, which is
no_std
, and - c-gull, which pulls in c-scape and additionally provides features
using
std
.
It is a goal of c-ward to be a C ABI layer on top of Rust-idomatic libraries, rather than to have significant implementation code of its own.
In theory c-ward could be extended to be ABI-compatible with different platforms, however currently it is only known to be ABI-compatible with *-unknown-linux-gnu* platforms.
The primary way this is used is through Mustang and Eyra, as their libc implementations. It can also be used as a regular library in "coexist-with-libc" mode.
Resolving users and DNS records requires the execution of getent
which
prints the entries on stdout. On a regular glibc system the getent
binary is provided by it and uses the NSS setup as usual.
Similar, a musl system also provides getent
(but does not use NSS).
Another libc implementation is relibc. tinyrlibc is a very minimal set of libc functions for bare-metal embedded platforms.
Normally, a libc implementation would use #[no_builtins]
to prevent compilers
from noticing the bodies of libc functions implement the semantics of libc
functions and replacing them with calls, which effectively makes them uselessly
recursive calls to themselves.
However, #[no_builtins]
is too pessimistic, because we don't need to disable
all pattern matching, just these specific cases.
So instead, c-scape and c-gull are just careful to avoid open-coding functions which are known to get pattern-matched into builtins.