You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Jan 24, 2022. It is now read-only.
make _sbss override-able, add a fictitious .stack section
This is one possible solution to the stack overflow problem described in #34. This approach uses a
linker wrapper, called [swap-ld], to generate the desired memory layout. See #34 for a description
of the desired memory layout and #41 for a description of how `swap-ld` works.
The observable effects of this change in cortex-m programs are:
- the `_sbss` symbol is now override-able.
- there is now a `.stack` linker section that denotes the span of the call stack. `.stack` won't be
loaded into the program; it just exists for informative purposes (`swap-ld` uses this
information).
Given the following program:
``` rust
fn main() {
static mut X: u32 = 0;
static mut Y: u32 = 1;
loop {
unsafe {
ptr::write_volatile(&mut X, X + 1);
ptr::write_volatile(&mut Y, Y + 1);
}
}
}
```
If you link this program using the `arm-none-eabi-ld` linker, which is the cortex-m-quickstart
default, you'll get the following memory layout:
``` console
$ console
section size addr
.vector_table 0x130 0x8000000
.text 0x94 0x8000130
.rodata 0x0 0x80001c4
.stack 0x5000 0x20000000
.bss 0x4 0x20000000
.data 0x4 0x20000004
```
Note how the space reserved for the stack (depicted by the `.stack` linker section) overlaps with
the space where .bss and .data reside.
If you, instead, link this program using `swap-ld` you'll get the following memory layout:
``` console
$ arm-none-eabi-size -Ax app
section size addr
.vector_table 0x130 0x8000000
.text 0x94 0x8000130
.rodata 0x0 0x80001c4
.stack 0x4ff8 0x20000000
.bss 0x4 0x20004ff8
.data 0x4 0x20004ffc
```
Note that no overlap exists in this case and that the call stack size has reduced to accommodate the
.bss and .data sections.
Unlike #41 the addresses of static variables is now correct:
``` console
$ arm-none-eabi-objdump -CD app
Disassembly of section .vector_table:
08000000 <_svector_table>:
8000000: 20004ff8 strdcs r4, [r0], -r8 ; initial Stack Pointer
08000004 <cortex_m_rt::RESET_VECTOR>:
8000004: 08000131 stmdaeq r0, {r0, r4, r5, r8}
08000008 <EXCEPTIONS>:
8000008: 080001bd stmdaeq r0, {r0, r2, r3, r4, r5, r7, r8}
(..)
Disassembly of section .stack:
20000000 <.stack>:
...
Disassembly of section .bss:
20004ff8 <cortex_m_quickstart::main::X>:
20004ff8: 00000000 andeq r0, r0, r0
Disassembly of section .data:
20004ffc <_sdata>:
20004ffc: 00000001 andeq r0, r0, r1
```
closes#34
[swap-ld]: https://github.com/japaric/swap-ld
0 commit comments