1# Copyright (C) 2014 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
7cat <<EOF
8/* Copyright (C) 2014 Free Software Foundation, Inc.
9
10   Copying and distribution of this script, with or without modification,
11   are permitted in any medium without royalty provided the copyright
12   notice and this notice are preserved.  */
13
14OUTPUT_FORMAT("${OUTPUT_FORMAT}","${OUTPUT_FORMAT}","${OUTPUT_FORMAT}")
15OUTPUT_ARCH(${ARCH})
16
17MEMORY
18{
19  text   (rx)   : ORIGIN = $TEXT_ORIGIN, LENGTH = $TEXT_LENGTH
20  data   (rw!x) : ORIGIN = $DATA_ORIGIN, LENGTH = $DATA_LENGTH
21
22  /* Provide offsets for config, lock and signature to match
23     production file format. Ignore offsets in datasheet.  */
24
25  config    (rw!x) : ORIGIN = 0x820000, LENGTH = 2
26  lock      (rw!x) : ORIGIN = 0x830000, LENGTH = 2
27  signature (rw!x) : ORIGIN = 0x840000, LENGTH = 4
28}
29
30SECTIONS
31{
32  /* Read-only sections, merged into text segment: */
33  ${TEXT_DYNAMIC+${DYNAMIC}}
34  .hash        ${RELOCATING-0} : { *(.hash)		}
35  .dynsym      ${RELOCATING-0} : { *(.dynsym)		}
36  .dynstr      ${RELOCATING-0} : { *(.dynstr)		}
37  .gnu.version ${RELOCATING-0} : { *(.gnu.version)	}
38  .gnu.version_d ${RELOCATING-0} : { *(.gnu.version_d)	}
39  .gnu.version_r ${RELOCATING-0} : { *(.gnu.version_r)	}
40
41  .rel.init    ${RELOCATING-0} : { *(.rel.init)	}
42  .rela.init   ${RELOCATING-0} : { *(.rela.init)	}
43  .rel.text    ${RELOCATING-0} :
44    {
45      *(.rel.text)
46      ${RELOCATING+*(.rel.text.*)}
47      ${RELOCATING+*(.rel.gnu.linkonce.t*)}
48    }
49  .rela.text   ${RELOCATING-0} :
50    {
51      *(.rela.text)
52      ${RELOCATING+*(.rela.text.*)}
53      ${RELOCATING+*(.rela.gnu.linkonce.t*)}
54    }
55  .rel.fini    ${RELOCATING-0} : { *(.rel.fini)	}
56  .rela.fini   ${RELOCATING-0} : { *(.rela.fini)	}
57  .rel.rodata  ${RELOCATING-0} :
58    {
59      *(.rel.rodata)
60      ${RELOCATING+*(.rel.rodata.*)}
61      ${RELOCATING+*(.rel.gnu.linkonce.r*)}
62    }
63  .rela.rodata ${RELOCATING-0} :
64    {
65      *(.rela.rodata)
66      ${RELOCATING+*(.rela.rodata.*)}
67      ${RELOCATING+*(.rela.gnu.linkonce.r*)}
68    }
69  .rel.data    ${RELOCATING-0} :
70    {
71      *(.rel.data)
72      ${RELOCATING+*(.rel.data.*)}
73      ${RELOCATING+*(.rel.gnu.linkonce.d*)}
74    }
75  .rela.data   ${RELOCATING-0} :
76    {
77      *(.rela.data)
78      ${RELOCATING+*(.rela.data.*)}
79      ${RELOCATING+*(.rela.gnu.linkonce.d*)}
80    }
81  .rel.ctors   ${RELOCATING-0} : { *(.rel.ctors)	}
82  .rela.ctors  ${RELOCATING-0} : { *(.rela.ctors)	}
83  .rel.dtors   ${RELOCATING-0} : { *(.rel.dtors)	}
84  .rela.dtors  ${RELOCATING-0} : { *(.rela.dtors)	}
85  .rel.got     ${RELOCATING-0} : { *(.rel.got)		}
86  .rela.got    ${RELOCATING-0} : { *(.rela.got)	}
87  .rel.bss     ${RELOCATING-0} : { *(.rel.bss)		}
88  .rela.bss    ${RELOCATING-0} : { *(.rela.bss)	}
89  .rel.plt     ${RELOCATING-0} : { *(.rel.plt)		}
90  .rela.plt    ${RELOCATING-0} : { *(.rela.plt)	}
91
92  /* Internal text space or external memory.  */
93  .text ${RELOCATING-0} : ${RELOCATING+ AT (0x0)}
94  {
95    *(.vectors)
96    KEEP(*(.vectors))
97
98    /* For data that needs to reside in the lower 64k of progmem.  */
99    ${RELOCATING+ *(.progmem.gcc*)}
100
101    /* PR 13812: Placing the trampolines here gives a better chance
102       that they will be in range of the code that uses them.  */
103    ${RELOCATING+. = ALIGN(2);}
104    ${CONSTRUCTING+ __trampolines_start = . ; }
105    /* The jump trampolines for the 16-bit limited relocs will reside here.  */
106    *(.trampolines)
107    ${RELOCATING+ *(.trampolines*)}
108    ${CONSTRUCTING+ __trampolines_end = . ; }
109
110    ${RELOCATING+ *(.progmem*)}
111
112    ${RELOCATING+. = ALIGN(2);}
113
114    /* For future tablejump instruction arrays for 3 byte pc devices.
115       We don't relax jump/call instructions within these sections.  */
116    *(.jumptables)
117    ${RELOCATING+ *(.jumptables*)}
118
119    /* For code that needs to reside in the lower 128k progmem.  */
120    *(.lowtext)
121    ${RELOCATING+ *(.lowtext*)}
122
123    ${CONSTRUCTING+ __ctors_start = . ; }
124    ${CONSTRUCTING+ *(.ctors) }
125    ${CONSTRUCTING+ __ctors_end = . ; }
126    ${CONSTRUCTING+ __dtors_start = . ; }
127    ${CONSTRUCTING+ *(.dtors) }
128    ${CONSTRUCTING+ __dtors_end = . ; }
129    KEEP(SORT(*)(.ctors))
130    KEEP(SORT(*)(.dtors))
131
132    /* From this point on, we don't bother about wether the insns are
133       below or above the 16 bits boundary.  */
134    *(.init0)  /* Start here after reset.  */
135    KEEP (*(.init0))
136    *(.init1)
137    KEEP (*(.init1))
138    *(.init2)  /* Clear __zero_reg__, set up stack pointer.  */
139    KEEP (*(.init2))
140    *(.init3)
141    KEEP (*(.init3))
142    *(.init4)  /* Initialize data and BSS.  */
143    KEEP (*(.init4))
144    *(.init5)
145    KEEP (*(.init5))
146    *(.init6)  /* C++ constructors.  */
147    KEEP (*(.init6))
148    *(.init7)
149    KEEP (*(.init7))
150    *(.init8)
151    KEEP (*(.init8))
152    *(.init9)  /* Call main().  */
153    KEEP (*(.init9))
154    *(.text)
155    ${RELOCATING+. = ALIGN(2);}
156    ${RELOCATING+ *(.text.*)}
157    ${RELOCATING+. = ALIGN(2);}
158    *(.fini9)  /* _exit() starts here.  */
159    KEEP (*(.fini9))
160    *(.fini8)
161    KEEP (*(.fini8))
162    *(.fini7)
163    KEEP (*(.fini7))
164    *(.fini6)  /* C++ destructors.  */
165    KEEP (*(.fini6))
166    *(.fini5)
167    KEEP (*(.fini5))
168    *(.fini4)
169    KEEP (*(.fini4))
170    *(.fini3)
171    KEEP (*(.fini3))
172    *(.fini2)
173    KEEP (*(.fini2))
174    *(.fini1)
175    KEEP (*(.fini1))
176    *(.fini0)  /* Infinite loop after program termination.  */
177    KEEP (*(.fini0))
178    ${RELOCATING+ _etext = . ; }
179  } ${RELOCATING+ > text}
180
181  .data        ${RELOCATING-0} :
182  {
183    ${RELOCATING+ PROVIDE (__data_start = .) ; }
184    *(.data)
185    ${RELOCATING+ *(.data*)}
186    *(.rodata)  /* We need to include .rodata here if gcc is used */
187    ${RELOCATING+ *(.rodata*)} /* with -fdata-sections.  */
188    *(.gnu.linkonce.d*)
189    ${RELOCATING+. = ALIGN(2);}
190    ${RELOCATING+ _edata = . ; }
191    ${RELOCATING+ PROVIDE (__data_end = .) ; }
192  } ${RELOCATING+ > data ${RELOCATING+AT> text}}
193
194  .bss ${RELOCATING+ ADDR(.data) + SIZEOF (.data)} ${RELOCATING-0} :${RELOCATING+ AT (ADDR (.bss))}
195  {
196    ${RELOCATING+ PROVIDE (__bss_start = .) ; }
197    *(.bss)
198    ${RELOCATING+ *(.bss*)}
199    *(COMMON)
200    ${RELOCATING+ PROVIDE (__bss_end = .) ; }
201  } ${RELOCATING+ > data}
202
203  ${RELOCATING+ __data_load_start = LOADADDR(.data); }
204  ${RELOCATING+ __data_load_end = __data_load_start + SIZEOF(.data); }
205
206  /* Global data not cleared after reset.  */
207  .noinit ${RELOCATING-0}:
208  {
209    ${RELOCATING+ PROVIDE (__noinit_start = .) ; }
210    *(.noinit*)
211    ${RELOCATING+ PROVIDE (__noinit_end = .) ; }
212    ${RELOCATING+ _end = . ;  }
213    ${RELOCATING+ PROVIDE (__heap_start = .) ; }
214  } ${RELOCATING+ > data}
215
216  .lock ${RELOCATING-0}:
217  {
218    KEEP(*(.lock*))
219  } ${RELOCATING+ > lock}
220
221  .signature ${RELOCATING-0}:
222  {
223    KEEP(*(.signature*))
224  } ${RELOCATING+ > signature}
225
226  .config ${RELOCATING-0}:
227  {
228    KEEP(*(.config*))
229  } ${RELOCATING+ > config}
230
231  /* Stabs debugging sections.  */
232  .stab 0 : { *(.stab) }
233  .stabstr 0 : { *(.stabstr) }
234  .stab.excl 0 : { *(.stab.excl) }
235  .stab.exclstr 0 : { *(.stab.exclstr) }
236  .stab.index 0 : { *(.stab.index) }
237  .stab.indexstr 0 : { *(.stab.indexstr) }
238  .comment 0 : { *(.comment) }
239  .note.gnu.build-id : { *(.note.gnu.build-id) }
240EOF
241
242. $srcdir/scripttempl/DWARF.sc
243
244cat <<EOF
245}
246EOF
247