Emboss

Crates.io Crates.io

A small macro to embed metadata as an ELF/Mach-O section in your final binary.

Pairs quite nicely with vergen.

Quickstart

Include emboss in your Cargo.toml:

```toml [package]

[dependencies] emboss = "0.2.0" ```

Import the macro and call it with the name of the environment variable you want to embed:

```rust use emboss::emboss;

emboss!(CARGOPKGVERSION); ```

Run a quick cargo build and then examine the resulting binary:

bash $ strings target/debug/kana | grep CARGO_PKG_VERSION CARGO_PKG_VERSION=0.1.0

You can either parse this yourself from the binary or use rsps to fetch it from a running process.

Note: if the environment variable isn't present, the macro invocation will fail. If this annoys you, please see this issue.

Usage with vergen

This crate has many convenience calls for use with vergen.

To get started, include both vergen and emboss in your Cargo.toml:

```toml [package]

build = "build.rs"

[build-dependencies] vergen = "5.1.5"

[dependencies] emboss = "0.2.0" ```

Set up your build.rs to utilize vergen:

```rust use vergen::{Config, vergen};

fn main() -> Result<(), ()> { let mut config = Config::default();

vergen(config).unwrap();

Ok(())

} ```

Finally, import and call emboss:

```rust use emboss::emboss;

// Includes every rustc related env var provided by vergen emboss!(group=rustc); ```

If all went well, following a build, you should see some vergen attributes in the final binary:

bash $ strings target/debug/kana | grep VERGEN VERGEN_RUSTC_CHANNEL=stable VERGEN_RUSTC_COMMIT_DATE=2021-05-09 VERGEN_RUSTC_COMMIT_HASH=9bc8c42bb2f19e745a63f3445f1ac248fb015e53 VERGEN_RUSTC_HOST_TRIPLE=x86_64-apple-darwin VERGEN_RUSTC_LLVM_VERSION=12.0 VERGEN_RUSTC_SEMVER=1.52.1

Config

```rust // Emboss an env variable by name emboss!(FOOENVVAR);

// Emboss an env variable into a custom section emboss!(BARENVVAR, "DATA,custom_data");

// Emboss a specific value into a custom section emboss!(BAZENVVAR, ".zu", "Can you feel the storm? It's coming.");

// Includes VERGEN_BUILD_* emboss!(group=build);

// Includes VERGEN_GIT_* emboss!(group=git);

// Includes VERGEN_RUSTC_* emboss!(group=rustc);

// Includes VERGEN_CARGO_* emboss!(group=cargo);

// Includes VERGEN_SYSINFO_* emboss!(group=sysinfo);

// Includes both the rustc and cargo groups emboss!(group=rust);

// Includes the following environment variables: // VERGENBUILDTIMESTAMP // VERGENBUILDSEMVER // VERGENRUSTCSEMVER // VERGENCARGOPROFILE // VERGENCARGOFEATURES // Which rsps can use to display detailed information about your binary when it runs emboss!(group=rsps);

// An alias for the above emboss!();

// You can also specify multiple groups at once // This will include both VERGEN_SYSINFO_* and VERGEN_GIT_* emboss!(groups=sysinfo,git); ```

Reading Embossed Data

We provide a simple helper function to retrieve embossed data from a given sequence of bytes.

Here is an example using the object crate:

```rust fn readbinarymetadata(file: &object::File) { // Pull the raw data from the metadata section of the binary // For this example, we'll assume that the following is returned: // VERGENRUSTCCHANNEL=stable\0VERGENRUSTCCOMMITDATE=2021-05-09\0 let section = file.sectionbyname(emboss::DEFAULTSECTION_NAME).expect("metadata should exist"); let data = section.data().expect("data should be available");

let metadata = emboss::extractmetadata(data.asbytes()).expect("should be able to parse metadata");

let value = metadata.get("VERGENRUSTCCHANNEL").expect("VERGENRUSTCCHANNEL should be present"); assert_eq!(value, "stable");

let value = metadata.get("VERGENRUSTCCOMMITDATE").expect("VERGENRUSTCCOMMITDATE should be present"); assert_eq!(value, "2021-05-09"); } ```

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.