1 /* Linker script for Xilinx Zynq-7000\r
2 *\r
3 * Version: Sourcery CodeBench Lite 2013.11-24\r
4 * Support: https://sourcery.mentor.com/GNUToolchain/\r
5 *\r
6 * Copyright (c) 2007-2010 CodeSourcery, Inc.\r
7 * Copyright (c) 2010-2013 Mentor Graphics, Inc.\r
8 *\r
9 * The authors hereby grant permission to use, copy, modify, distribute,\r
10 * and license this software and its documentation for any purpose, provided\r
11 * that existing copyright notices are retained in all copies and that this\r
12 * notice is included verbatim in any distributions. No written agreement,\r
13 * license, or royalty fee is required for any of the authorized uses.\r
14 * Modifications to this software may be copyrighted by their authors\r
15 * and need not follow the licensing terms described here, provided that\r
16 * the new terms are clearly indicated on the first page of each file where\r
17 * they apply.\r
18 */\r
19 OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")\r
20 ENTRY(__cs3_reset)\r
21 SEARCH_DIR(.)\r
22 GROUP(-lgcc -lc -lcs3 -lcs3unhosted -lcs3arm)\r
23 \r
24 MEMORY\r
25 {\r
26 ram (rwx) : ORIGIN = 0x10000000, LENGTH = 256M\r
27 rom (rx) : ORIGIN = 0xe4000000, LENGTH = 64M\r
28 }\r
29 \r
30 /* These force the linker to search for particular symbols from\r
31 * the start of the link process and thus ensure the user's\r
32 * overrides are picked up\r
33 */\r
34 EXTERN(__cs3_reset __cs3_reset_zynq7000_ram)\r
35 EXTERN(__cs3_start_asm _start)\r
36 /* Bring in the interrupt routines & vector */\r
37 INCLUDE arm-names.inc\r
38 EXTERN(__cs3_interrupt_vector_arm)\r
39 EXTERN(__cs3_start_c main __cs3_stack __cs3_heap_end)\r
40 \r
41 /* Provide fall-back values */\r
42 PROVIDE(__cs3_heap_start = _end);\r
43 PROVIDE(__cs3_heap_end = __cs3_region_start_ram + __cs3_region_size_ram);\r
44 PROVIDE(__cs3_region_num = (__cs3_regions_end - __cs3_regions) / 20);\r
45 PROVIDE(__cs3_stack = __cs3_region_start_ram + __cs3_region_size_ram);\r
46 \r
47 SECTIONS\r
48 {\r
49 .text :\r
50 {\r
51 CREATE_OBJECT_SYMBOLS\r
52 __cs3_region_start_ram = .;\r
53 _ftext = .;\r
54 *(.cs3.region-head.ram)\r
55 ASSERT (. == __cs3_region_start_ram, ".cs3.region-head.ram not permitted");\r
56 __cs3_interrupt_vector = __cs3_interrupt_vector_arm;\r
57 *(.cs3.interrupt_vector)\r
58 /* Make sure we pulled in an interrupt vector. */\r
59 ASSERT (. != __cs3_interrupt_vector_arm, "No interrupt vector");\r
60 \r
61 PROVIDE(__cs3_reset = __cs3_reset_zynq7000_ram);\r
62 *(.cs3.reset)\r
63 _start = DEFINED(__cs3_start_asm) ? __cs3_start_asm : _start;\r
64 \r
65 *(.text.cs3.init)\r
66 *(.text .text.* .gnu.linkonce.t.*)\r
67 *(.plt)\r
68 *(.gnu.warning)\r
69 *(.glue_7t) *(.glue_7) *(.vfp11_veneer)\r
70 \r
71 *(.ARM.extab* .gnu.linkonce.armextab.*)\r
72 *(.gcc_except_table)\r
73 } >ram\r
74 .eh_frame_hdr : ALIGN (4)\r
75 {\r
76 KEEP (*(.eh_frame_hdr))\r
77 *(.eh_frame_entry .eh_frame_entry.*)\r
78 } >ram\r
79 .eh_frame : ALIGN (4)\r
80 {\r
81 KEEP (*(.eh_frame)) *(.eh_frame.*)\r
82 } >ram\r
83 /* .ARM.exidx is sorted, so has to go in its own output section. */\r
84 PROVIDE_HIDDEN (__exidx_start = .);\r
85 .ARM.exidx :\r
86 {\r
87 *(.ARM.exidx* .gnu.linkonce.armexidx.*)\r
88 } >ram\r
89 PROVIDE_HIDDEN (__exidx_end = .);\r
90 .rodata : ALIGN (4)\r
91 {\r
92 *(.rodata .rodata.* .gnu.linkonce.r.*)\r
93 \r
94 . = ALIGN(4);\r
95 KEEP(*(.init))\r
96 \r
97 . = ALIGN(4);\r
98 __preinit_array_start = .;\r
99 KEEP (*(.preinit_array))\r
100 __preinit_array_end = .;\r
101 \r
102 . = ALIGN(4);\r
103 __init_array_start = .;\r
104 KEEP (*(SORT(.init_array.*)))\r
105 KEEP (*(.init_array))\r
106 __init_array_end = .;\r
107 \r
108 . = ALIGN(4);\r
109 KEEP(*(.fini))\r
110 \r
111 . = ALIGN(4);\r
112 __fini_array_start = .;\r
113 KEEP (*(.fini_array))\r
114 KEEP (*(SORT(.fini_array.*)))\r
115 __fini_array_end = .;\r
116 \r
117 . = ALIGN(0x4);\r
118 KEEP (*crtbegin.o(.ctors))\r
119 KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\r
120 KEEP (*(SORT(.ctors.*)))\r
121 KEEP (*crtend.o(.ctors))\r
122 \r
123 . = ALIGN(0x4);\r
124 KEEP (*crtbegin.o(.dtors))\r
125 KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\r
126 KEEP (*(SORT(.dtors.*)))\r
127 KEEP (*crtend.o(.dtors))\r
128 \r
129 . = ALIGN(4);\r
130 __cs3_regions = .;\r
131 LONG (0)\r
132 LONG (__cs3_region_init_ram)\r
133 LONG (__cs3_region_start_ram)\r
134 LONG (__cs3_region_init_size_ram)\r
135 LONG (__cs3_region_zero_size_ram)\r
136 __cs3_regions_end = .;\r
137 . = ALIGN (8);\r
138 _etext = .;\r
139 } >ram\r
140 \r
141 ASSERT (!(__cs3_region_init_ram & 7), "__cs3_region_init_ram not aligned")\r
142 ASSERT (!(__cs3_region_start_ram & 7), "__cs3_region_start_ram not aligned")\r
143 ASSERT (!(__cs3_region_init_size_ram & 7), "__cs3_region_init_size_ram not aligned")\r
144 ASSERT (!(__cs3_region_zero_size_ram & 7), "__cs3_region_zero_size_ram not aligned")\r
145 .cs3.rom : ALIGN (8)\r
146 {\r
147 __cs3_region_start_rom = .;\r
148 *(.cs3.region-head.rom)\r
149 *(.rom)\r
150 . = ALIGN (8);\r
151 } >rom\r
152 .cs3.rom.bss :\r
153 {\r
154 *(.rom.b .bss.rom)\r
155 . = ALIGN (8);\r
156 } >rom\r
157 /* __cs3_region_end_rom is deprecated */\r
158 __cs3_region_end_rom = __cs3_region_start_rom + LENGTH(rom);\r
159 __cs3_region_size_rom = LENGTH(rom);\r
160 __cs3_region_init_rom = LOADADDR (.cs3.rom);\r
161 __cs3_region_init_size_rom = LOADADDR (.cs3.rom.bss) - LOADADDR (.cs3.rom);\r
162 __cs3_region_zero_size_rom = SIZEOF(.cs3.rom.bss);\r
163 \r
164 .data : ALIGN (8)\r
165 {\r
166 KEEP(*(.jcr))\r
167 *(.got.plt) *(.got)\r
168 *(.shdata)\r
169 *(.data .data.* .gnu.linkonce.d.*)\r
170 . = ALIGN (8);\r
171 *(.ram)\r
172 . = ALIGN (8);\r
173 _edata = .;\r
174 } >ram\r
175 .bss : ALIGN (8)\r
176 {\r
177 *(.shbss)\r
178 *(.bss .bss.* .gnu.linkonce.b.*)\r
179 *(COMMON)\r
180 . = ALIGN (8);\r
181 *(.ram.b .bss.ram)\r
182 . = ALIGN (8);\r
183 _end = .;\r
184 __end = .;\r
185 } >ram\r
186 /* __cs3_region_end_ram is deprecated */\r
187 __cs3_region_end_ram = __cs3_region_start_ram + LENGTH(ram);\r
188 __cs3_region_size_ram = LENGTH(ram);\r
189 __cs3_region_init_ram = LOADADDR (.text);\r
190 __cs3_region_init_size_ram = _edata - ADDR (.text);\r
191 __cs3_region_zero_size_ram = _end - _edata;\r
192 \r
193 .stab 0 (NOLOAD) : { *(.stab) }\r
194 .stabstr 0 (NOLOAD) : { *(.stabstr) }\r
195 /* DWARF debug sections.\r
196 * Symbols in the DWARF debugging sections are relative to\r
197 * the beginning of the section so we begin them at 0.\r
198 */\r
199 /* DWARF 1 */\r
200 .debug 0 : { *(.debug) }\r
201 .line 0 : { *(.line) }\r
202 /* GNU DWARF 1 extensions */\r
203 .debug_srcinfo 0 : { *(.debug_srcinfo) }\r
204 .debug_sfnames 0 : { *(.debug_sfnames) }\r
205 /* DWARF 1.1 and DWARF 2 */\r
206 .debug_aranges 0 : { *(.debug_aranges) }\r
207 .debug_pubnames 0 : { *(.debug_pubnames) }\r
208 /* DWARF 2 */\r
209 .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }\r
210 .debug_abbrev 0 : { *(.debug_abbrev) }\r
211 .debug_line 0 : { *(.debug_line) }\r
212 .debug_frame 0 : { *(.debug_frame) }\r
213 .debug_str 0 : { *(.debug_str) }\r
214 .debug_loc 0 : { *(.debug_loc) }\r
215 .debug_macinfo 0 : { *(.debug_macinfo) }\r
216 /* DWARF 2.1 */\r
217 .debug_ranges 0 : { *(.debug_ranges) }\r
218 /* SGI/MIPS DWARF 2 extensions */\r
219 .debug_weaknames 0 : { *(.debug_weaknames) }\r
220 .debug_funcnames 0 : { *(.debug_funcnames) }\r
221 .debug_typenames 0 : { *(.debug_typenames) }\r
222 .debug_varnames 0 : { *(.debug_varnames) }\r
223 \r
224 .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }\r
225 .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }\r
226 /DISCARD/ : { *(.note.GNU-stack) }\r
227 }\r
228 /* checksum: b15b0bf76673e544380111 */\r