1# Copyright (C) 2014-2016 Free Software Foundation, Inc.
2#
3# Copying and distribution of this file, with or without modification,
4# are permitted in any medium without royalty provided the copyright
5# notice and this notice are preserved.
6
7HEAP_SECTION_MSP430=" "
8HEAP_MEMORY_MSP430=" "
9
10if test ${GOT_HEAP_MSP-0} -ne 0
11then
12HEAP_SECTION_MSP430=".heap ${RELOCATING-0} :
13  {
14    ${RELOCATING+ PROVIDE (__heap_data_start = .) ; }
15    *(.heap*)
16    ${RELOCATING+ PROVIDE (_heap_data_end = .) ; }
17    ${RELOCATING+. = ALIGN(2);}
18    ${RELOCATING+ PROVIDE (__heap_bottom = .) ; }
19    ${RELOCATING+ PROVIDE (__heap_top = ${HEAP_START} + ${HEAP_LENGTH}) ; }
20  } ${RELOCATING+ > heap}"
21HEAP_MEMORY_MSP430="heap(rwx) 		: ORIGIN = $HEAP_START,	LENGTH = $HEAP_LENGTH"
22fi
23
24
25cat <<EOF
26/* Copyright (C) 2014-2016 Free Software Foundation, Inc.
27
28   Copying and distribution of this script, with or without modification,
29   are permitted in any medium without royalty provided the copyright
30   notice and this notice are preserved.  */
31
32OUTPUT_FORMAT("${OUTPUT_FORMAT}","${OUTPUT_FORMAT}","${OUTPUT_FORMAT}")
33OUTPUT_ARCH(${ARCH})
34
35MEMORY
36{
37  text   (rx)   	: ORIGIN = $ROM_START,  LENGTH = $ROM_SIZE
38  data   (rwx)  	: ORIGIN = $RAM_START, 	LENGTH = $RAM_SIZE
39  vectors (rw)  	: ORIGIN = 0xffe0,      LENGTH = 0x20
40  bootloader(rx)	: ORIGIN = 0x0c00,	LENGTH = 1K
41  infomem(rx)		: ORIGIN = 0x1000,	LENGTH = 256
42  infomemnobits(rx)	: ORIGIN = 0x1000,      LENGTH = 256
43  ${HEAP_MEMORY_MSP430}
44}
45
46SECTIONS
47{
48  /* Bootloader.  */
49  .bootloader ${RELOCATING-0} :
50  {
51    ${RELOCATING+ PROVIDE (__boot_start = .) ; }
52    *(.bootloader)
53    ${RELOCATING+. = ALIGN(2);}
54    *(.bootloader.*)
55  } ${RELOCATING+ > bootloader}
56
57  /* Information memory.  */
58  .infomem ${RELOCATING-0} :
59  {
60    *(.infomem)
61    ${RELOCATING+. = ALIGN(2);}
62    *(.infomem.*)
63  } ${RELOCATING+ > infomem}
64
65  /* Information memory (not loaded into MPU).  */
66  .infomemnobits ${RELOCATING-0} :
67  {
68    *(.infomemnobits)
69    ${RELOCATING+. = ALIGN(2);}
70    *(.infomemnobits.*)
71  } ${RELOCATING+ > infomemnobits}
72
73  /* Read-only sections, merged into text segment.  */
74  ${TEXT_DYNAMIC+${DYNAMIC}}
75  .hash        ${RELOCATING-0} : { *(.hash)             }
76  .dynsym      ${RELOCATING-0} : { *(.dynsym)           }
77  .dynstr      ${RELOCATING-0} : { *(.dynstr)           }
78  .gnu.version ${RELOCATING-0} : { *(.gnu.version)      }
79  .gnu.version_d ${RELOCATING-0} : { *(.gnu.version_d)  }
80  .gnu.version_r ${RELOCATING-0} : { *(.gnu.version_r)  }
81
82  .rel.init    ${RELOCATING-0} : { *(.rel.init) }
83  .rela.init   ${RELOCATING-0} : { *(.rela.init) }
84  .rel.text    ${RELOCATING-0} :
85    {
86      *(.rel.text)
87      ${RELOCATING+*(.rel.text.*)}
88      ${RELOCATING+*(.rel.gnu.linkonce.t*)}
89    }
90  .rela.text   ${RELOCATING-0} :
91    {
92      *(.rela.text)
93      ${RELOCATING+*(.rela.text.*)}
94      ${RELOCATING+*(.rela.gnu.linkonce.t*)}
95    }
96  .rel.fini    ${RELOCATING-0} : { *(.rel.fini) }
97  .rela.fini   ${RELOCATING-0} : { *(.rela.fini) }
98  .rel.rodata  ${RELOCATING-0} :
99    {
100      *(.rel.rodata)
101      ${RELOCATING+*(.rel.rodata.*)}
102      ${RELOCATING+*(.rel.gnu.linkonce.r*)}
103    }
104  .rela.rodata ${RELOCATING-0} :
105    {
106      *(.rela.rodata)
107      ${RELOCATING+*(.rela.rodata.*)}
108      ${RELOCATING+*(.rela.gnu.linkonce.r*)}
109    }
110  .rel.data    ${RELOCATING-0} :
111    {
112      *(.rel.data)
113      ${RELOCATING+*(.rel.data.*)}
114      ${RELOCATING+*(.rel.gnu.linkonce.d*)}
115    }
116  .rela.data   ${RELOCATING-0} :
117    {
118      *(.rela.data)
119      ${RELOCATING+*(.rela.data.*)}
120      ${RELOCATING+*(.rela.gnu.linkonce.d*)}
121    }
122  .rel.ctors   ${RELOCATING-0} : { *(.rel.ctors)        }
123  .rela.ctors  ${RELOCATING-0} : { *(.rela.ctors)       }
124  .rel.dtors   ${RELOCATING-0} : { *(.rel.dtors)        }
125  .rela.dtors  ${RELOCATING-0} : { *(.rela.dtors)       }
126  .rel.got     ${RELOCATING-0} : { *(.rel.got)          }
127  .rela.got    ${RELOCATING-0} : { *(.rela.got)         }
128  .rel.bss     ${RELOCATING-0} : { *(.rel.bss)          }
129  .rela.bss    ${RELOCATING-0} : { *(.rela.bss)         }
130  .rel.plt     ${RELOCATING-0} : { *(.rel.plt)          }
131  .rela.plt    ${RELOCATING-0} : { *(.rela.plt)         }
132
133  /* Internal text space.  */
134  .text :
135  {
136    ${RELOCATING+. = ALIGN(2);}
137    *(SORT_NONE(.init))
138    *(SORT_NONE(.init0))  /* Start here after reset.  */
139    *(SORT_NONE(.init1))
140    *(SORT_NONE(.init2))  /* Copy data loop  */
141    *(SORT_NONE(.init3))
142    *(SORT_NONE(.init4))  /* Clear bss  */
143    *(SORT_NONE(.init5))
144    *(SORT_NONE(.init6))  /* C++ constructors.  */
145    *(SORT_NONE(.init7))
146    *(SORT_NONE(.init8))
147    *(SORT_NONE(.init9))  /* Call main().  */
148
149    ${CONSTRUCTING+ __ctors_start = . ; }
150    ${CONSTRUCTING+ *(.ctors) }
151    ${CONSTRUCTING+ __ctors_end = . ; }
152    ${CONSTRUCTING+ __dtors_start = . ; }
153    ${CONSTRUCTING+ *(.dtors) }
154    ${CONSTRUCTING+ __dtors_end = . ; }
155
156    ${RELOCATING+. = ALIGN(2);}
157    *(.lower.text.* .lower.text)
158
159    ${RELOCATING+. = ALIGN(2);}
160    *(.text)
161    ${RELOCATING+. = ALIGN(2);}
162    *(.text.*)
163    ${RELOCATING+. = ALIGN(2);}
164    *(.text:*)
165
166    *(.either.text.* .either.text)
167
168    ${RELOCATING+. = ALIGN(2);}
169    *(SORT_NONE(.fini9))
170    *(SORT_NONE(.fini8))
171    *(SORT_NONE(.fini7))
172    *(SORT_NONE(.fini6))  /* C++ destructors.  */
173    *(SORT_NONE(.fini5))
174    *(SORT_NONE(.fini4))
175    *(SORT_NONE(.fini3))
176    *(SORT_NONE(.fini2))
177    *(SORT_NONE(.fini1))
178    *(SORT_NONE(.fini0))  /* Infinite loop after program termination.  */
179    *(SORT_NONE(.fini))
180
181    _etext = .;
182  } ${RELOCATING+ > text}
183
184  .rodata :
185  {
186    ${RELOCATING+. = ALIGN(2);}
187    *(.lower.rodata.* .lower.rodata)
188
189    . = ALIGN(2);
190    *(.plt)
191    *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*)
192    *(.rodata1)
193
194    *(.either.rodata.*) *(.either.rodata)
195    *(.eh_frame_hdr)
196    KEEP (*(.eh_frame))
197
198    KEEP (*(.gcc_except_table)) *(.gcc_except_table.*)
199
200    PROVIDE (__preinit_array_start = .);
201    KEEP (*(.preinit_array))
202    PROVIDE (__preinit_array_end = .);
203
204    PROVIDE (__init_array_start = .);
205    KEEP (*(SORT(.init_array.*)))
206    KEEP (*(.init_array))
207    PROVIDE (__init_array_end = .);
208
209    PROVIDE (__fini_array_start = .);
210    KEEP (*(.fini_array))
211    KEEP (*(SORT(.fini_array.*)))
212    PROVIDE (__fini_array_end = .);
213
214    /* gcc uses crtbegin.o to find the start of the constructors, so
215       we make sure it is first.  Because this is a wildcard, it
216       doesn't matter if the user does not actually link against
217       crtbegin.o; the linker won't look for a file to match a
218       wildcard.  The wildcard also means that it doesn't matter which
219       directory crtbegin.o is in.  */
220    KEEP (*crtbegin*.o(.ctors))
221
222    /* We don't want to include the .ctor section from from the
223       crtend.o file until after the sorted ctors.  The .ctor section
224       from the crtend file contains the end of ctors marker and it
225       must be last */
226    KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
227    KEEP (*(SORT(.ctors.*)))
228    KEEP (*(.ctors))
229
230    KEEP (*crtbegin*.o(.dtors))
231    KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
232    KEEP (*(SORT(.dtors.*)))
233    KEEP (*(.dtors))
234  } ${RELOCATING+ > text}
235
236  .vectors ${RELOCATING-0}:
237  {
238    ${RELOCATING+ PROVIDE (__vectors_start = .) ; }
239    *(.vectors*)
240    ${RELOCATING+ _vectors_end = . ; }
241  } ${RELOCATING+ > vectors}
242
243  .data ${RELOCATING-0} :
244  {
245    ${RELOCATING+ PROVIDE (__data_start = .) ; }
246    ${RELOCATING+ PROVIDE (__datastart = .) ; }
247    ${RELOCATING+. = ALIGN(2);}
248
249    KEEP (*(.jcr))
250    *(.data.rel.ro.local) *(.data.rel.ro*)
251    *(.dynamic)
252
253    ${RELOCATING+. = ALIGN(2);}
254    *(.lower.data.* .lower.data)
255
256    *(.data)
257    *(.data.*)
258    *(.gnu.linkonce.d*)
259    KEEP (*(.gnu.linkonce.d.*personality*))
260    *(.data1)
261
262    *(.either.data.* .either.data)
263
264    *(.got.plt) *(.got)
265    ${RELOCATING+. = ALIGN(2);}
266    *(.sdata .sdata.* .gnu.linkonce.s.*)
267    ${RELOCATING+. = ALIGN(2);}
268    ${RELOCATING+ _edata = . ; }
269  } ${RELOCATING+ > data ${RELOCATING+AT> text}}
270
271  __romdatastart = LOADADDR(.data);
272  __romdatacopysize = SIZEOF(.data);
273
274  .bss ${RELOCATING+ SIZEOF(.data) + ADDR(.data)} :
275  {
276    ${RELOCATING+. = ALIGN(2);}
277    ${RELOCATING+ PROVIDE (__bss_start = .); }
278    ${RELOCATING+ PROVIDE (__bssstart = .); }
279    *(.lower.bss.* .lower.bss)
280    ${RELOCATING+. = ALIGN(2);}
281    *(.bss)
282    *(.either.bss.* .either.bss)
283    *(COMMON)
284    ${RELOCATING+ PROVIDE (__bss_end = .) ; }
285  } ${RELOCATING+ > data}
286  ${RELOCATING+ PROVIDE (__bsssize = SIZEOF(.bss)); }
287
288  .noinit ${RELOCATING+ SIZEOF(.bss) + ADDR(.bss)} :
289  {
290    ${RELOCATING+ PROVIDE (__noinit_start = .) ; }
291    *(.noinit)
292    ${RELOCATING+ PROVIDE (__noinit_end = .) ; }
293  } ${RELOCATING+ > data}
294
295  .persistent ${RELOCATING+ SIZEOF(.noinit) + ADDR(.noinit)} :
296  {
297    ${RELOCATING+ PROVIDE (__persistent_start = .) ; }
298    *(.persistent)
299    ${RELOCATING+ PROVIDE (__persistent_end = .) ; }
300  } ${RELOCATING+ > data}
301
302  ${RELOCATING+ _end = . ;  }
303  ${HEAP_SECTION_MSP430}
304
305  /* Stabs for profiling information*/
306  .profiler 0 : { *(.profiler) }
307
308  /* Stabs debugging sections.  */
309  .stab 0 : { *(.stab) }
310  .stabstr 0 : { *(.stabstr) }
311  .stab.excl 0 : { *(.stab.excl) }
312  .stab.exclstr 0 : { *(.stab.exclstr) }
313  .stab.index 0 : { *(.stab.index) }
314  .stab.indexstr 0 : { *(.stab.indexstr) }
315  .comment 0 : { *(.comment) }
316EOF
317
318. $srcdir/scripttempl/DWARF.sc
319
320cat <<EOF
321  .MSP430.attributes 0 :
322  {
323    KEEP (*(.MSP430.attributes))
324    KEEP (*(.gnu.attributes))
325    KEEP (*(__TI_build_attributes))
326  }
327
328  PROVIDE (__stack = ${STACK}) ;
329  PROVIDE (__data_start_rom = _etext) ;
330  PROVIDE (__data_end_rom   = _etext + SIZEOF (.data)) ;
331  PROVIDE (__noinit_start_rom = _etext + SIZEOF (.data)) ;
332  PROVIDE (__noinit_end_rom = _etext + SIZEOF (.data) + SIZEOF (.noinit)) ;
333  PROVIDE (__subdevice_has_heap = ${GOT_HEAP_MSP-0}) ;
334}
335EOF
336