1 //===========================================================================
3 // MLT linker script for MIPS64
5 //===========================================================================
6 //####ECOSGPLCOPYRIGHTBEGIN####
7 // -------------------------------------------
8 // This file is part of eCos, the Embedded Configurable Operating System.
9 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
11 // eCos is free software; you can redistribute it and/or modify it under
12 // the terms of the GNU General Public License as published by the Free
13 // Software Foundation; either version 2 or (at your option) any later version.
15 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
16 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 // You should have received a copy of the GNU General Public License along
21 // with eCos; if not, write to the Free Software Foundation, Inc.,
22 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
24 // As a special exception, if other files instantiate templates or use macros
25 // or inline functions from this file, or you compile this file and link it
26 // with other works to produce a work based on this file, this file does not
27 // by itself cause the resulting work to be covered by the GNU General Public
28 // License. However the source code for this file must still be made available
29 // in accordance with section (3) of the GNU General Public License.
31 // This exception does not invalidate any other reasons why a work based on
32 // this file might be covered by the GNU General Public License.
34 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
35 // at http://sources.redhat.com/ecos/ecos-license/
36 // -------------------------------------------
37 //####ECOSGPLCOPYRIGHTEND####
38 //===========================================================================
40 #include <pkgconf/system.h>
42 OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips",
44 /* The preprocessor defines mips, but we know we're mips :-) */
46 OUTPUT_ARCH(mips:isa64)
54 GROUP(libtarget.a libgcc.a libsupc++.a)
56 GROUP(libtarget.a libgcc.a)
59 /* FIXME: The MLT should pass in the required alignment since it must be
60 * the same as the VMA's alignment. As a result of this bug, all the MIPS64
61 * ROM mlt files have alignment 8, when some should have alignment 4
64 #define ALIGN_LMA 0x40
65 #define FOLLOWING(_section_) AT ((LOADADDR (_section_) + SIZEOF (_section_) + ALIGN_LMA - 1) & ~ (ALIGN_LMA - 1))
67 #define FORCE_OUTPUT . = .
69 #define SECTIONS_BEGIN
71 #if defined(CYG_HAL_STARTUP_RAM)
73 /* this version for RAM startup */
74 #define SECTION_rom_vectors(_region_, _vma_, _lma_) \
75 .rom_vectors _vma_ : _lma_ \
76 { KEEP (*(.utlb_vector)) \
77 . = ALIGN(0x80); KEEP(*(.other_vector)) \
78 /* debug and reset vector not used in RAM version */ \
79 KEEP(*(.debug_vector)) \
80 KEEP (*(.reset_vector)) } \
83 #elif defined(CYG_HAL_STARTUP_ROM)
85 /* this version for ROM startup */
86 #define SECTION_rom_vectors(_region_, _vma_, _lma_) \
87 .rom_vectors _vma_ : _lma_ \
88 { KEEP (*(.reset_vector)) \
89 . = ALIGN(0x200); KEEP (*(.utlb_vector)) \
91 . = ALIGN(0x80); KEEP(*(.other_vector)) \
93 . = ALIGN(0x80); KEEP(*(.debug_vector)) } \
96 #endif /* ROM startup version of ROM vectors */
98 #define SECTION_ROMISC(_region_, _vma_, _lma_) \
99 .interp _vma_ : _lma_ { *(.interp) } > _region_ \
100 .hash : FOLLOWING(.interp) { *(.hash) } > _region_ \
101 .dynsym : FOLLOWING(.hash) { *(.dynsym) } > _region_ \
102 .dynstr : FOLLOWING(.dynsym) { *(.dynstr) } > _region_ \
103 .gnu.version : FOLLOWING(.dynstr) { *(.gnu.version) } > _region_ \
104 .gnu.version_d : FOLLOWING(.gnu.version) { *(.gnu.version_d) } > _region_ \
105 .gnu.version_r : FOLLOWING(.gnu.version_d) { *(.gnu.version_r) } > _region_ \
106 .plt : FOLLOWING(.gnu.version_r) { *(.plt) } > _region_
108 #define SECTION_RELOCS(_region_, _vma_, _lma_) \
113 *(.rel.gnu.linkonce.t*) \
119 *(.rela.gnu.linkonce.t*) \
125 *(.rel.gnu.linkonce.d*) \
131 *(.rela.gnu.linkonce.d*) \
137 *(.rel.gnu.linkonce.r*) \
143 *(.rela.gnu.linkonce.r*) \
145 .rel.got : { *(.rel.got) } > _region_ \
146 .rela.got : { *(.rela.got) } > _region_ \
147 .rel.ctors : { *(.rel.ctors) } > _region_ \
148 .rela.ctors : { *(.rela.ctors) } > _region_ \
149 .rel.dtors : { *(.rel.dtors) } > _region_ \
150 .rela.dtors : { *(.rela.dtors) } > _region_ \
151 .rel.init : { *(.rel.init) } > _region_ \
152 .rela.init : { *(.rela.init) } > _region_ \
153 .rel.fini : { *(.rel.fini) } > _region_ \
154 .rela.fini : { *(.rela.fini) } > _region_ \
155 .rel.bss : { *(.rel.bss) } > _region_ \
156 .rela.bss : { *(.rela.bss) } > _region_ \
157 .rel.plt : { *(.rel.plt) } > _region_ \
158 .rela.plt : { *(.rela.plt) } > _region_ \
159 .rel.dyn : { *(.rel.dyn) } > _region_
161 #define SECTION_init(_region_, _vma_, _lma_) \
162 .init _vma_ : _lma_ \
164 FORCE_OUTPUT; KEEP (*(.init)) \
167 #define SECTION_text(_region_, _vma_, _lma_) \
168 .text _vma_ : _lma_ \
170 _stext = .; _ftext = . ; \
175 *(.gnu.linkonce.t*) \
176 *(.mips16.fn.*) *(.mips16.call.*) \
178 _etext = .; PROVIDE (etext = .);
180 #define SECTION_fini(_region_, _vma_, _lma_) \
181 .fini _vma_ : _lma_ \
183 FORCE_OUTPUT; KEEP (*(.fini)) \
186 #define SECTION_rodata(_region_, _vma_, _lma_) \
187 .rodata _vma_ : _lma_ \
189 FORCE_OUTPUT; *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) \
192 #define SECTION_rodata1(_region_, _vma_, _lma_) \
193 .rodata1 _vma_ : _lma_ \
195 FORCE_OUTPUT; *(.rodata1) *(.rodata1.*) \
198 #define SECTION_vsr_table(_region_, _vma_, _lma_) \
199 .vsr_table _vma_ : _lma_ \
201 FORCE_OUTPUT; *(.vsr_table) \
204 #define SECTION_data(_region_, _vma_, _lma_) \
205 .data _vma_ : _lma_ \
207 __ram_data_start = ABSOLUTE (.); _fdata = . ; \
208 *(.data) *(.data.*) *(.gnu.linkonce.d*) \
213 __rom_data_start = LOADADDR(.data);
215 #define SECTION_data1(_region_, _vma_, _lma_) \
216 .data1 _vma_ : _lma_ \
218 FORCE_OUTPUT; *(.data1) *(.data1.*) \
221 #define SECTION_eh_frame(_region_, _vma_, _lma_) \
222 .eh_frame _vma_ : _lma_ \
224 FORCE_OUTPUT; *(.eh_frame) \
227 #define SECTION_gcc_except_table(_region_, _vma_, _lma_) \
228 .gcc_except_table _vma_ : _lma_ \
230 FORCE_OUTPUT; *(.gcc_except_table) \
234 /* gcc uses crtbegin.o to find the start of
235 the constructors, so we make sure it is
236 first. Because this is a wildcard, it
237 doesn't matter if the user does not
238 actually link against crtbegin.o; the
239 linker won't look for a file to match a
240 wildcard. The wildcard also means that it
241 doesn't matter which directory crtbegin.o
244 /* We don't want to include the .ctors section from
245 the crtend.o file until after the sorted ctors.
246 The .ctor section from the crtend file contains the
247 end of ctors marker and it must be last */
249 /* FIXME: We shouldn't need to define __CTOR_LIST__/__CTOR_END__
250 and __DTOR_LIST__/__DTOR_END__ except by the PROVIDE lines.
251 However this doesn't work for old (99r1-era) toolchains, so
254 #define SECTION_ctors(_region_, _vma_, _lma_) \
255 .ctors _vma_ : _lma_ \
258 KEEP (*crtbegin.o(.ctors)) \
260 PROVIDE (__CTOR_LIST__ = .); \
261 KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) \
262 KEEP (*(SORT(.ctors.*))) \
265 PROVIDE (__CTOR_END__ = .); \
268 #define SECTION_dtors(_region_, _vma_, _lma_) \
269 .dtors _vma_ : _lma_ \
272 KEEP (*crtbegin.o(.dtors)) \
274 PROVIDE (__DTOR_LIST__ = .); \
275 KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) \
276 KEEP (*(SORT(.dtors.*))) \
279 PROVIDE (__DTOR_END__ = .); \
282 #define SECTION_devtab(_region_, _vma_, _lma_) \
283 .devtab _vma_ : _lma_ \
286 KEEP(*( SORT (.ecos.table.*))) ; \
289 #define SECTION_got(_region_, _vma_, _lma_) \
290 _gp = ALIGN(16) + 0x7ff0; \
293 FORCE_OUTPUT; *(.got.plt) *(.got) \
296 #define SECTION_dynamic(_region_, _vma_, _lma_) \
297 .dynamic _vma_ : _lma_ \
299 FORCE_OUTPUT; *(.dynamic) \
302 /* We want the small data sections together, so single-instruction offsets
303 can access them all, and initialized data all before uninitialized, so
304 we can shorten the on-disk segment size. */
306 #define SECTION_sdata(_region_, _vma_, _lma_) \
307 .sdata _vma_ : _lma_ \
309 FORCE_OUTPUT; *(.sdata) *(.sdata.*) *(.gnu.linkonce.s*) \
312 #define SECTION_lit8(_region_, _vma_, _lma_) \
313 .lit8 _vma_ : _lma_ \
315 FORCE_OUTPUT; *(.lit8) \
318 #define SECTION_lit4(_region_, _vma_, _lma_) \
319 .lit4 : FOLLOWING(.lit8) \
321 FORCE_OUTPUT; *(.lit4) \
323 __ram_data_end = .; _edata = . ; \
326 #define SECTION_sbss(_region_, _vma_, _lma_) \
327 __bss_start = .; _fbss = .; \
328 .sbss _vma_ : _lma_ \
330 FORCE_OUTPUT; *(.dynsbss) *(.sbss) *(.sbss.*) *(.scommon) \
333 #define SECTION_bss(_region_, _vma_, _lma_) \
336 *(.dynbss) *(.bss) *(.bss.*) *(COMMON) \
340 /* The /DISCARD/ section ensures that the output will not contain a
341 * .mdebug section as it confuses GDB. This is a workaround for CR 100804.
344 #define SECTIONS_END . = ALIGN(4); _end = .; PROVIDE (end = .); \
345 /* Stabs debugging sections. */ \
346 .stab 0 : { *(.stab) } \
347 .stabstr 0 : { *(.stabstr) } \
348 .stab.excl 0 : { *(.stab.excl) } \
349 .stab.exclstr 0 : { *(.stab.exclstr) } \
350 .stab.index 0 : { *(.stab.index) } \
351 .stab.indexstr 0 : { *(.stab.indexstr) } \
352 .comment 0 : { *(.comment) } \
353 /* DWARF debug sections. \
354 Symbols in the DWARF debugging sections are relative to \
355 the beginning of the section so we begin them at 0. */ \
357 .debug 0 : { *(.debug) } \
358 .line 0 : { *(.line) } \
359 /* GNU DWARF 1 extensions */ \
360 .debug_srcinfo 0 : { *(.debug_srcinfo) } \
361 .debug_sfnames 0 : { *(.debug_sfnames) } \
362 /* DWARF 1.1 and DWARF 2 */ \
363 .debug_aranges 0 : { *(.debug_aranges) } \
364 .debug_pubnames 0 : { *(.debug_pubnames) } \
366 .debug_info 0 : { *(.debug_info) } \
367 .debug_abbrev 0 : { *(.debug_abbrev) } \
368 .debug_line 0 : { *(.debug_line) } \
369 .debug_frame 0 : { *(.debug_frame) } \
370 .debug_str 0 : { *(.debug_str) } \
371 .debug_loc 0 : { *(.debug_loc) } \
372 .debug_macinfo 0 : { *(.debug_macinfo) } \
373 /* SGI/MIPS DWARF 2 extensions */ \
374 .debug_weaknames 0 : { *(.debug_weaknames) } \
375 .debug_funcnames 0 : { *(.debug_funcnames) } \
376 .debug_typenames 0 : { *(.debug_typenames) } \
377 .debug_varnames 0 : { *(.debug_varnames) } \
378 /* These must appear regardless of . */ \
379 .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } \
380 .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } \
381 /DISCARD/ 0 : { *(.mdebug) }
383 #include CYGHWR_MEMORY_LAYOUT_LDI
385 hal_vsr_table = 0x80000200;
386 hal_virtual_vector_table = 0x80000300;