diff options
author | Marti Bolivar <mbolivar@leaflabs.com> | 2011-09-12 16:24:43 -0400 |
---|---|---|
committer | Marti Bolivar <mbolivar@leaflabs.com> | 2011-09-12 17:25:01 -0400 |
commit | f52af4876b0ffc98055fba237fb01852f1bfaaae (patch) | |
tree | 7c3571113c9b4b59beb1fefe4993418124cbb6ff /support/ld | |
parent | c3e769c44e072faebd5dc87582ff832bc13ee184 (diff) | |
download | librambutan-f52af4876b0ffc98055fba237fb01852f1bfaaae.tar.gz librambutan-f52af4876b0ffc98055fba237fb01852f1bfaaae.zip |
[support/ld] Add linker support for reconfigurable heap.
- common_header.inc: Declare EXTERN symbols _lm_heap_start and
_lm_heap_end.
- common_rom.inc: Check for _lm_heap_start and _lm_heap_end. If they
are defined, preserve their values. Otherwise, _lm_heap_start is
starts after .bss, and _lm_heap_end is the end of SRAM.
This allows existing linker scripts to continue using the old heap
scheme, but allows for customizability elsewhere.
- syscalls.c: Respect the addresses of _lm_heap_start and _lm_heap_end
as the boundaries of the heap in _sbrk().
Diffstat (limited to 'support/ld')
-rw-r--r-- | support/ld/common_header.inc | 5 | ||||
-rw-r--r-- | support/ld/common_rom.inc | 13 |
2 files changed, 16 insertions, 2 deletions
diff --git a/support/ld/common_header.inc b/support/ld/common_header.inc index 36ed2b1..1d11ba0 100644 --- a/support/ld/common_header.inc +++ b/support/ld/common_header.inc @@ -32,5 +32,6 @@ PROVIDE(__cs3_stack = __cs3_region_start_ram + LENGTH(ram)); EXTERN(_start) PROVIDE(__cs3_reset = _start); -/* Beginning of the heap */ -PROVIDE(__cs3_heap_start = _end); +/* Heap boundaries, for libmaple */ +EXTERN(_lm_heap_start); +EXTERN(_lm_heap_end); diff --git a/support/ld/common_rom.inc b/support/ld/common_rom.inc index 7284492..7182a4d 100644 --- a/support/ld/common_rom.inc +++ b/support/ld/common_rom.inc @@ -112,6 +112,19 @@ SECTIONS *(.got.plt) *(.got) *(.data .data.* .gnu.linkonce.d.*) + + + /* + * Heap: Linker scripts may choose a custom heap by overriding + * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in + * internal SRAM, beginning after .bss, and growing towards + * the stack. + * + * I'm shoving these here naively; there's probably a cleaner way + * to go about this. [mbolivar] + */ + _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; + _lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __cs3_stack; . = ALIGN (8); _edata = .; } > REGION_DATA AT> REGION_TEXT |