47次发布

新增 0.3.28 2024年8月11日
0.3.27 2024年6月5日
0.3.26 2024年5月6日
0.3.25 2024年3月7日
0.1.1 2019年1月27日

#19 in #illumos

Download history 41021/week @ 2024-04-27 45522/week @ 2024-05-04 51542/week @ 2024-05-11 55959/week @ 2024-05-18 45018/week @ 2024-05-25 52480/week @ 2024-06-01 53757/week @ 2024-06-08 50534/week @ 2024-06-15 50253/week @ 2024-06-22 49824/week @ 2024-06-29 61213/week @ 2024-07-06 38836/week @ 2024-07-13 52815/week @ 2024-07-20 55827/week @ 2024-07-27 44932/week @ 2024-08-03 39569/week @ 2024-08-10

199,603 每月下载量
283个crate中使用 (2 直接)

MIT/Apache

32KB
689

Linkme:安全的跨平台链接器恶作剧

github crates.io docs.rs build status

组件 Linux macOS Windows FreeBSD OpenBSD illumos 其他...
分布式切片 💚 💚 💚 💚 💚 💚

我们欢迎PR添加对未列出的任何平台的支持。

[dependencies]
linkme = "0.3"

支持rustc 1.62+


分布式切片

分布式切片是由链接器将静态元素聚集到二进制文件的连续部分中的集合。切片元素可以从最终二进制依赖图中的任何位置单独定义。

实现基于link_section属性和特定平台链接器的支持。它不涉及任何平台的生命周期前的main或其他任何运行时初始化。这是一个零成本的抽象,在整个编译和链接过程中运行。

声明

静态分布式切片通过在类型为[T]的静态项上写入#[distributed_slice]来声明,其中T是某种类型。

use linkme::distributed_slice;

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

元素

可以通过在具有括号中给定分布式切片路径的#[distributed_slice(...)]属性中注册切片元素到分布式切片。初始化器必须是const表达式。

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) {
    /* ... */
}

元素可以在声明分布式切片的同一crate中定义,或者在任何下游crate中。在最终二进制文件中链接的所有crate中的元素将在运行时观察到存在于切片中。

分布式切片在所有方面都表现得像 &'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();
}

编译器将要求静态元素类型与分布式切片的元素类型匹配。如果这两个类型不匹配,则程序将无法编译。

#[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`

函数元素

作为一种简写,对于包含函数指针的分布式切片的常见情况,分布式_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) {
    /* ... */
}

许可证

您可以选择根据Apache许可证,版本2.0MIT许可证进行许可。
除非您明确声明,否则您有意提交以包含在此crate中的任何贡献,根据Apache-2.0许可证定义,应按照上述方式双重许可,不附加任何其他条款或条件。

依赖关系

~250–700KB
~17K SLoC