aboutsummaryrefslogtreecommitdiff
path: root/linker/linker_script.ld
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2022-12-09 15:20:40 -0700
committerJosh Rahm <joshuarahm@gmail.com>2022-12-09 15:20:40 -0700
commitac25063e15d7aa645f7567b9bdb0726e5c332fd6 (patch)
tree1a18f6d80cbcc25ce50ebb23c3a81f2d802130e9 /linker/linker_script.ld
parent2aaf2180aa352c71c43efd548893fffe506397e5 (diff)
downloadstm32l4-ac25063e15d7aa645f7567b9bdb0726e5c332fd6.tar.gz
stm32l4-ac25063e15d7aa645f7567b9bdb0726e5c332fd6.tar.bz2
stm32l4-ac25063e15d7aa645f7567b9bdb0726e5c332fd6.zip
Refactor the linker script to make more sense.broken_linker
Specifically this moves the inits into the .text section. This also move the data and bss segments into sram2 to give the heap and stack more space to work with in sram1.
Diffstat (limited to 'linker/linker_script.ld')
-rw-r--r--linker/linker_script.ld83
1 files changed, 47 insertions, 36 deletions
diff --git a/linker/linker_script.ld b/linker/linker_script.ld
index ea6fc8a..8497768 100644
--- a/linker/linker_script.ld
+++ b/linker/linker_script.ld
@@ -8,66 +8,77 @@ MEMORY
SECTIONS
{
/* This is where the code goes. */
- WAT = ORIGIN(flash);
. = ORIGIN(flash);
- TEXT_START = .;
.text ALIGN(0x04) : {
+ . = ALIGN(0x04);
+ VECTORS_START = .;
*(.vectors); /* All .vector sections go here. */
- *(.text); /* All .text sections go here. */
- } >flash
- TEXT_STOP = .;
- . = ALIGN(0x04);
-
- .data : ALIGN(0x04) {
- /* Data segment as defined in the flash. */
- INIT_DATA_VALUES = LOADADDR(.data);
+ VECTORS_END = .;
- /* Data segment where it will be in memory. */
- . = ALIGN(0x04);
- DATA_SEGMENT_START = .;
- *(.data);
- . = ALIGN(0x1c);
- DATA_SEGMENT_STOP = .;
+ TEXT_START = .;
+ *(.text); /* All .text sections go here. */
+ TEXT_END = .;
- INIT_ROUTINES_FLASH_START =
- LOADADDR(.data) + (DATA_SEGMENT_STOP - DATA_SEGMENT_START);
+ /* Start the init sections. The inits sections are text sections which are
+ * executed in order during startup. */
INITS_START = .;
+ INIT_0_START = .;
*(.init0);
- INIT_0_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START);
+ INIT_0_END = .;
+ INIT_1_START = .;
*(.init1);
- INIT_1_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START);
+ INIT_1_END = .;
+ INIT_2_START = .;
*(.init2);
- INIT_2_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START);
+ INIT_2_END = .;
+ INIT_3_START = .;
*(.init3);
- INIT_3_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START);
+ INIT_3_END = .;
+ INIT_4_START = .;
*(.init4);
- INIT_4_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START);
+ INIT_4_END = .;
+ INIT_5_START = .;
*(.init5);
- INIT_5_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START);
+ INIT_5_END = .;
+ INIT_6_START = .;
*(.init6);
- INIT_6_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START);
+ INIT_6_END = .;
+ INIT_7_START = .;
*(.init7);
- INIT_7_END = ABSOLUTE(INIT_ROUTINES_FLASH_START) + (. - INITS_START);
+ INIT_7_END = .;
INITS_END = .;
- INIT_ROUTINES_FLASH_STOP =
- LOADADDR(.data) + (INITS_END - DATA_SEGMENT_START);
+ FLASH_STOP = .;
+ } >flash AT >flash
+
+ /* Data segment as defined in the flash. */
+ DATA_VALUES_IN_FLASH = LOADADDR(.data);
+
+ .data : ALIGN(0x04) {
+
+ /* Data segment where it will be in memory. */
+ . = ALIGN(0x04);
+ DATA_SEGMENT_START = .;
+ *(.data);
+ DATA_SEGMENT_STOP = .;
/* Align by 4 so we can optimize the copier to use uint32's. */
. = ALIGN(0x04);
*(.noinit);
- } >sram1 AT>flash
+ } >sram2 AT>flash
- . = ALIGN(0x04);
- BSS_START = .;
- .bss : {
+ .bss : ALIGN(0x04){
+ . = ALIGN(0x04);
+ BSS_START = .;
*(.bss);
. = ALIGN(0x04);
- } > sram1
- BSS_END = .;
+ BSS_END = .;
+ } > sram2
- HEAP_START = .;
- HEAP_STOP = ORIGIN(sram1) + LENGTH(sram1);
+ .heap : ALIGN(0x04) {
+ HEAP_START = .;
+ HEAP_STOP = ABSOLUTE(ORIGIN(sram1) + LENGTH(sram1));
+ } > sram1
}