1/*
2** ###################################################################
3**     Processor:           MIMXRT1173CVM8A_cm4
4**     Compiler:            GNU C Compiler
5**     Reference manual:    IMXRT1170RM, Rev 1, 02/2021
6**     Version:             rev. 1.1, 2022-04-02
7**     Build:               b220402
8**
9**     Abstract:
10**         Linker file for the GNU C Compiler
11**
12**     Copyright 2016 Freescale Semiconductor, Inc.
13**     Copyright 2016-2022 NXP
14**     All rights reserved.
15**
16**     SPDX-License-Identifier: BSD-3-Clause
17**
18**     http:                 www.nxp.com
19**     mail:                 support@nxp.com
20**
21** ###################################################################
22*/
23
24/* Entry Point */
25ENTRY(Reset_Handler)
26
27HEAP_SIZE  = DEFINED(__heap_size__)  ? __heap_size__  : 0x0400;
28STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;
29RPMSG_SHMEM_SIZE = DEFINED(__use_shmem__) ? 0x2000 : 0;
30NCACHE_HEAP_START = DEFINED(__heap_noncacheable__) ? 0x202C0000 - HEAP_SIZE : 0x20020000 - HEAP_SIZE;
31NCACHE_HEAP_SIZE  = DEFINED(__heap_noncacheable__) ? HEAP_SIZE : 0x0000;
32
33/* Specify the memory areas */
34MEMORY
35{
36  m_interrupts          (RX)  : ORIGIN = 0x1FFE0000, LENGTH = 0x00000400
37  m_text                (RX)  : ORIGIN = 0x1FFE0400, LENGTH = 0x0001FC00
38  m_data                (RW)  : ORIGIN = 0x20000000, LENGTH = DEFINED(__heap_noncacheable__) ? 0x00020000 : 0x00020000 - HEAP_SIZE
39  m_ncache              (RW)  : ORIGIN = 0x20280000, LENGTH = DEFINED(__heap_noncacheable__) ? 0x00040000 - HEAP_SIZE : 0x00040000
40  m_data2               (RW)  : ORIGIN = 0x20240000, LENGTH = 0x00040000
41  m_heap                (RW)  : ORIGIN = NCACHE_HEAP_START, LENGTH = HEAP_SIZE
42  rpmsg_sh_mem          (RW)  : ORIGIN = 0x202C0000, LENGTH = RPMSG_SHMEM_SIZE
43}
44
45/* Define output sections */
46SECTIONS
47{
48  __NCACHE_REGION_START = ORIGIN(m_ncache);
49  __NCACHE_REGION_SIZE  = LENGTH(m_ncache) + NCACHE_HEAP_SIZE;
50
51  __RPMSG_SH_MEM_START = ORIGIN(rpmsg_sh_mem);
52  __RPMSG_SH_MEM_SIZE  = LENGTH(rpmsg_sh_mem);
53
54  /* NOINIT section for rpmsg_sh_mem */
55  .noinit_rpmsg_sh_mem (NOLOAD) : ALIGN(4)
56  {
57     __RPMSG_SH_MEM_START__ = .;
58     *(.noinit.$rpmsg_sh_mem*)
59     . = ALIGN(4) ;
60     __RPMSG_SH_MEM_END__ = .;
61  } > rpmsg_sh_mem
62
63  /* The startup code goes first into internal RAM */
64  .interrupts :
65  {
66    __VECTOR_TABLE = .;
67    __Vectors = .;
68    . = ALIGN(4);
69    KEEP(*(.isr_vector))     /* Startup code */
70    . = ALIGN(4);
71  } > m_interrupts
72
73  /* The program code and other data goes into internal RAM */
74  .text :
75  {
76    . = ALIGN(4);
77    *(.text)                 /* .text sections (code) */
78    *(.text*)                /* .text* sections (code) */
79    *(.rodata)               /* .rodata sections (constants, strings, etc.) */
80    *(.rodata*)              /* .rodata* sections (constants, strings, etc.) */
81    *(CodeQuickAccess)       /* quick access code section */
82    *(.glue_7)               /* glue arm to thumb code */
83    *(.glue_7t)              /* glue thumb to arm code */
84    *(.eh_frame)
85    KEEP (*(.init))
86    KEEP (*(.fini))
87    . = ALIGN(4);
88  } > m_text
89
90  .ARM.extab :
91  {
92    *(.ARM.extab* .gnu.linkonce.armextab.*)
93  } > m_text
94
95  .ARM :
96  {
97    __exidx_start = .;
98    *(.ARM.exidx*)
99    __exidx_end = .;
100  } > m_text
101
102 .ctors :
103  {
104    __CTOR_LIST__ = .;
105    /* gcc uses crtbegin.o to find the start of
106       the constructors, so we make sure it is
107       first.  Because this is a wildcard, it
108       doesn't matter if the user does not
109       actually link against crtbegin.o; the
110       linker won't look for a file to match a
111       wildcard.  The wildcard also means that it
112       doesn't matter which directory crtbegin.o
113       is in.  */
114    KEEP (*crtbegin.o(.ctors))
115    KEEP (*crtbegin?.o(.ctors))
116    /* We don't want to include the .ctor section from
117       from the crtend.o file until after the sorted ctors.
118       The .ctor section from the crtend file contains the
119       end of ctors marker and it must be last */
120    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))
121    KEEP (*(SORT(.ctors.*)))
122    KEEP (*(.ctors))
123    __CTOR_END__ = .;
124  } > m_text
125
126  .dtors :
127  {
128    __DTOR_LIST__ = .;
129    KEEP (*crtbegin.o(.dtors))
130    KEEP (*crtbegin?.o(.dtors))
131    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))
132    KEEP (*(SORT(.dtors.*)))
133    KEEP (*(.dtors))
134    __DTOR_END__ = .;
135  } > m_text
136
137  .preinit_array :
138  {
139    PROVIDE_HIDDEN (__preinit_array_start = .);
140    KEEP (*(.preinit_array*))
141    PROVIDE_HIDDEN (__preinit_array_end = .);
142  } > m_text
143
144  .init_array :
145  {
146    PROVIDE_HIDDEN (__init_array_start = .);
147    KEEP (*(SORT(.init_array.*)))
148    KEEP (*(.init_array*))
149    PROVIDE_HIDDEN (__init_array_end = .);
150  } > m_text
151
152  .fini_array :
153  {
154    PROVIDE_HIDDEN (__fini_array_start = .);
155    KEEP (*(SORT(.fini_array.*)))
156    KEEP (*(.fini_array*))
157    PROVIDE_HIDDEN (__fini_array_end = .);
158  } > m_text
159
160  __etext = .;    /* define a global symbol at end of code */
161  __DATA_ROM = .; /* Symbol is used by startup for data initialization */
162
163  __VECTOR_RAM = ORIGIN(m_interrupts);
164  __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0;
165
166  .data : AT(__DATA_ROM)
167  {
168    . = ALIGN(4);
169    __DATA_RAM = .;
170    __data_start__ = .;      /* create a global symbol at data start */
171    *(m_usb_dma_init_data)
172    *(.data)                 /* .data sections */
173    *(.data*)                /* .data* sections */
174    *(DataQuickAccess)       /* quick access data section */
175    KEEP(*(.jcr*))
176    . = ALIGN(4);
177    __data_end__ = .;        /* define a global symbol at data end */
178  } > m_data
179
180  __NDATA_ROM = __DATA_ROM + (__data_end__ - __data_start__);
181  .ncache.init : AT(__NDATA_ROM)
182  {
183    __noncachedata_start__ = .;   /* create a global symbol at ncache data start */
184    *(NonCacheable.init)
185    . = ALIGN(4);
186    __noncachedata_init_end__ = .;   /* create a global symbol at initialized ncache data end */
187  } > m_ncache
188  . = __noncachedata_init_end__;
189  .ncache :
190  {
191    *(NonCacheable)
192    . = ALIGN(4);
193    __noncachedata_end__ = .;     /* define a global symbol at ncache data end */
194  } > m_ncache
195
196  __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__);
197  text_end = ORIGIN(m_text) + LENGTH(m_text);
198  ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
199
200  /* Uninitialized data section */
201  .bss :
202  {
203    /* This is used by the startup in order to initialize the .bss section */
204    . = ALIGN(4);
205    __START_BSS = .;
206    __bss_start__ = .;
207    *(m_usb_dma_noninit_data)
208    *(.bss)
209    *(.bss*)
210    *(COMMON)
211    . = ALIGN(4);
212    __bss_end__ = .;
213    __END_BSS = .;
214  } > m_data
215
216  .heap :
217  {
218    . = ALIGN(8);
219    __end__ = .;
220    PROVIDE(end = .);
221    __HeapBase = .;
222    . += HEAP_SIZE;
223    __HeapLimit = .;
224    __heap_limit = .; /* Add for _sbrk */
225  } > m_heap
226
227  .stack :
228  {
229    . = ALIGN(8);
230    . += STACK_SIZE;
231    __StackEnd = .;
232  } > m_data
233
234  /* Initializes stack on the end of block */
235  __StackTop   = ORIGIN(m_data) + LENGTH(m_data);
236  __StackLimit = __StackTop - STACK_SIZE;
237  PROVIDE(__stack = __StackTop);
238
239  .ARM.attributes 0 : { *(.ARM.attributes) }
240
241  ASSERT(__StackLimit >= __StackEnd, "region m_data overflowed with stack and heap")
242}
243