217 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			217 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								** ###################################################################
							 | 
						||
| 
								 | 
							
								**     Processors:          K32L2B31VFM0A
							 | 
						||
| 
								 | 
							
								**                          K32L2B31VFT0A
							 | 
						||
| 
								 | 
							
								**                          K32L2B31VLH0A
							 | 
						||
| 
								 | 
							
								**                          K32L2B31VMP0A
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								**     Compiler:            GNU C Compiler
							 | 
						||
| 
								 | 
							
								**     Reference manual:    K32L2B3xRM, Rev.0, July 2019
							 | 
						||
| 
								 | 
							
								**     Version:             rev. 1.0, 2019-07-30
							 | 
						||
| 
								 | 
							
								**     Build:               b190930
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								**     Abstract:
							 | 
						||
| 
								 | 
							
								**         Linker file for the GNU C Compiler
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								**     Copyright 2016 Freescale Semiconductor, Inc.
							 | 
						||
| 
								 | 
							
								**     Copyright 2016-2019 NXP
							 | 
						||
| 
								 | 
							
								**     All rights reserved.
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								**     SPDX-License-Identifier: BSD-3-Clause
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								**     http:                 www.nxp.com
							 | 
						||
| 
								 | 
							
								**     mail:                 support@nxp.com
							 | 
						||
| 
								 | 
							
								**
							 | 
						||
| 
								 | 
							
								** ###################################################################
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Entry Point */
							 | 
						||
| 
								 | 
							
								ENTRY(Reset_Handler)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HEAP_SIZE  = DEFINED(__heap_size__)  ? __heap_size__  : 0x0400;
							 | 
						||
| 
								 | 
							
								STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Specify the memory areas */
							 | 
						||
| 
								 | 
							
								MEMORY
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  m_interrupts          (RX)  : ORIGIN = 0x00008000, LENGTH = 0x00000200
							 | 
						||
| 
								 | 
							
								  m_flash_config        (RX)  : ORIGIN = 0x00008400, LENGTH = 0x00000010
							 | 
						||
| 
								 | 
							
								  m_text                (RX)  : ORIGIN = 0x00008410, LENGTH = 0x00037BF0
							 | 
						||
| 
								 | 
							
								  m_data                (RW)  : ORIGIN = 0x1FFFE000, LENGTH = 0x00008000
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Define output sections */
							 | 
						||
| 
								 | 
							
								SECTIONS
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  /* The startup code goes first into internal flash */
							 | 
						||
| 
								 | 
							
								  .interrupts :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    . = ALIGN(4);
							 | 
						||
| 
								 | 
							
								    KEEP(*(.isr_vector))     /* Startup code */
							 | 
						||
| 
								 | 
							
								    . = ALIGN(4);
							 | 
						||
| 
								 | 
							
								  } > m_interrupts
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .flash_config :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    . = ALIGN(4);
							 | 
						||
| 
								 | 
							
								    KEEP(*(.FlashConfig))    /* Flash Configuration Field (FCF) */
							 | 
						||
| 
								 | 
							
								    . = ALIGN(4);
							 | 
						||
| 
								 | 
							
								  } > m_flash_config
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* The program code and other data goes into internal flash */
							 | 
						||
| 
								 | 
							
								  .text :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    . = ALIGN(4);
							 | 
						||
| 
								 | 
							
								    *(.text)                 /* .text sections (code) */
							 | 
						||
| 
								 | 
							
								    *(.text*)                /* .text* sections (code) */
							 | 
						||
| 
								 | 
							
								    *(.rodata)               /* .rodata sections (constants, strings, etc.) */
							 | 
						||
| 
								 | 
							
								    *(.rodata*)              /* .rodata* sections (constants, strings, etc.) */
							 | 
						||
| 
								 | 
							
								    *(.glue_7)               /* glue arm to thumb code */
							 | 
						||
| 
								 | 
							
								    *(.glue_7t)              /* glue thumb to arm code */
							 | 
						||
| 
								 | 
							
								    *(.eh_frame)
							 | 
						||
| 
								 | 
							
								    KEEP (*(.init))
							 | 
						||
| 
								 | 
							
								    KEEP (*(.fini))
							 | 
						||
