Re-add support for lbarx, lharx, stbcx. and sthcx. insns back to the E6500 cpu.
[binutils-gdb.git] / ld / scripttempl / elf32msp430.sc
blobdda82ff2a30909fe460532ff9cbf9cab56fbcc4a
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.
7 HEAP_SECTION_MSP430=" "
8 HEAP_MEMORY_MSP430=" "
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"
25 cat <<EOF
26 /* Copyright (C) 2014-2016 Free Software Foundation, Inc.
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.  */
32 OUTPUT_FORMAT("${OUTPUT_FORMAT}","${OUTPUT_FORMAT}","${OUTPUT_FORMAT}")
33 OUTPUT_ARCH(${ARCH})
35 MEMORY
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}
46 SECTIONS
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}
65   /* Information memory (not loaded into MPU).  */
66   .infomemnobits ${RELOCATING-0} :
67   {
68     *(.infomemnobits)
69     ${RELOCATING+. = ALIGN(2);}
70     *(.infomemnobits.*)
71   } ${RELOCATING+ > infomemnobits}
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)  }
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)         }
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().  */
149     ${CONSTRUCTING+ __ctors_start = . ; }
150     ${CONSTRUCTING+ *(.ctors) }
151     ${CONSTRUCTING+ __ctors_end = . ; }
152     ${CONSTRUCTING+ __dtors_start = . ; }
153     ${CONSTRUCTING+ *(.dtors) }
154     ${CONSTRUCTING+ __dtors_end = . ; }
156     ${RELOCATING+. = ALIGN(2);}
157     *(.lower.text.* .lower.text)
159     ${RELOCATING+. = ALIGN(2);}
160     *(.text)
161     ${RELOCATING+. = ALIGN(2);}
162     *(.text.*)
163     ${RELOCATING+. = ALIGN(2);}
164     *(.text:*)
166     *(.either.text.* .either.text)
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))
181     _etext = .;
182   } ${RELOCATING+ > text}
184   .rodata :
185   {
186     ${RELOCATING+. = ALIGN(2);}
187     *(.lower.rodata.* .lower.rodata)
189     . = ALIGN(2);
190     *(.plt)
191     *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*)
192     *(.rodata1)
194     *(.either.rodata.*) *(.either.rodata)
195     *(.eh_frame_hdr)
196     KEEP (*(.eh_frame))
198     KEEP (*(.gcc_except_table)) *(.gcc_except_table.*)
200     PROVIDE (__preinit_array_start = .);
201     KEEP (*(.preinit_array))
202     PROVIDE (__preinit_array_end = .);
204     PROVIDE (__init_array_start = .);
205     KEEP (*(SORT(.init_array.*)))
206     KEEP (*(.init_array))
207     PROVIDE (__init_array_end = .);
209     PROVIDE (__fini_array_start = .);
210     KEEP (*(.fini_array))
211     KEEP (*(SORT(.fini_array.*)))
212     PROVIDE (__fini_array_end = .);
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))
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))
230     KEEP (*crtbegin*.o(.dtors))
231     KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
232     KEEP (*(SORT(.dtors.*)))
233     KEEP (*(.dtors))
234   } ${RELOCATING+ > text}
236   .vectors ${RELOCATING-0}:
237   {
238     ${RELOCATING+ PROVIDE (__vectors_start = .) ; }
239     *(.vectors*)
240     ${RELOCATING+ _vectors_end = . ; }
241   } ${RELOCATING+ > vectors}
243   .data ${RELOCATING-0} :
244   {
245     ${RELOCATING+ PROVIDE (__data_start = .) ; }
246     ${RELOCATING+ PROVIDE (__datastart = .) ; }
247     ${RELOCATING+. = ALIGN(2);}
249     KEEP (*(.jcr))
250     *(.data.rel.ro.local) *(.data.rel.ro*)
251     *(.dynamic)
253     ${RELOCATING+. = ALIGN(2);}
254     *(.lower.data.* .lower.data)
256     *(.data)
257     *(.data.*)
258     *(.gnu.linkonce.d*)
259     KEEP (*(.gnu.linkonce.d.*personality*))
260     *(.data1)
262     *(.either.data.* .either.data)
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}}
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)); }
288   .noinit ${RELOCATING+ SIZEOF(.bss) + ADDR(.bss)} :
289   {
290     ${RELOCATING+ PROVIDE (__noinit_start = .) ; }
291     *(.noinit)
292     ${RELOCATING+ PROVIDE (__noinit_end = .) ; }
293   } ${RELOCATING+ > data}
295   .persistent ${RELOCATING+ SIZEOF(.noinit) + ADDR(.noinit)} :
296   {
297     ${RELOCATING+ PROVIDE (__persistent_start = .) ; }
298     *(.persistent)
299     ${RELOCATING+ PROVIDE (__persistent_end = .) ; }
300   } ${RELOCATING+ > data}
302   ${RELOCATING+ _end = . ;  }
303   ${HEAP_SECTION_MSP430}
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) }
318 . $srcdir/scripttempl/DWARF.sc
320 cat <<EOF
321   .MSP430.attributes 0 :
322   {
323     KEEP (*(.MSP430.attributes))
324     KEEP (*(.gnu.attributes))
325     KEEP (*(__TI_build_attributes))
326   }
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}) ;