diff options
author | 2023-02-12 01:12:53 +0000 | |
---|---|---|
committer | 2023-02-12 01:12:53 +0000 | |
commit | 9d63aa9e135cf319e96863f46699f3ade7f6f333 (patch) | |
tree | e7716f965ab2dbe1e4feb52e0fd9a3b64d2b2918 /cortex-m-rt/link.x.in | |
parent | 2bdd95f3172fe741ac1e6fb8659ba06aed1a395d (diff) | |
parent | 4e86db794f18cb4e1e283022d6f320111a30ee85 (diff) | |
download | cortex-m-9d63aa9e135cf319e96863f46699f3ade7f6f333.tar.gz cortex-m-9d63aa9e135cf319e96863f46699f3ade7f6f333.tar.zst cortex-m-9d63aa9e135cf319e96863f46699f3ade7f6f333.zip |
Merge #465
465: Enforce 8-byte initial stack pointer alignment r=adamgreig a=adamgreig
After #463 we discovered that adding a second linker script via another compiler flag could be used to override `_stack_start` without triggering the assert in the main linker script. By masking the value, we force alignment even when the assert doesn't otherwise trigger.
Co-authored-by: Adam Greig <adam@adamgreig.com>
Diffstat (limited to 'cortex-m-rt/link.x.in')
-rw-r--r-- | cortex-m-rt/link.x.in | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/cortex-m-rt/link.x.in b/cortex-m-rt/link.x.in index 9f893d4..551f576 100644 --- a/cortex-m-rt/link.x.in +++ b/cortex-m-rt/link.x.in @@ -68,8 +68,12 @@ SECTIONS { __vector_table = .; - /* Initial Stack Pointer (SP) value */ - LONG(_stack_start); + /* Initial Stack Pointer (SP) value. + * We mask the bottom three bits to force 8-byte alignment. + * Despite having an assert for this later, it's possible that a separate + * linker script could override _stack_start after the assert is checked. + */ + LONG(_stack_start & 0xFFFFFFF8); /* Reset vector */ KEEP(*(.vector_table.reset_vector)); /* this is the `__RESET_VECTOR` symbol */ |