Cross-platform libraries for link-time initialization, finalization and collection in Rust.
The linktime project comprises three crates, and the top-level linktime
crate aggregates them all.
Pick-and-choose, or import the top-level crate to get all three.
Module initialization functions for Rust (like __attribute__((constructor)) in
C/C++).
Run code before main to initialize data, external resources, or other state.
[dependencies]
linktime = { version = "...", features = ["ctor"] } # note: already enabled by default
# or
ctor = "..."use linktime::ctor; // or ctor::ctor
use libc_print::*;
#[ctor(unsafe)]
fn foo() {
libc_println!("Life before main!");
}Module shutdown functions for Rust (like __attribute__((destructor))).
Run code after main to clean up resources, or perform other final operations.
[dependencies]
linktime = { version = "...", features = ["dtor"] } # note: already enabled by default
# or
dtor = "..."use linktime::dtor; // or dtor::dtor
use libc_print::*;
#[dtor(unsafe)]
fn foo() {
libc_println!("Life after main!");
}Typed and untyped link section support for Rust.
Collect related items from an entire linked binary into a single link section.
[dependencies]
linktime = { version = "...", features = ["link-section"] } # note: already enabled by default
# or
link-section = "..."use linktime::link_section::{section, in_section, TypedSection};
use linktime::ctor;
use libc_print::*;
#[section(typed)]
static FOO: TypedSection<fn()>;
#[in_section(FOO)]
fn foo() {
libc_println!("Hello, world!");
}
#[ctor(unsafe)]
fn print_numbers() {
for f in FOO {
f();
}
}A crate for defining zero-allocation,linker-managed scattered collections in Rust.
ScatteredIterable: A collection of items that are available only viaScatteredSlice: A collection of sized items that collected into a slice in an arbitrary order.ScatteredSortedSlice: A collection of items that are available via slice, in sorted order.ScatteredReferencedSlice: A collection of items collected into a slice (link order).ScatteredSortedReferencedSlice: A collection of sized items that are available both via sorted slice and via reference at the declaration site.ScatteredMap: A collection of key-value pairs that are available via slice, as well as indexed by key.
use scattered_collect::{gather, scatter, slice::ScatteredSlice};
#[gather]
static SLICE_PLUGINS: ScatteredSlice<&'static str>;
#[scatter(SLICE_PLUGINS)]
const _: &'static str = "json";
#[scatter(SLICE_PLUGINS)]
const _: &'static str = "yaml";
fn main() {
assert_eq!(SLICE_PLUGINS.len(), 2);
assert!(SLICE_PLUGINS.contains(&"json"));
}Contributions are welcome!
These projects are dual-licensed under the Apache License, Version 2.0 and the MIT License.