source: rtems/c/src/lib/libbsp/arm/shared/startup/linkcmds.base @ 0d671d70

4.11
Last change on this file since 0d671d70 was 0d671d70, checked in by Sebastian Huber <sebastian.huber@…>, on May 27, 2013 at 10:43:53 AM

bsps/arm: Move .fast_text section

Move the .fast_text section after the .vector section. The .fast_test
section is normally not empty in case some functions should execute from
an internal SRAM. This would be also the area for the .vector section.
The vector table must be the first content of such an area.

  • Property mode set to 100644
File size: 13.3 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup bsp_linker
5 *
6 * @brief Linker command base file.
7 */
8
9/*
10 * Copyright (c) 2008-2013 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Obere Lagerstr. 30
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.com/license/LICENSE.
21 */
22
23OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
24
25OUTPUT_ARCH (arm)
26
27ENTRY (_start)
28
29/*
30 * Global symbols that may be defined externally
31 */
32
33bsp_vector_table_size = DEFINED (bsp_vector_table_size) ? bsp_vector_table_size : 64;
34
35bsp_section_xbarrier_align = DEFINED (bsp_section_xbarrier_align) ? bsp_section_xbarrier_align : 1;
36bsp_section_robarrier_align = DEFINED (bsp_section_robarrier_align) ? bsp_section_robarrier_align : 1;
37bsp_section_rwbarrier_align = DEFINED (bsp_section_rwbarrier_align) ? bsp_section_rwbarrier_align : 1;
38
39bsp_stack_align = DEFINED (bsp_stack_align) ? bsp_stack_align : 8;
40
41bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 0;
42bsp_stack_abt_size = ALIGN (bsp_stack_abt_size, bsp_stack_align);
43
44bsp_stack_fiq_size = DEFINED (bsp_stack_fiq_size) ? bsp_stack_fiq_size : 0;
45bsp_stack_fiq_size = ALIGN (bsp_stack_fiq_size, bsp_stack_align);
46
47bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 0;
48bsp_stack_irq_size = ALIGN (bsp_stack_irq_size, bsp_stack_align);
49
50bsp_stack_svc_size = DEFINED (bsp_stack_svc_size) ? bsp_stack_svc_size : 0;
51bsp_stack_svc_size = ALIGN (bsp_stack_svc_size, bsp_stack_align);
52
53bsp_stack_und_size = DEFINED (bsp_stack_und_size) ? bsp_stack_und_size : 0;
54bsp_stack_und_size = ALIGN (bsp_stack_und_size, bsp_stack_align);
55
56bsp_stack_main_size = DEFINED (bsp_stack_main_size) ? bsp_stack_main_size : 0;
57bsp_stack_main_size = ALIGN (bsp_stack_main_size, bsp_stack_align);
58
59MEMORY {
60        UNEXPECTED_SECTIONS : ORIGIN = 0xffffffff, LENGTH = 0
61}
62
63SECTIONS {
64        .start : {
65                bsp_section_start_begin = .;
66                KEEP (*(.bsp_start_text))
67                KEEP (*(.bsp_start_data))
68                bsp_section_start_end = .;
69        } > REGION_START AT > REGION_START
70        bsp_section_start_size = bsp_section_start_end - bsp_section_start_begin;
71
72        .xbarrier : {
73                . = ALIGN (bsp_section_xbarrier_align);
74        } > REGION_VECTOR
75
76        .text : ALIGN(32) {
77                bsp_section_text_begin = .;
78
79                /* .text */
80                *(.text.unlikely .text.*_unlikely)
81                *(.text .stub .text.* .gnu.linkonce.t.*)
82                /* .gnu.warning sections are handled specially by elf32.em.  */
83                *(.gnu.warning)
84                *(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx)
85
86                /* .init */
87                KEEP (*(.init))
88
89                /* .fini */
90                KEEP (*(.fini))
91
92                bsp_section_text_end = .;
93        } > REGION_TEXT AT > REGION_TEXT_LOAD
94        bsp_section_text_size = bsp_section_text_end - bsp_section_text_begin;
95        bsp_section_text_load_begin = LOADADDR (.text);
96        bsp_section_text_load_end = bsp_section_text_load_begin + bsp_section_text_size;
97
98        .robarrier : {
99                . = ALIGN (bsp_section_robarrier_align);
100        } > REGION_RODATA
101
102        .rodata : ALIGN(32) {
103                bsp_section_rodata_begin = .;
104
105                /* .rodata */
106                *(.rodata .rodata.* .gnu.linkonce.r.*)
107
108                /* .rodata1 */
109                *(.rodata1)
110
111                /* .ARM.extab */
112                *(.ARM.extab* .gnu.linkonce.armextab.*)
113
114                /* .eh_frame */
115                KEEP (*(.eh_frame))
116
117                /* .gcc_except_table */
118                *(.gcc_except_table .gcc_except_table.*)
119
120                /* .tdata */
121                *(.tdata .tdata.* .gnu.linkonce.td.*)
122
123                /* .tbss */
124                *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
125
126                /* .preinit_array */
127                PROVIDE_HIDDEN (__preinit_array_start = .);
128                KEEP (*(.preinit_array))
129                PROVIDE_HIDDEN (__preinit_array_end = .);
130
131                /* .init_array */
132                PROVIDE_HIDDEN (__init_array_start = .);
133                KEEP (*(SORT(.init_array.*)))
134                KEEP (*(.init_array))
135                PROVIDE_HIDDEN (__init_array_end = .);
136
137                /* .fini_array */
138                PROVIDE_HIDDEN (__fini_array_start = .);
139                KEEP (*(.fini_array))
140                KEEP (*(SORT(.fini_array.*)))
141                PROVIDE_HIDDEN (__fini_array_end = .);
142
143                /* .ctors */
144                /* gcc uses crtbegin.o to find the start of
145                   the constructors, so we make sure it is
146                   first.  Because this is a wildcard, it
147                   doesn't matter if the user does not
148                   actually link against crtbegin.o; the
149                   linker won't look for a file to match a
150                   wildcard.  The wildcard also means that it
151                   doesn't matter which directory crtbegin.o
152                   is in.  */
153                KEEP (*crtbegin.o(.ctors))
154                KEEP (*crtbegin?.o(.ctors))
155                /* We don't want to include the .ctor section from
156                   the crtend.o file until after the sorted ctors.
157                   The .ctor section from the crtend file contains the
158                   end of ctors marker and it must be last */
159                KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
160                KEEP (*(SORT(.ctors.*)))
161                KEEP (*(.ctors))
162
163                /* .dtors */
164                KEEP (*crtbegin.o(.dtors))
165                KEEP (*crtbegin?.o(.dtors))
166                KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
167                KEEP (*(SORT(.dtors.*)))
168                KEEP (*(.dtors))
169
170                /* .data.rel.ro */
171                *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*)
172                *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*)
173
174                /* .jcr */
175                KEEP (*(.jcr))
176
177                /* .dynamic */
178                *(.dynamic)
179
180                /* .got */
181                *(.got.plt) *(.igot.plt) *(.got) *(.igot)
182
183                /* .interp */
184                *(.interp)
185
186                /* .note.gnu.build-id */
187                *(.note.gnu.build-id)
188
189                /* .hash */
190                *(.hash)
191
192                /* .gnu.hash */
193                *(.gnu.hash)
194
195                /* .dynsym */
196                *(.dynsym)
197
198                /* .dynstr */
199                *(.dynstr)
200
201                /* .gnu.version */
202                *(.gnu.version)
203
204                /* .gnu.version_d */
205                *(.gnu.version_d)
206
207                /* .gnu.version_r */
208                *(.gnu.version_r)
209
210                /* .rel.dyn */
211                *(.rel.init)
212                *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
213                *(.rel.fini)
214                *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
215                *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
216                *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
217                *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
218                *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
219                *(.rel.ctors)
220                *(.rel.dtors)
221                *(.rel.got)
222                *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
223                PROVIDE_HIDDEN (__rel_iplt_start = .);
224                *(.rel.iplt)
225                PROVIDE_HIDDEN (__rel_iplt_end = .);
226                PROVIDE_HIDDEN (__rela_iplt_start = .);
227                PROVIDE_HIDDEN (__rela_iplt_end = .);
228
229                /* .rela.dyn */
230                *(.rela.init)
231                *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
232                *(.rela.fini)
233                *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
234                *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
235                *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
236                *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
237                *(.rela.ctors)
238                *(.rela.dtors)
239                *(.rela.got)
240                *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
241                PROVIDE_HIDDEN (__rel_iplt_start = .);
242                PROVIDE_HIDDEN (__rel_iplt_end = .);
243                PROVIDE_HIDDEN (__rela_iplt_start = .);
244                *(.rela.iplt)
245                PROVIDE_HIDDEN (__rela_iplt_end = .);
246
247                /* .rel.plt */
248                *(.rel.plt)
249
250                /* .rela.plt */
251                *(.rela.plt)
252
253                /* .plt */
254                *(.plt)
255
256                /* .iplt */
257                *(.iplt)
258
259                /* Special FreeBSD linker set sections */
260                __start_set_sysctl_set = .;
261                *(set_sysctl_*);
262                __stop_set_sysctl_set = .;
263                *(set_domain_*);
264                *(set_pseudo_*);
265                _bsd__start_set_modmetadata_set = .;
266                *(_bsd_set_modmetadata_set);
267                _bsd__stop_set_modmetadata_set = .;
268                _bsd__start_set_sysctl_set = .;
269                *(_bsd_set_sysctl_set);
270                _bsd__stop_set_sysctl_set = .;
271
272                bsp_section_rodata_end = .;
273        } > REGION_RODATA AT > REGION_RODATA_LOAD
274        bsp_section_rodata_size = bsp_section_rodata_end - bsp_section_rodata_begin;
275        bsp_section_rodata_load_begin = LOADADDR (.rodata);
276        bsp_section_rodata_load_end = bsp_section_rodata_load_begin + bsp_section_rodata_size;
277
278        .ARM.exidx : ALIGN(32) {
279                bsp_section_armexidx_begin = .;
280
281                /* .ARM.exidx */
282                __exidx_start = .;
283                *(.ARM.exidx* .gnu.linkonce.armexidx.*)
284                __exidx_end = .;
285
286                bsp_section_armexidx_end = .;
287        } > REGION_RODATA AT > REGION_RODATA_LOAD
288        bsp_section_armexidx_size = bsp_section_armexidx_end - bsp_section_armexidx_begin;
289        bsp_section_armexidx_load_begin = LOADADDR (.ARM.exidx);
290        bsp_section_armexidx_load_end = bsp_section_armexidx_load_begin + bsp_section_armexidx_size;
291
292        .rwbarrier : {
293                . = ALIGN (bsp_section_rwbarrier_align);
294        } > REGION_DATA
295
296        .vector : {
297                bsp_section_vector_begin = .;
298
299                . = . + DEFINED (bsp_vector_table_in_start_section) ? 0 : bsp_vector_table_size;
300
301                . = ALIGN (bsp_stack_align);
302
303                bsp_stack_abt_begin = .;
304                . = . + bsp_stack_abt_size;
305                bsp_stack_abt_end = .;
306
307                bsp_stack_fiq_begin = .;
308                . = . + bsp_stack_fiq_size;
309                bsp_stack_fiq_end = .;
310
311                bsp_stack_irq_begin = .;
312                . = . + bsp_stack_irq_size;
313                bsp_stack_irq_end = .;
314
315                bsp_stack_svc_begin = .;
316                . = . + bsp_stack_svc_size;
317                bsp_stack_svc_end = .;
318
319                bsp_stack_und_begin = .;
320                . = . + bsp_stack_und_size;
321                bsp_stack_und_end = .;
322
323                bsp_stack_main_begin = .;
324                . = . + bsp_stack_main_size;
325                bsp_stack_main_end = .;
326
327                *(.bsp_vector)
328
329                bsp_section_vector_end = .;
330        } > REGION_VECTOR AT > REGION_VECTOR
331        bsp_section_vector_size = bsp_section_vector_end - bsp_section_vector_begin;
332        bsp_vector_table_begin = DEFINED (bsp_vector_table_in_start_section) ? bsp_section_start_begin : bsp_section_vector_begin;
333        bsp_vector_table_end = bsp_vector_table_begin + bsp_vector_table_size;
334
335        .fast_text : {
336                bsp_section_fast_text_begin = .;
337                *(.bsp_fast_text)
338                bsp_section_fast_text_end = .;
339        } > REGION_FAST_TEXT AT > REGION_FAST_TEXT_LOAD
340        bsp_section_fast_text_size = bsp_section_fast_text_end - bsp_section_fast_text_begin;
341        bsp_section_fast_text_load_begin = LOADADDR (.fast_text);
342        bsp_section_fast_text_load_end = bsp_section_fast_text_load_begin + bsp_section_fast_text_size;
343
344        .fast_data : ALIGN(32) {
345                bsp_section_fast_data_begin = .;
346                *(.bsp_fast_data)
347                bsp_section_fast_data_end = .;
348        } > REGION_FAST_DATA AT > REGION_FAST_DATA_LOAD
349        bsp_section_fast_data_size = bsp_section_fast_data_end - bsp_section_fast_data_begin;
350        bsp_section_fast_data_load_begin = LOADADDR (.fast_data);
351        bsp_section_fast_data_load_end = bsp_section_fast_data_load_begin + bsp_section_fast_data_size;
352
353        .data : ALIGN(32) {
354                bsp_section_data_begin = .;
355
356                /* .data */
357                *(.data .data.* .gnu.linkonce.d.*)
358                SORT(CONSTRUCTORS)
359
360                /* .data1 */
361                *(.data1)
362
363                /* Special FreeBSD linker set sections */
364                _bsd__start_set_sysinit_set = .;
365                *(_bsd_set_sysinit_set);
366                _bsd__stop_set_sysinit_set = .;
367
368                bsp_section_data_end = .;
369        } > REGION_DATA AT > REGION_DATA_LOAD
370        bsp_section_data_size = bsp_section_data_end - bsp_section_data_begin;
371        bsp_section_data_load_begin = LOADADDR (.data);
372        bsp_section_data_load_end = bsp_section_data_load_begin + bsp_section_data_size;
373
374        .bss : {
375                bsp_section_bss_begin = .;
376
377                /* .bss */
378                *(.dynbss)
379                *(.bss .bss.* .gnu.linkonce.b.*)
380                *(COMMON)
381
382                bsp_section_bss_end = .;
383        } > REGION_BSS AT > REGION_BSS
384        bsp_section_bss_size = bsp_section_bss_end - bsp_section_bss_begin;
385
386        .work : {
387                /*
388                 * The work section will occupy the remaining REGION_WORK region and
389                 * contains the RTEMS work space and heap.
390                 */
391                bsp_section_work_begin = .;
392                . += ORIGIN (REGION_WORK) + LENGTH (REGION_WORK) - ABSOLUTE (.);
393                bsp_section_work_end = .;
394        } > REGION_WORK AT > REGION_WORK
395        bsp_section_work_size = bsp_section_work_end - bsp_section_work_begin;
396
397        .stack : {
398                /*
399                 * The stack section will occupy the remaining REGION_STACK region and may
400                 * contain the task stacks.  Depending on the region distribution this
401                 * section may be of zero size.
402                 */
403                bsp_section_stack_begin = .;
404                . += ORIGIN (REGION_STACK) + LENGTH (REGION_STACK) - ABSOLUTE (.);
405                bsp_section_stack_end = .;
406        } > REGION_STACK AT > REGION_STACK
407        bsp_section_stack_size = bsp_section_stack_end - bsp_section_stack_begin;
408
409        /* FIXME */
410        RamBase = ORIGIN (REGION_WORK);
411        RamSize = LENGTH (REGION_WORK);
412        WorkAreaBase = bsp_section_work_begin;
413        HeapSize = 0;
414
415        /* Stabs debugging sections.  */
416        .stab          0 : { *(.stab) }
417        .stabstr       0 : { *(.stabstr) }
418        .stab.excl     0 : { *(.stab.excl) }
419        .stab.exclstr  0 : { *(.stab.exclstr) }
420        .stab.index    0 : { *(.stab.index) }
421        .stab.indexstr 0 : { *(.stab.indexstr) }
422        .comment       0 : { *(.comment) }
423        /* DWARF debug sections.
424           Symbols in the DWARF debugging sections are relative to the beginning
425           of the section so we begin them at 0.  */
426        /* DWARF 1 */
427        .debug          0 : { *(.debug) }
428        .line           0 : { *(.line) }
429        /* GNU DWARF 1 extensions */
430        .debug_srcinfo  0 : { *(.debug_srcinfo) }
431        .debug_sfnames  0 : { *(.debug_sfnames) }
432        /* DWARF 1.1 and DWARF 2 */
433        .debug_aranges  0 : { *(.debug_aranges) }
434        .debug_pubnames 0 : { *(.debug_pubnames) }
435        /* DWARF 2 */
436        .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
437        .debug_abbrev   0 : { *(.debug_abbrev) }
438        .debug_line     0 : { *(.debug_line) }
439        .debug_frame    0 : { *(.debug_frame) }
440        .debug_str      0 : { *(.debug_str) }
441        .debug_loc      0 : { *(.debug_loc) }
442        .debug_macinfo  0 : { *(.debug_macinfo) }
443        /* SGI/MIPS DWARF 2 extensions */
444        .debug_weaknames 0 : { *(.debug_weaknames) }
445        .debug_funcnames 0 : { *(.debug_funcnames) }
446        .debug_typenames 0 : { *(.debug_typenames) }
447        .debug_varnames  0 : { *(.debug_varnames) }
448        /* DWARF 3 */
449        .debug_pubtypes 0 : { *(.debug_pubtypes) }
450        .debug_ranges   0 : { *(.debug_ranges) }
451        /* DWARF extension */
452        .debug_macro    0 : { *(.debug_macro) }
453        .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) }
454        .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
455        /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }
456
457        /*
458         * This is a RTEMS specific section to catch all unexpected input
459         * sections.  In case you get an error like
460         *   "section `.unexpected_sections' will not fit in region
461         *   `UNEXPECTED_SECTIONS'"
462         * you have to figure out the offending input section and add it to the
463         * appropriate output section definition above.
464         */
465        .unexpected_sections : { *(*) } > UNEXPECTED_SECTIONS
466}
Note: See TracBrowser for help on using the repository browser.