correct linker

This commit is contained in:
hathach
2018-02-09 23:22:35 +07:00
parent 342eaaee10
commit 33acd73f49
4 changed files with 36 additions and 98 deletions

View File

@ -21,7 +21,7 @@ OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
* with other linker script that defines memory regions FLASH and RAM.
* It references following symbols, which must be defined in code:
* Reset_Handler : Entry of reset handler
*
*
* It defines following symbols, which code can use without definition:
* __exidx_start
* __exidx_end
@ -38,6 +38,7 @@ OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
* __bss_end__
* __end__
* end
* __HeapBase
* __HeapLimit
* __StackLimit
* __StackTop
@ -73,8 +74,8 @@ SECTIONS
KEEP(*(.eh_frame*))
} > FLASH
.ARM.extab :
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > FLASH
@ -87,7 +88,7 @@ SECTIONS
__exidx_end = .;
__etext = .;
.data : AT (__etext)
{
__data_start__ = .;
@ -131,12 +132,13 @@ SECTIONS
. = ALIGN(4);
__bss_end__ = .;
} > RAM
.heap (COPY):
{
__HeapBase = .;
__end__ = .;
PROVIDE(end = .);
*(.heap*)
KEEP(*(.heap*))
__HeapLimit = .;
} > RAM
@ -145,7 +147,7 @@ SECTIONS
* values to stack symbols later */
.stack_dummy (COPY):
{
*(.stack*)
KEEP(*(.stack*))
} > RAM
/* Set stack top to end of RAM, and stack limit move down by
@ -153,8 +155,14 @@ SECTIONS
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
PROVIDE(__stack = __StackTop);
/* Check if data + heap + stack exceeds RAM limit */
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
/* Check if text sections + data exceeds FLASH limit */
DataInitFlashUsed = __bss_start__ - __data_start__;
CodeFlashUsed = __etext - ORIGIN(FLASH);
TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed;
ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data")
}

View File

@ -21,7 +21,7 @@ OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
* with other linker script that defines memory regions FLASH and RAM.
* It references following symbols, which must be defined in code:
* Reset_Handler : Entry of reset handler
*
*
* It defines following symbols, which code can use without definition:
* __exidx_start
* __exidx_end
@ -38,6 +38,7 @@ OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
* __bss_end__
* __end__
* end
* __HeapBase
* __HeapLimit
* __StackLimit
* __StackTop
@ -73,8 +74,8 @@ SECTIONS
KEEP(*(.eh_frame*))
} > FLASH
.ARM.extab :
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > FLASH
@ -87,7 +88,7 @@ SECTIONS
__exidx_end = .;
__etext = .;
.data : AT (__etext)
{
__data_start__ = .;
@ -134,9 +135,10 @@ SECTIONS
.heap (COPY):
{
__HeapBase = .;
__end__ = .;
PROVIDE(end = .);
*(.heap*)
KEEP(*(.heap*))
__HeapLimit = .;
} > RAM
@ -145,7 +147,7 @@ SECTIONS
* values to stack symbols later */
.stack_dummy (COPY):
{
*(.stack*)
KEEP(*(.stack*))
} > RAM
/* Set stack top to end of RAM, and stack limit move down by
@ -153,8 +155,14 @@ SECTIONS
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
PROVIDE(__stack = __StackTop);
/* Check if data + heap + stack exceeds RAM limit */
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
/* Check if text sections + data exceeds FLASH limit */
DataInitFlashUsed = __bss_start__ - __data_start__;
CodeFlashUsed = __etext - ORIGIN(FLASH);
TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed;
ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data")
}