| 
								 | 
							
								    . = ALIGN(4);
							 | 
						||
| 
								 | 
							
								  } > m_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .ARM.extab :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    *(.ARM.extab* .gnu.linkonce.armextab.*)
							 | 
						||
| 
								 | 
							
								  } > m_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .ARM :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    __exidx_start = .;
							 | 
						||
| 
								 | 
							
								    *(.ARM.exidx*)
							 | 
						||
| 
								 | 
							
								    __exidx_end = .;
							 | 
						||
| 
								 | 
							
								  } > m_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 .ctors :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    __CTOR_LIST__ = .;
							 | 
						||
| 
								 | 
							
								    /* gcc uses crtbegin.o to find the start of
							 | 
						||
| 
								 | 
							
								       the constructors, so we make sure it is
							 | 
						||
| 
								 | 
							
								       first.  Because this is a wildcard, it
							 | 
						||
| 
								 | 
							
								       doesn't matter if the user does not
							 | 
						||
| 
								 | 
							
								       actually link against crtbegin.o; the
							 | 
						||
| 
								 | 
							
								       linker won't look for a file to match a
							 | 
						||
| 
								 | 
							
								       wildcard.  The wildcard also means that it
							 | 
						||
| 
								 | 
							
								       doesn't matter which directory crtbegin.o
							 | 
						||
| 
								 | 
							
								       is in.  */
							 | 
						||
| 
								 | 
							
								    KEEP (*crtbegin.o(.ctors))
							 | 
						||
| 
								 | 
							
								    KEEP (*crtbegin?.o(.ctors))
							 | 
						||
| 
								 | 
							
								    /* We don't want to include the .ctor section from
							 | 
						||
| 
								 | 
							
								       from the crtend.o file until after the sorted ctors.
							 | 
						||
| 
								 | 
							
								       The .ctor section from the crtend file contains the
							 | 
						||
| 
								 | 
							
								       end of ctors marker and it must be last */
							 | 
						||
| 
								 | 
							
								    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))
							 | 
						||
| 
								 | 
							
								    KEEP (*(SORT(.ctors.*)))
							 | 
						||
| 
								 | 
							
								    KEEP (*(.ctors))
							 | 
						||
| 
								 | 
							
								    __CTOR_END__ = .;
							 | 
						||
| 
								 | 
							
								  } > m_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .dtors :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    __DTOR_LIST__ = .;
							 | 
						||
| 
								 | 
							
								    KEEP (*crtbegin.o(.dtors))
							 | 
						||
| 
								 | 
							
								    KEEP (*crtbegin?.o(.dtors))
							 | 
						||
| 
								 | 
							
								    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))
							 | 
						||
| 
								 | 
							
								    KEEP (*(SORT(.dtors.*)))
							 | 
						||
| 
								 | 
							
								    KEEP (*(.dtors))
							 | 
						||
| 
								 | 
							
								    __DTOR_END__ = .;
							 | 
						||
| 
								 | 
							
								  } > m_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .preinit_array :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    PROVIDE_HIDDEN (__preinit_array_start = .);
							 | 
						||
| 
								 | 
							
								    KEEP (*(.preinit_array*))
							 | 
						||
| 
								 | 
							
								    PROVIDE_HIDDEN (__preinit_array_end = .);
							 | 
						||
| 
								 | 
							
								  } > m_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .init_array :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    PROVIDE_HIDDEN (__init_array_start = .);
							 | 
						||
| 
								 | 
							
								    KEEP (*(SORT(.init_array.*)))
							 | 
						||
| 
								 | 
							
								    KEEP (*(.init_array*))
							 | 
						||
| 
								 | 
							
								    PROVIDE_HIDDEN (__init_array_end = .);
							 | 
						||
| 
								 | 
							
								  } > m_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .fini_array :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    PROVIDE_HIDDEN (__fini_array_start = .);
							 | 
						||
| 
								 | 
							
								    KEEP (*(SORT(.fini_array.*)))
							 | 
						||
| 
								 | 
							
								    KEEP (*(.fini_array*))
							 | 
						||
