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