fix(core): make linker scripts compatible with lld
What changed, and why it matters
This commit updates the hardware wallet's build configuration files (linker scripts) so they work with a newer linker tool called LLD. The changes replace a non-standard memory permission flag 'wal' with the standard 'rw' flag, and change how empty placeholder sections reserve stack/heap/header space. There is no direct evidence this fixes an exploitable security bug; it appears to be a build-tool compatibility cleanup. However, because linker scripts control where code and data live in memory, any mistake could theoretically affect memory protections, so the change warrants careful review.
Treat as a build-hygiene change rather than an active vulnerability. Verify that the generated binary layout, section addresses, and MPU/TrustZone region boundaries are identical to the pre-patch build for each target, because linker scripts define the memory map relied on by security-critical boot and isolation code. Pay special attention to the FLASH2 (rx) and BOARDCAPS (rw) permission changes to confirm they match the intended runtime access controls. No emergency deployment is indicated.
Security signals we found
MEMORY region permission flags changed from non-standard 'wal' to standard 'rw' across all RAM regions
FLASH2 region in stm32f4/firmware.ld changed from (r) to (rx), adding execute permission
BOARDCAPS region changed from (rx) to (rw) in stm32u58 and stm32u5g boardloader scripts
Stack/heap/header reservation syntax changed from absolute assignment '. = N;' to relative '. += N;'
No changelog requested by commit author, suggesting routine tooling change rather than security fix
Evidence from the diff
The patch modifies 16 ARM linker scripts across stm32f4, stm32u58, and stm32u5g targets. Two mechanical changes dominate: (1) MEMORY region attributes are changed from the GNU ld-specific ‘wal’ (write/allocate/load) to ‘rw’ (read/write), which LLD understands. (2) Section size assertions such as ‘. = 16K;’ are rewritten as ‘. += 16K;’ and ‘. = 1K;’ as ‘. += 1K;’, a syntax that behaves consistently under both GNU ld and LLD. FLASH2 in stm32f4/firmware.ld also gains execute permission (r -> rx). The commit message frames this as LLD compatibility only and explicitly requests ‘[no changelog]’.
Changed components
core/embed/sys/linker/stm32f4/boardloader.ldcore/embed/sys/linker/stm32f4/bootloader.ldcore/embed/sys/linker/stm32f4/firmware.ldcore/embed/sys/linker/stm32f4/kernel.ldcore/embed/sys/linker/stm32f4/prodtest.ldcore/embed/sys/linker/stm32u58/boardloader.ldcore/embed/sys/linker/stm32u58/bootloader.ldcore/embed/sys/linker/stm32u58/firmware.ldcore/embed/sys/linker/stm32u58/kernel.ldcore/embed/sys/linker/stm32u58/prodtest.ldcore/embed/sys/linker/stm32u5g/boardloader.ldcore/embed/sys/linker/stm32u5g/bootloader.ldcore/embed/sys/linker/stm32u5g/firmware.ldcore/embed/sys/linker/stm32u5g/kernel.ldcore/embed/sys/linker/stm32u5g/prodtest.ldcore/embed/sys/linker/stm32u5g/secmon.ldInspect captured patch +104 / −110
diff --git a/core/embed/sys/linker/stm32f4/boardloader.ld b/core/embed/sys/linker/stm32f4/boardloader.ld
index eb0ef692..a13b58d1 100644
--- a/core/embed/sys/linker/stm32f4/boardloader.ld
+++ b/core/embed/sys/linker/stm32f4/boardloader.ld
@@ -3,10 +3,10 @@ ENTRY(reset_handler)
MEMORY {
FLASH (rx) : ORIGIN = BOARDLOADER_START, LENGTH = BOARDLOADER_MAXSIZE - BOARDCAPS_MAXSIZE
BOARDCAPS (rx) : ORIGIN = BOARDCAPS_START, LENGTH = BOARDCAPS_MAXSIZE
- MAIN_STACK (wal) : ORIGIN = S_MAIN_STACK_START, LENGTH = S_MAIN_STACK_SIZE
- MAIN_RAM (wal) : ORIGIN = S_MAIN_RAM_START, LENGTH = S_MAIN_RAM_SIZE
- FB1 (wal) : ORIGIN = S_FB1_RAM_START, LENGTH = S_FB1_RAM_SIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ MAIN_STACK (rw) : ORIGIN = S_MAIN_STACK_START, LENGTH = S_MAIN_STACK_SIZE
+ MAIN_RAM (rw) : ORIGIN = S_MAIN_RAM_START, LENGTH = S_MAIN_RAM_SIZE
+ FB1 (rw) : ORIGIN = S_FB1_RAM_START, LENGTH = S_FB1_RAM_SIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -38,7 +38,7 @@ SECTIONS {
} >FLASH AT>FLASH
.stack : ALIGN(8) {
- . = 16K; /* this acts as a build time assertion that at least this much memory is available for stack use */
+ . += 16K; /* this acts as a build time assertion that at least this much memory is available for stack use */
} >MAIN_STACK
.data : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32f4/bootloader.ld b/core/embed/sys/linker/stm32f4/bootloader.ld
index 6003aeb1..16c325d2 100644
--- a/core/embed/sys/linker/stm32f4/bootloader.ld
+++ b/core/embed/sys/linker/stm32f4/bootloader.ld
@@ -2,11 +2,11 @@ ENTRY(reset_handler)
MEMORY {
FLASH (rx) : ORIGIN = BOOTLOADER_START, LENGTH = BOOTLOADER_MAXSIZE
- MAIN_STACK (wal) : ORIGIN = S_MAIN_STACK_START, LENGTH = S_MAIN_STACK_SIZE
- MAIN_RAM (wal) : ORIGIN = S_MAIN_RAM_START, LENGTH = S_MAIN_RAM_SIZE
- FB1 (wal) : ORIGIN = S_FB1_RAM_START, LENGTH = S_FB1_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ MAIN_STACK (rw) : ORIGIN = S_MAIN_STACK_START, LENGTH = S_MAIN_STACK_SIZE
+ MAIN_RAM (rw) : ORIGIN = S_MAIN_RAM_START, LENGTH = S_MAIN_RAM_SIZE
+ FB1 (rw) : ORIGIN = S_FB1_RAM_START, LENGTH = S_FB1_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -39,7 +39,7 @@ SECTIONS {
} >FLASH AT>FLASH
.stack : ALIGN(8) {
- . = 16K; /* Exactly 16K allocated for stack. Overflow causes MemManage fault (when using MPU). */
+ . += 16K; /* Exactly 16K allocated for stack. Overflow causes MemManage fault (when using MPU). */
} >MAIN_STACK
.data : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32f4/firmware.ld b/core/embed/sys/linker/stm32f4/firmware.ld
index 3e771101..3be3e6be 100644
--- a/core/embed/sys/linker/stm32f4/firmware.ld
+++ b/core/embed/sys/linker/stm32f4/firmware.ld
@@ -1,10 +1,10 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = FIRMWARE_P1_START, LENGTH = FIRMWARE_P1_MAXSIZE
- FLASH2 (r) : ORIGIN = FIRMWARE_P2_START, LENGTH = FIRMWARE_P2_MAXSIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
- AUX2_RAM (wal) : ORIGIN = AUX2_RAM_START, LENGTH = AUX2_RAM_SIZE
+ FLASH (rx) : ORIGIN = FIRMWARE_P1_START, LENGTH = FIRMWARE_P1_MAXSIZE
+ FLASH2 (rx) : ORIGIN = FIRMWARE_P2_START, LENGTH = FIRMWARE_P2_MAXSIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ AUX2_RAM (rw) : ORIGIN = AUX2_RAM_START, LENGTH = AUX2_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -55,7 +55,7 @@ SECTIONS {
} >FLASH AT>FLASH
.stack : ALIGN(8) {
- . = 16K; /* Exactly 16K allocated for stack. Overflow causes MemManage fault (when using MPU). */
+ . += 16K; /* Exactly 16K allocated for stack. Overflow causes MemManage fault (when using MPU). */
} >AUX1_RAM
.data : ALIGN(4) {
@@ -74,7 +74,7 @@ SECTIONS {
} >AUX1_RAM
.heap : ALIGN(4) {
- . = 37K; /* this acts as a build time assertion that at least this much memory is available for heap use */
+ . += 37K; /* this acts as a build time assertion that at least this much memory is available for heap use */
. = ABSOLUTE(ORIGIN(AUX1_RAM) + LENGTH(AUX1_RAM)); /* this explicitly sets the end of the heap */
} >AUX1_RAM
diff --git a/core/embed/sys/linker/stm32f4/kernel.ld b/core/embed/sys/linker/stm32f4/kernel.ld
index 10c3878d..993a8bf3 100644
--- a/core/embed/sys/linker/stm32f4/kernel.ld
+++ b/core/embed/sys/linker/stm32f4/kernel.ld
@@ -2,11 +2,11 @@ ENTRY(reset_handler)
MEMORY {
FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
- MAIN_STACK (wal): ORIGIN = K_MAIN_STACK_START, LENGTH = K_MAIN_STACK_SIZE
- FB1 (wal) : ORIGIN = K_FB1_RAM_START, LENGTH = K_FB1_RAM_SIZE
- MAIN_RAM (wal) : ORIGIN = K_MAIN_RAM_START, LENGTH = K_MAIN_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- DMABUF (wal) : ORIGIN = DMABUF_RAM_START, LENGTH = DMABUF_RAM_SIZE
+ MAIN_STACK (rw) : ORIGIN = K_MAIN_STACK_START, LENGTH = K_MAIN_STACK_SIZE
+ FB1 (rw) : ORIGIN = K_FB1_RAM_START, LENGTH = K_FB1_RAM_SIZE
+ MAIN_RAM (rw) : ORIGIN = K_MAIN_RAM_START, LENGTH = K_MAIN_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ DMABUF (rw) : ORIGIN = DMABUF_RAM_START, LENGTH = DMABUF_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -30,7 +30,7 @@ SECTIONS {
} >FLASH AT>FLASH
.header : ALIGN(4) {
- . = 1K;
+ . += 1K;
. = ALIGN(CODE_ALIGNMENT);
} >FLASH AT>FLASH
@@ -44,7 +44,7 @@ SECTIONS {
} >FLASH AT>FLASH
.stack : ALIGN(8) {
- . = 8K; /* Exactly 8k allocated for stack. Overflow causes MemManage fault (when using MPU). */
+ . += 8K; /* Exactly 8k allocated for stack. Overflow causes MemManage fault (when using MPU). */
} >MAIN_STACK
.data : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32f4/prodtest.ld b/core/embed/sys/linker/stm32f4/prodtest.ld
index b07f1375..f9ba5a7d 100644
--- a/core/embed/sys/linker/stm32f4/prodtest.ld
+++ b/core/embed/sys/linker/stm32f4/prodtest.ld
@@ -2,11 +2,11 @@ ENTRY(reset_handler)
MEMORY {
FLASH (rx) : ORIGIN = FIRMWARE_P1_START, LENGTH = FIRMWARE_P1_MAXSIZE
- MAIN_STACK (wal) : ORIGIN = S_MAIN_STACK_START, LENGTH = S_MAIN_STACK_SIZE
- MAIN_RAM (wal) : ORIGIN = S_MAIN_RAM_START, LENGTH = S_MAIN_RAM_SIZE
- FB1 (wal) : ORIGIN = S_FB1_RAM_START, LENGTH = S_FB1_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ MAIN_STACK (rw) : ORIGIN = S_MAIN_STACK_START, LENGTH = S_MAIN_STACK_SIZE
+ MAIN_RAM (rw) : ORIGIN = S_MAIN_RAM_START, LENGTH = S_MAIN_RAM_SIZE
+ FB1 (rw) : ORIGIN = S_FB1_RAM_START, LENGTH = S_FB1_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -58,7 +58,7 @@ SECTIONS {
}
.stack : ALIGN(8) {
- . = 16K; /* this acts as a build time assertion that at least this much memory is available for stack use */
+ . += 16K; /* this acts as a build time assertion that at least this much memory is available for stack use */
} >MAIN_STACK
.data : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32u58/boardloader.ld b/core/embed/sys/linker/stm32u58/boardloader.ld
index 13d62fe7..28ef79a2 100644
--- a/core/embed/sys/linker/stm32u58/boardloader.ld
+++ b/core/embed/sys/linker/stm32u58/boardloader.ld
@@ -1,14 +1,13 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = BOARDLOADER_START, LENGTH = BOARDLOADER_MAXSIZE
- BOARDCAPS (rx) : ORIGIN = BOARDCAPS_START, LENGTH = BOARDCAPS_MAXSIZE
-
- MAIN_RAM (wal) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- FB1_RAM (wal) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
- FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
+ FLASH (rx) : ORIGIN = BOARDLOADER_START, LENGTH = BOARDLOADER_MAXSIZE
+ BOARDCAPS (rw) : ORIGIN = BOARDCAPS_START, LENGTH = BOARDCAPS_MAXSIZE
+ MAIN_RAM (rw) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ FB1_RAM (rw) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
+ FB2_RAM (rw) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -59,7 +58,7 @@ SECTIONS {
} >AUX1_RAM
.stack : ALIGN(8) {
- . = 16K; /* Overflow causes UsageFault */
+ . += 16K; /* Overflow causes UsageFault */
} >MAIN_RAM
.fb1 : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32u58/bootloader.ld b/core/embed/sys/linker/stm32u58/bootloader.ld
index 4ff452de..5ea8a9e5 100644
--- a/core/embed/sys/linker/stm32u58/bootloader.ld
+++ b/core/embed/sys/linker/stm32u58/bootloader.ld
@@ -1,13 +1,12 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = BOOTLOADER_START, LENGTH = BOOTLOADER_MAXSIZE
-
- MAIN_RAM (wal) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- FB1_RAM (wal) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
- FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
+ FLASH (rx) : ORIGIN = BOOTLOADER_START, LENGTH = BOOTLOADER_MAXSIZE
+ MAIN_RAM (rw) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ FB1_RAM (rw) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
+ FB2_RAM (rw) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -61,7 +60,7 @@ SECTIONS {
} >AUX1_RAM
.stack : ALIGN(8) {
- . = 16K; /* Overflow causes UsageFault */
+ . += 16K; /* Overflow causes UsageFault */
} >MAIN_RAM
.fb1 : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32u58/firmware.ld b/core/embed/sys/linker/stm32u58/firmware.ld
index d0c6f3a5..2fd61dc6 100644
--- a/core/embed/sys/linker/stm32u58/firmware.ld
+++ b/core/embed/sys/linker/stm32u58/firmware.ld
@@ -1,9 +1,9 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
- AUX2_RAM (wal) : ORIGIN = AUX2_RAM_START, LENGTH = AUX2_RAM_SIZE
+ FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ AUX2_RAM (rw) : ORIGIN = AUX2_RAM_START, LENGTH = AUX2_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -70,7 +70,7 @@ SECTIONS {
} >AUX1_RAM
.stack : ALIGN(8) {
- . = 32K; /* Overflow causes UsageFault */
+ . += 32K; /* Overflow causes UsageFault */
} >AUX2_RAM
.buf : ALIGN(4) {
@@ -79,7 +79,7 @@ SECTIONS {
} >AUX2_RAM
.heap : ALIGN(4) {
- . = 37K; /* this acts as a build time assertion that at least this much memory is available for heap use */
+ . += 37K; /* this acts as a build time assertion that at least this much memory is available for heap use */
. = ABSOLUTE(ORIGIN(AUX2_RAM) + LENGTH(AUX2_RAM)); /* this explicitly sets the end of the heap */
} >AUX2_RAM
}
diff --git a/core/embed/sys/linker/stm32u58/kernel.ld b/core/embed/sys/linker/stm32u58/kernel.ld
index 4c812876..836b7b5e 100644
--- a/core/embed/sys/linker/stm32u58/kernel.ld
+++ b/core/embed/sys/linker/stm32u58/kernel.ld
@@ -1,12 +1,11 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
-
- MAIN_RAM (wal) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- FB1_RAM (wal) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
- FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
+ FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
+ MAIN_RAM (rw) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ FB1_RAM (rw) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
+ FB2_RAM (rw) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -30,7 +29,7 @@ SECTIONS {
} >FLASH AT>FLASH
.header : ALIGN(4) {
- . = 1K;
+ . += 1K;
. = ALIGN(CODE_ALIGNMENT);
} >FLASH AT>FLASH
@@ -45,7 +44,7 @@ SECTIONS {
} >FLASH AT>FLASH
.stack : ALIGN(8) {
- . = 8K; /* Overflow causes UsageFault */
+ . += 8K; /* Overflow causes UsageFault */
} >MAIN_RAM
.data : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32u58/prodtest.ld b/core/embed/sys/linker/stm32u58/prodtest.ld
index 23114edf..5632a075 100644
--- a/core/embed/sys/linker/stm32u58/prodtest.ld
+++ b/core/embed/sys/linker/stm32u58/prodtest.ld
@@ -1,14 +1,13 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
-
- MAIN_RAM (wal) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
- AUX2_RAM (wal) : ORIGIN = AUX2_RAM_START, LENGTH = AUX2_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- FB1_RAM (wal) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
- FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
+ FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
+ MAIN_RAM (rw) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ AUX2_RAM (rw) : ORIGIN = AUX2_RAM_START, LENGTH = AUX2_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ FB1_RAM (rw) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
+ FB2_RAM (rw) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -77,7 +76,7 @@ SECTIONS {
} >AUX2_RAM
.stack : ALIGN(8) {
- . = 16K; /* Overflow causes UsageFault */
+ . += 16K; /* Overflow causes UsageFault */
} >MAIN_RAM
.fb1 : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32u5g/boardloader.ld b/core/embed/sys/linker/stm32u5g/boardloader.ld
index 1dcd5619..e4e8850b 100644
--- a/core/embed/sys/linker/stm32u5g/boardloader.ld
+++ b/core/embed/sys/linker/stm32u5g/boardloader.ld
@@ -1,14 +1,13 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = BOARDLOADER_START, LENGTH = BOARDLOADER_MAXSIZE
- BOARDCAPS (rx) : ORIGIN = BOARDCAPS_START, LENGTH = BOARDCAPS_MAXSIZE
-
- MAIN_RAM (wal) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- FB1_RAM (wal) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
- FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
+ FLASH (rx) : ORIGIN = BOARDLOADER_START, LENGTH = BOARDLOADER_MAXSIZE
+ BOARDCAPS (rw) : ORIGIN = BOARDCAPS_START, LENGTH = BOARDCAPS_MAXSIZE
+ MAIN_RAM (rw) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ FB1_RAM (rw) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
+ FB2_RAM (rw) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -60,7 +59,7 @@ SECTIONS {
} >AUX1_RAM
.stack : ALIGN(8) {
- . = 16K; /* Overflow causes UsageFault */
+ . += 16K; /* Overflow causes UsageFault */
} >MAIN_RAM
.fb1 : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32u5g/bootloader.ld b/core/embed/sys/linker/stm32u5g/bootloader.ld
index e11a9fe5..c742d86a 100644
--- a/core/embed/sys/linker/stm32u5g/bootloader.ld
+++ b/core/embed/sys/linker/stm32u5g/bootloader.ld
@@ -1,12 +1,12 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = BOOTLOADER_START, LENGTH = BOOTLOADER_MAXSIZE
- MAIN_RAM (wal) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- FB1_RAM (wal) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
- FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
+ FLASH (rx) : ORIGIN = BOOTLOADER_START, LENGTH = BOOTLOADER_MAXSIZE
+ MAIN_RAM (rw) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ FB1_RAM (rw) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
+ FB2_RAM (rw) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -65,7 +65,7 @@ SECTIONS {
} >AUX1_RAM
.stack : ALIGN(8) {
- . = 16K; /* Overflow causes UsageFault */
+ . += 16K; /* Overflow causes UsageFault */
} >MAIN_RAM
.fb1 : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32u5g/firmware.ld b/core/embed/sys/linker/stm32u5g/firmware.ld
index e928d886..e4bb2d5b 100644
--- a/core/embed/sys/linker/stm32u5g/firmware.ld
+++ b/core/embed/sys/linker/stm32u5g/firmware.ld
@@ -1,8 +1,8 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -56,7 +56,7 @@ SECTIONS {
} >FLASH AT>FLASH
.stack : ALIGN(8) {
- . = 32K; /* Overflow causes UsageFault */
+ . += 32K; /* Overflow causes UsageFault */
} >AUX1_RAM
.data : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32u5g/kernel.ld b/core/embed/sys/linker/stm32u5g/kernel.ld
index aea569ef..07b7a608 100644
--- a/core/embed/sys/linker/stm32u5g/kernel.ld
+++ b/core/embed/sys/linker/stm32u5g/kernel.ld
@@ -1,12 +1,11 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
-
- MAIN_RAM (wal) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- FB1_RAM (wal) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
- FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
+ FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
+ MAIN_RAM (rw) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ FB1_RAM (rw) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
+ FB2_RAM (rw) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -30,7 +29,7 @@ SECTIONS {
} >FLASH AT>FLASH
.header : ALIGN(4) {
- . = 1K;
+ . += 1K;
. = ALIGN(CODE_ALIGNMENT);
} >FLASH AT>FLASH
@@ -49,7 +48,7 @@ SECTIONS {
} >FLASH AT>FLASH
.stack : ALIGN(8) {
- . = 12K; /* Overflow causes UsageFault */
+ . += 12K; /* Overflow causes UsageFault */
} >MAIN_RAM
.data : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32u5g/prodtest.ld b/core/embed/sys/linker/stm32u5g/prodtest.ld
index e17957b5..17ff1a55 100644
--- a/core/embed/sys/linker/stm32u5g/prodtest.ld
+++ b/core/embed/sys/linker/stm32u5g/prodtest.ld
@@ -1,13 +1,12 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
-
- MAIN_RAM (wal) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
- AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- FB1_RAM (wal) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
- FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
+ FLASH (rx) : ORIGIN = FIRMWARE_START, LENGTH = FIRMWARE_MAXSIZE
+ MAIN_RAM (rw) : ORIGIN = MAIN_RAM_START, LENGTH = MAIN_RAM_SIZE
+ AUX1_RAM (rw) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ FB1_RAM (rw) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
+ FB2_RAM (rw) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
}
_stack_section_start = ADDR(.stack);
@@ -65,7 +64,7 @@ SECTIONS {
} >FLASH AT>FLASH
.stack : ALIGN(8) {
- . = 128K; /* Overflow causes UsageFault */
+ . += 128K; /* Overflow causes UsageFault */
} >AUX1_RAM
.data : ALIGN(4) {
diff --git a/core/embed/sys/linker/stm32u5g/secmon.ld b/core/embed/sys/linker/stm32u5g/secmon.ld
index c5e71ffb..cc9f54d3 100644
--- a/core/embed/sys/linker/stm32u5g/secmon.ld
+++ b/core/embed/sys/linker/stm32u5g/secmon.ld
@@ -1,11 +1,11 @@
ENTRY(reset_handler)
MEMORY {
- FLASH (rx) : ORIGIN = FIRMWARE_START_S, LENGTH = FIRMWARE_MAXSIZE
- RAM (wal) : ORIGIN = SECMON_RAM_START, LENGTH = SECMON_RAM_SIZE
- BOOT_ARGS (wal) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
- FB1_RAM (wal) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
- FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
+ FLASH (rx) : ORIGIN = FIRMWARE_START_S, LENGTH = FIRMWARE_MAXSIZE
+ RAM (rw) : ORIGIN = SECMON_RAM_START, LENGTH = SECMON_RAM_SIZE
+ BOOT_ARGS (rw) : ORIGIN = BOOTARGS_START, LENGTH = BOOTARGS_SIZE
+ FB1_RAM (rw) : ORIGIN = FB1_RAM_START, LENGTH = FB1_RAM_SIZE
+ FB2_RAM (rw) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
}
_sgstubs_section_start = ADDR(.gnu.sgstubs);
@@ -33,7 +33,7 @@ SECTIONS {
} >FLASH
.header : ALIGN(4) {
- . = 1K;
+ . += 1K;
. = ALIGN(CODE_ALIGNMENT);
} >FLASH
@@ -67,6 +67,7 @@ SECTIONS {
/* .data and .bss are intentionally placed before the .stack
section to ensure they are located in SRAM2, which is
cleared on security events */
+
.data : ALIGN(4) {
*(.data*);
. = ALIGN(4);
Why this scored 17/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.