| 
								 | 
							
								    PROVIDE_HIDDEN (__fini_array_end = .);
							 | 
						||
| 
								 | 
							
								  } > m_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  __etext = .;    /* define a global symbol at end of code */
							 | 
						||
| 
								 | 
							
								  __DATA_ROM = .; /* Symbol is used by startup for data initialization */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* reserve MTB memory at the beginning of m_data */
							 | 
						||
| 
								 | 
							
								  .mtb : /* MTB buffer address as defined by the hardware */
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    . = ALIGN(8);
							 | 
						||
| 
								 | 
							
								    _mtb_start = .;
							 | 
						||
| 
								 | 
							
								    KEEP(*(.mtb_buf)) /* need to KEEP Micro Trace Buffer as not referenced by application */
							 | 
						||
| 
								 | 
							
								    . = ALIGN(8);
							 | 
						||
| 
								 | 
							
								    _mtb_end = .;
							 | 
						||
| 
								 | 
							
								  } > m_data
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .data : AT(__DATA_ROM)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    . = ALIGN(4);
							 | 
						||
| 
								 | 
							
								    __DATA_RAM = .;
							 | 
						||
| 
								 | 
							
								    __data_start__ = .;      /* create a global symbol at data start */
							 | 
						||
| 
								 | 
							
								    *(.data)                 /* .data sections */
							 | 
						||
| 
								 | 
							
								    *(.data*)                /* .data* sections */
							 | 
						||
| 
								 | 
							
								    KEEP(*(.jcr*))
							 | 
						||
| 
								 | 
							
								    . = ALIGN(4);
							 | 
						||
| 
								 | 
							
								    __data_end__ = .;        /* define a global symbol at data end */
							 | 
						||
| 
								 | 
							
								  } > m_data
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  __DATA_END = __DATA_ROM + (__data_end__ - __data_start__);
							 | 
						||
| 
								 | 
							
								  text_end = ORIGIN(m_text) + LENGTH(m_text);
							 | 
						||
| 
								 | 
							
								  ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* Uninitialized data section */
							 | 
						||
| 
								 | 
							
								  .bss :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    /* This is used by the startup in order to initialize the .bss section */
							 | 
						||
| 
								 | 
							
								    . = ALIGN(4);
							 | 
						||
| 
								 | 
							
								    __START_BSS = .;
							 | 
						||
| 
								 | 
							
								    __bss_start__ = .;
							 | 
						||
| 
								 | 
							
								    *(.bss)
							 | 
						||
| 
								 | 
							
								    *(.bss*)
							 | 
						||
| 
								 | 
							
								    *(COMMON)
							 | 
						||
| 
								 | 
							
								    . = ALIGN(4);
							 | 
						||
| 
								 | 
							
								    __bss_end__ = .;
							 | 
						||
| 
								 | 
							
								    __END_BSS = .;
							 | 
						||
| 
								 | 
							
								  } > m_data
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .heap :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    . = ALIGN(8);
							 | 
						||
| 
								 | 
							
								    __end__ = .;
							 | 
						||
| 
								 | 
							
								    PROVIDE(end = .);
							 | 
						||
| 
								 | 
							
								    __HeapBase = .;
							 | 
						||
| 
								 | 
							
								    . += HEAP_SIZE;
							 | 
						||
| 
								 | 
							
								    __HeapLimit = .;
							 | 
						||
| 
								 | 
							
								    __heap_limit = .; /* Add for _sbrk */
							 | 
						||
| 
								 | 
							
								  } > m_data
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .stack :
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    . = ALIGN(8);
							 | 
						||
| 
								 | 
							
								    . += STACK_SIZE;
							 | 
						||
| 
								 | 
							
								  } > m_data
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* Initializes stack on the end of block */
							 | 
						||
| 
								 | 
							
								  __StackTop   = ORIGIN(m_data) + LENGTH(m_data);
							 | 
						||
| 
								 | 
							
								  __StackLimit = __StackTop - STACK_SIZE;
							 | 
						||
| 
								 | 
							
								  PROVIDE(__stack = __StackTop);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  .ARM.attributes 0 : { *(.ARM.attributes) }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap")
							 | 
						||
| 
								 | 
							
								}
							 |