MCPcopy Index your code
hub / github.com/dtolnay/linkme

github.com/dtolnay/linkme @0.3.36

Chat with this repo
repository ↗ · DeepWiki ↗ · release 0.3.36 ↗ · + Follow
72 symbols 95 edges 33 files 4 documented · 6%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Linkme: safe cross-platform linker shenanigans

github crates.io docs.rs build status

Component Linux macOS Windows FreeBSD OpenBSD illumos Other...
Distributed slice 💚 💚 💚 💚 💚 💚

We welcome PRs adding support for any platforms not listed here.

[dependencies]
linkme = "0.3"

Distributed slice

A distributed slice is a collection of static elements that are gathered into a contiguous section of the binary by the linker. Slice elements may be defined individually from anywhere in the dependency graph of the final binary.

The implementation is based on link_section attributes and platform-specific linker support. It does not involve life-before-main or any other runtime initialization on any platform. This is a zero-cost safe abstraction that operates entirely during compilation and linking.

Declaration

A static distributed slice is declared by writing #[distributed_slice] on a static item whose type is [T] for some type T.

use linkme::distributed_slice;

#[distributed_slice]
pub static BENCHMARKS: [fn(&mut Bencher)];

Elements

Slice elements may be registered into a distributed slice by a #[distributed_slice(...)] attribute in which the path to the distributed slice is given in the parentheses. The initializer is required to be a const expression.

use linkme::distributed_slice;
use other_crate::BENCHMARKS;

#[distributed_slice(BENCHMARKS)]
static BENCH_DESERIALIZE: fn(&mut Bencher) = bench_deserialize;

fn bench_deserialize(b: &mut Bencher) {
    /* ... */
}

Elements may be defined in the same crate that declares the distributed slice, or in any downstream crate. Elements across all crates linked into the final binary will be observed to be present in the slice at runtime.

The distributed slice behaves in all ways like &'static [T].

fn main() {
    // Iterate the elements.
    for bench in BENCHMARKS {
        /* ... */
    }

    // Index into the elements.
    let first = BENCHMARKS[0];

    // Slice the elements.
    let except_first = &BENCHMARKS[1..];

    // Invoke methods on the underlying slice.
    let len = BENCHMARKS.len();
}

The compiler will require that the static element type matches with the element type of the distributed slice. If the two do not match, the program will not compile:

#[distributed_slice(BENCHMARKS)]
static BENCH_WTF: usize = 999;
error[E0308]: mismatched types
  --> src/distributed_slice.rs:65:19
   |
17 | static BENCH_WTF: usize = 999;
   |                   ^^^^^ expected fn pointer, found `usize`
   |
   = note: expected fn pointer `fn(&mut other_crate::Bencher)`
                    found type `usize`

Function elements

As a shorthand for the common case of distributed slices containing function pointers, the distributed_slice attribute may be applied directly to a function definition to place a pointer to that function into a distributed slice.

use linkme::distributed_slice;

#[distributed_slice]
pub static BENCHMARKS: [fn(&mut Bencher)];

// Equivalent to:
//
//    #[distributed_slice(BENCHMARKS)]
//    static _: fn(&mut Bencher) = bench_deserialize;
//
#[distributed_slice(BENCHMARKS)]
fn bench_deserialize(b: &mut Bencher) {
    /* ... */
}

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

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

Extension points exported contracts — how you extend this code

Slice (Interface)
(no doc) [1 implementers]
src/private.rs

Core symbols most depended-on inside this repo

section
called by 5
impl/src/linker.rs
section_start
called by 5
impl/src/linker.rs
section_stop
called by 5
impl/src/linker.rs
static_slice
called by 3
src/distributed_slice.rs
into_iter
called by 3
src/distributed_slice.rs
linkme_path
called by 3
impl/src/attr.rs
expand
called by 3
impl/src/element.rs
populate_static_lifetimes
called by 2
impl/src/ty.rs

Shape

Function 45
Method 13
Class 11
Enum 2
Interface 1

Languages

Rust100%

Modules by API surface

src/distributed_slice.rs9 symbols
tests/distributed_slice.rs7 symbols
tests/fn_element.rs4 symbols
impl/src/hash.rs4 symbols
impl/src/element.rs4 symbols
tests/win_status_illegal_instruction.rs3 symbols
tests/ui/mismatched_types.rs3 symbols
tests/ui/generic_fn.rs3 symbols
tests/example.rs3 symbols
tests/custom_linkme_path.rs3 symbols
impl/src/linker.rs3 symbols
impl/src/lib.rs3 symbols

For agents

$ claude mcp add linkme \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page