/* * This file contains GNU linker directives for an general SH4 * board. * * Variations in memory size and allocation can be made by * overriding some values with linker command-line arguments. * * Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russia * Author: Victor V. Vengerov * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * * http://www.rtems.org/license/LICENSE. */ OUTPUT_ARCH(sh) ENTRY(_start) STARTUP(start.o) /* Do we need any of these for elf? __DYNAMIC = 0; */ _RamBase = DEFINED(_RamBase) ? _RamBase : 0x80000000; _RamSize = DEFINED(_RamSize) ? _RamSize : 4M; _HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x0; /* * Area assignments: * Area 0: Flash memory, SRAM interface * Area 1: GDC * Area 2: SDRAM * Area 3-6: unused */ MEMORY { ram : o = 0x88100000, l = 7M rom : o = 0x80000000, l = 4M } SECTIONS { /* Read-only sections, merged into text segment: */ .text : { _start = .; *(.text*) /* * Special FreeBSD sysctl sections. */ . = ALIGN (16); ___start_set_sysctl_set = .; *(set_sysc*); /* set_sysctl_* but name is truncated by SH-coff */ ___stop_set_sysctl_set = ABSOLUTE(.); *(set_doma*); /* set_domain_* but name is truncated by SH-coff */ *(set_pseu*); /* set_pseudo_* but name is truncated by SH-coff */ /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) *(.gnu.linkonce.t*) } > ram .rela.dyn : { *(.rela.init) *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) *(.rela.fini) *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) *(.rela.ctors) *(.rela.dtors) *(.rela.got) *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >ram _etext = .; PROVIDE (etext = .); .init . : { KEEP(*(.init)) } > ram =0 .fini . : { KEEP(*(.fini)) } > ram =0 .ctors . : { KEEP(*(.ctors)) } > ram =0 .dtors . : { KEEP(*(.dtors)) } > ram =0 .rodata : { *(.rodata) *(.rodata.*) KEEP (*(SORT(.rtemsroset.*))) *(.gnu.linkonce.r*) } > ram .tdata : { __TLS_Data_begin = .; *(.tdata .tdata.* .gnu.linkonce.td.*) __TLS_Data_end = .; } > ram .tbss : { __TLS_BSS_begin = .; *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) __TLS_BSS_end = .; } > ram __TLS_Data_size = __TLS_Data_end - __TLS_Data_begin; __TLS_Data_begin = __TLS_Data_size != 0 ? __TLS_Data_begin : __TLS_BSS_begin; __TLS_Data_end = __TLS_Data_size != 0 ? __TLS_Data_end : __TLS_BSS_begin; __TLS_BSS_size = __TLS_BSS_end - __TLS_BSS_begin; __TLS_Size = __TLS_BSS_end - __TLS_Data_begin; __TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss)); /* Adjust the address for the data segment. We want to adjust up to the same address within the page on the next page up. */ . = ALIGN(128) + (. & (128 - 1)); .data : { copy_start = .; *(.data*) KEEP (*(SORT(.rtemsrwset.*))) *(.gcc_exc*) ___EH_FRAME_BEGIN__ = .; *(.eh_fram*) ___EH_FRAME_END__ = .; LONG(0); *(.gcc_except_table*) *(.gnu.linkonce.d*) SORT(CONSTRUCTORS) copy_end = .; } > ram .eh_frame : { *(.eh_frame) } > ram /* We want the small data sections together, so single-instruction offsets can access them all, and initialized data all before uninitialized, so we can shorten the on-disk segment size. */ .bss : { __bss_start = .; *(.dynbss) *(.bss .bss* .gnu.linkonce.b*) *(COMMON) /* Align here to ensure that the .bss section occupies space up to _end. Align after .bss to ensure correct alignment even if the .bss section disappears because there are no input sections. */ . = ALIGN(32 / 8); __bss_end = .; } > ram .stack : { . = . + 4096; } > ram .rtemsstack (NOLOAD) : { *(SORT(.rtemsstack.*)) } > ram _WorkAreaBase = . ; . = ALIGN(16); _CPU_Interrupt_stack_low = . ; _CPU_Interrupt_stack_high = _CPU_Interrupt_stack_low + 4096 ; /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } /* These must appear regardless of . */ }