It seems variables marked with #[link_section] are not placed in the final binary, per this example:
lib.rs:
#![no_std]
#[used]
#[link_section = ".vector.reset"]
static RESET: Option<extern "C" fn() -> !> = None;
#[used]
#[link_section = ".vector.exceptions"]
static EXCEPTIONS: [Option<extern "C" fn()>; 14] = [
None, // NMI
None, // HardFault
None,
None,
None,
None,
None,
None,
None,
None, // PendSV
None, // SysTick
None,
None,
None,
];
bin.rs:
#![no_std]
#![no_main]
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
loop {}
}
linker.ld:
MEMORY {
rom : ORIGIN = 0x00000000, LENGTH = 128K
}
SECTIONS {
.vector : {
WORD(0x00000000)
KEEP(*(.vector.reset))
KEEP(*(.vector.exceptions))
} > rom
}
Provides the following image dump, where .vector is missing:
architecture: arm, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00000000
Program Header:
PHDR off 0x00000034 vaddr 0xfffff034 paddr 0xfffff034 align 2**2
filesz 0x00000060 memsz 0x00000060 flags r--
LOAD off 0x00000000 vaddr 0xfffff000 paddr 0xfffff000 align 2**12
filesz 0x00000094 memsz 0x00000094 flags r-x
STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**0
filesz 0x00000000 memsz 0x00000000 flags rw-
private flags = 5000200: [Version5 EABI] [soft-float ABI]
Sections:
Idx Name Size VMA LMA File off Algn
0 .debug_str 000004d1 00000000 00000000 00000094 2**0
CONTENTS, READONLY, DEBUGGING
1 .debug_abbrev 000000fd 00000000 00000000 00000565 2**0
CONTENTS, READONLY, DEBUGGING
2 .debug_info 00000611 00000000 00000000 00000662 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_macinfo 00000001 00000000 00000000 00000c73 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_pubnames 0000009a 00000000 00000000 00000c74 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_pubtypes 00000385 00000000 00000000 00000d0e 2**0
CONTENTS, READONLY, DEBUGGING
6 .ARM.attributes 00000032 00000000 00000000 00001093 2**0
CONTENTS, READONLY
7 .debug_frame 00000028 00000000 00000000 000010c8 2**2
CONTENTS, READONLY, DEBUGGING
8 .debug_line 0000004b 00000000 00000000 000010f0 2**0
CONTENTS, READONLY, DEBUGGING
9 .comment 00000012 00000000 00000000 0000113b 2**0
CONTENTS, READONLY
SYMBOL TABLE:
00000000 l df *ABS* 00000000 o0jzeh1sn11gu9v
The sections are there in the archive.
Note that this also doesn't work:
bin.rs:
#![no_std]
#![no_main]
#[link_section = ".vector.reset"]
pub use thumbv6m::RESET;
#[link_section = ".vector.exceptions"]
pub use thumbv6m::EXCEPTIONS;
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
loop {}
}
Am I missing something here? How else can I place data in a linker section from within a library?