link_section_example/
example.rs1#![cfg_attr(linktime_used_linker, feature(used_with_arg))]
3
4use link_section::{in_section, section};
5
6#[section]
8pub static LINK_SECTION: link_section::Section;
9
10#[in_section(LINK_SECTION)]
12pub fn link_section_function() {
13 println!("link_section_function");
14}
15
16#[section]
18pub static TYPED_LINK_SECTION: link_section::TypedSection<u32>;
19
20#[in_section(TYPED_LINK_SECTION)]
22pub static LINKED_U32: u32 = 1;
23
24#[in_section(TYPED_LINK_SECTION)]
26pub static LINKED_U32_2: u32 = 2;
27
28#[section(aux = TYPED_LINK_SECTION)]
30pub static AUX_LINK_SECTION: link_section::TypedSection<u32>;
31
32#[in_section(AUX_LINK_SECTION)]
34pub static AUX_LINKED_U32: u32 = 3;
35
36#[section]
38pub static FN_ARRAY: link_section::TypedSection<fn()>;
39
40#[in_section(FN_ARRAY)]
42pub fn linked_function() {
43 eprintln!("linked_function");
44}
45
46#[in_section(FN_ARRAY)]
48pub fn linked_function_2() {
49 eprintln!("linked_function_2");
50}
51
52#[in_section(FN_ARRAY)]
54pub static OTHER_FN: fn() = link_section_function;
55
56#[section]
58pub static DEBUGGABLES: link_section::TypedSection<&'static (dyn ::core::fmt::Debug + Sync)>;
59
60#[in_section(DEBUGGABLES)]
62pub static DEBUGGABLE: &'static (dyn ::core::fmt::Debug + Sync) = &1;
63
64#[in_section(DEBUGGABLES)]
66pub static DEBUGGABLE_2: &'static (dyn ::core::fmt::Debug + Sync) = &2;
67
68#[in_section(DEBUGGABLES)]
70pub static DEBUGGABLE_FUNCTION: fn() = {
71 fn debuggable_function() {
72 eprintln!("debuggable_function");
73 }
74 &(debuggable_function as fn())
75};
76
77pub fn main() {
79 eprintln!("LINK_SECTION: {:?}", LINK_SECTION);
80 link_section_function();
81 eprintln!("TYPED_LINK_SECTION: {:?}", TYPED_LINK_SECTION);
82 assert!(TYPED_LINK_SECTION.offset_of(&LINKED_U32).is_some());
83 assert!(TYPED_LINK_SECTION.offset_of(&LINKED_U32_2).is_some());
84 eprintln!("AUX_LINK_SECTION: {:?}", AUX_LINK_SECTION);
85 assert!(AUX_LINK_SECTION.len() == 1);
86 let random_u32 = 1234567890;
87 assert!(TYPED_LINK_SECTION.offset_of(&random_u32).is_none());
88 eprintln!("CODE_SECTION: {:?}", FN_ARRAY);
89 eprintln!("{:?}", FN_ARRAY.as_slice());
90 for f in FN_ARRAY {
91 eprintln!("f: {:?}", f);
92 f();
93 assert!(FN_ARRAY.offset_of(f).is_some());
94 }
95 eprintln!("DEBUGGABLES: {:?}", DEBUGGABLES.as_slice());
96}