/* SPDX-License-Identifier: BSD-2-Clause */ /* * This file contains directives for the GNU linker which are specific * to the Freescale ColdFire mcf52258 * * COPYRIGHT (c) 1989-1999. * On-Line Applications Research Corporation (OAR). * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE.e */ /* * Declare some sizes. */ RamBase = DEFINED(RamBase) ? RamBase : 0x20000000; RamSize = DEFINED(RamSize) ? RamSize : 64K; RamEnd = RamBase + RamSize; HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0; _FlashBase = DEFINED(_FlashBase) ? _FlashBase : 0x00000000; _VBR = 0x20000000; ENTRY(start) STARTUP(start.o) MEMORY { sram : ORIGIN = 0x20000000, LENGTH = 64K flash : ORIGIN = 0x00000000, LENGTH = 512K } SECTIONS { /* * Text, data and bss segments */ .text : { *(.text*) *(.ram_code) /* * C++ constructors/destructors */ *(.gnu.linkonce.t.*) /* * Initialization and finalization code. * * Various files can provide initialization and finalization * functions. crtbegin.o and crtend.o are two instances. The * body of these functions are in .init and .fini sections. We * accumulate the bodies here, and prepend function prologues * from crti.o and function epilogues from crtn.o. crti.o must * be linked first; crtn.o must be linked last. Because these * are wildcards, it doesn't matter if the user does not * actually link against crti.o and crtn.o; the linker won't * look for a file to match a wildcard. The wildcard also * means that it doesn't matter which directory crti.o and * crtn.o are in. */ PROVIDE (_init = .); *crti.o(.init) *(.init) *crtn.o(.init) PROVIDE (_fini = .); *crti.o(.fini) *(.fini) *crtn.o(.fini) /* * Special FreeBSD sysctl sections. */ . = ALIGN (16); __start_set_sysctl_set = .; *(set_sysctl_*); __stop_set_sysctl_set = ABSOLUTE(.); *(set_domain_*); *(set_pseudo_*); /* * C++ constructors/destructors * * gcc uses crtbegin.o to find the start of the constructors * and destructors so we make sure it is first. Because this * is a wildcard, it doesn't matter if the user does not * actually link against crtbegin.o; the linker won't look for * a file to match a wildcard. The wildcard also means that * it doesn't matter which directory crtbegin.o is in. The * constructor and destructor list are terminated in * crtend.o. The same comments apply to it. */ . = ALIGN (16); *crtbegin.o(.ctors) *(.ctors) *crtend.o(.ctors) *crtbegin.o(.dtors) *(.dtors) *crtend.o(.dtors) /* * Exception frame info */ . = ALIGN (16); *(.eh_frame) /* * Read-only data */ . = ALIGN (16); _rodata_start = . ; *(.rodata*) KEEP (*(SORT(.rtemsroset.*))) *(.gnu.linkonce.r*) . = ALIGN (16); *(.console_gdb_xfer) *(.bootstrap_data) } >flash .tdata : { _TLS_Data_begin = .; *(.tdata .tdata.* .gnu.linkonce.td.*) _TLS_Data_end = .; . = ALIGN(16); _estuff = .; PROVIDE (_etext = .); } >flash .tbss : { _TLS_BSS_begin = .; *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) _TLS_BSS_end = .; } >flash _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)); .data 0x20000400 : AT (_estuff) { PROVIDE( _data_dest_start = . ); PROVIDE( _copy_start = .); *(.data*) KEEP (*(SORT(.rtemsrwset.*))) *(.gnu.linkonce.d*) *(.gcc_except_table*) *(.jcr) . = ALIGN (16); PROVIDE (_edata = .); PROVIDE (_copy_end = .); PROVIDE (_data_dest_end = . ); } >sram _data_src_start = _estuff; _data_src_end = _data_dest_start + SIZEOF(.data); .bss : { PROVIDE (_clear_start = .); *(.bss*) *(COMMON) . = ALIGN (16); PROVIDE (_end = .); PROVIDE (_clear_end = .); } >sram .noinit (NOLOAD) : { *(SORT_BY_NAME (SORT_BY_ALIGNMENT (.noinit*))) } >sram .rtemsstack (NOLOAD) : { *(SORT(.rtemsstack.*)) PROVIDE(WorkAreaBase = .); } >sram /* 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) } PROVIDE (end_of_all = .); }