The Linker Script
The more seasoned embedded engineers here are questioning where the linker
script is. Well the .cargo/config file tells you the name of the linker
script but not the location, it ends up being put inside of the build directory
and is built by the f3
crate. Thus it is in:
target/thumbv7em-none-eabihf/debug/build/f3-<some hash>/out
. The linker
script is actually being generated by a build.rs
file which is run by
cargo on compilation.
So lets take a look at the linker file we have been using:
MEMORY
{
CCRAM : ORIGIN = 0x10000000, LENGTH = 8K
FLASH : ORIGIN = 0x08000000, LENGTH = 256K
RAM : ORIGIN = 0x20000000, LENGTH = 40K
}
ENTRY(_reset)
SECTIONS
{
.text ORIGIN(FLASH) :
{
/* Vector table */
LONG(ORIGIN(RAM) + LENGTH(RAM));
LONG(_reset + 1);
KEEP(*(.rodata._EXCEPTIONS));
_eexceptions = .;
/* Entry point: reset handler */
_reset = .;
*(.text._reset);
*(.text.*);
*(.rodata.*);
} > FLASH
/DISCARD/ :
{
*(.ARM.exidx.*)
*(.bss.*)
*(.data.*)
}
}
/* HACK to make these symbols overrideable by _dependencies_ (they were
already overridable by the top crate), we declare them as undefined
(EXTERN) here. */
EXTERN(__aeabi_memclr4);
EXTERN(_default_exception_handler);
EXTERN(_init);
/* Exceptions */
PROVIDE(_nmi = _default_exception_handler);
PROVIDE(_hard_fault = _default_exception_handler);
PROVIDE(_memmanage_fault = _default_exception_handler);
PROVIDE(_bus_fault = _default_exception_handler);
PROVIDE(_usage_fault = _default_exception_handler);
PROVIDE(_svcall = _default_exception_handler);
PROVIDE(_pendsv = _default_exception_handler);
PROVIDE(_systick = _default_exception_handler);
ASSERT(_eexceptions - ORIGIN(FLASH) == 0x40, "exceptions not linked where expected");
It is pretty standard, and chanes depending on the options passed to f3 in the
Cargo.toml file. For example, if we enable interrupts
all of the interrupt
vectors will get _default_handlers
which can be overrided. This linker script
is actually rather useful; however one day you may need to edit it yourself,
we are not going to handle that right now though. For more information you
should look at the f3 repository.