PR ld/20276: Set non_ir_ref on common symbol
[external/binutils.git] / ld / scripttempl / elf32msp430.sc
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
7 HEAP_SECTION_MSP430=" "
8 HEAP_MEMORY_MSP430=" "
9
10 if test ${GOT_HEAP_MSP-0} -ne 0 
11 then 
12 HEAP_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}"
21 HEAP_MEMORY_MSP430="heap(rwx)           : ORIGIN = $HEAP_START, LENGTH = $HEAP_LENGTH"
22 fi
23
24
25 cat <<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
32 OUTPUT_FORMAT("${OUTPUT_FORMAT}","${OUTPUT_FORMAT}","${OUTPUT_FORMAT}")
33 OUTPUT_ARCH(${ARCH})
34
35 MEMORY
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
46 SECTIONS
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) }
316 EOF
317
318 . $srcdir/scripttempl/DWARF.sc
319
320 cat <<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 }
335 EOF