TAAFT
Free mode
100% free
Freemium
Free Trial
Deals

sunfishcode / c-ward

An implementation of libc written in Rust

320 16 Language: Rust Updated: 1mo ago

README

c-ward

An implementation of libc written in Rust

Github Actions CI Status zulip chat crates.io page crates.io page docs.rs docs docs.rs docs

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.

Runtime requirements

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).

Similar crates

Another libc implementation is relibc. tinyrlibc is a very minimal set of
libc functions for bare-metal embedded platforms.

Where's the #![no_builtins]?

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.

0 AIs selected
Clear selection
#
Name
Task