summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libbsp/m68k/gen68340/startup/linkcmds
blob: 4dbfa37084c8961cda9f70d7ab576c94f1af9491 (plain) (tree)


























































































































































                                                                            
/*
 * This file contains GNU linker directives for a generic MC68340/349 board.
 * Variations in hardware type and dynamic memory size can be made
 * by overriding some values with linker command-line arguments.
 *
 * ATTENTION: RAM and ROM placement must accord those in start340.S!!
 *            (next time I'll use some shared variables :) )
 *
 * Geoffroy Montel
 * France Telecom - CNET/DSM/TAM/CAT
 * 4, rue du Clos Courtel
 * 35512 CESSON-SEVIGNE
 * FRANCE
 * 
 * e-mail: g_montel@yahoo.com
 * 
 *  $Id$
 */

/*
 * a.out format doesn't handle prom images very well
 */
OUTPUT_FORMAT(coff-m68k)

/*
 * Declare some sizes.
 * XXX: The assignment of ". += XyzSize;" fails in older gld's if the
 *      number used there is not constant.  If this happens to you, edit
 *      the lines marked XXX below to use a constant value.
 */
RamSize = DEFINED(RamSize) ? RamSize : 4M;
HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
StackSize = DEFINED(StackSize) ? StackSize : 0x1000;

/*
 * Declare on-board memory.
 * It would be nice if the ram length could be given as
 * LENGTH=RamSize, but gld doesn't allow non-constant
 * values in the LENGTH expression.  
 */
MEMORY {
          ram : ORIGIN = 0x10000000, LENGTH = 4M
          rom : ORIGIN = 0x01000000, LENGTH = 4M
/*        dpram : ORIGIN = 0xFE000000, LENGTH = 8k */
}

/*
 * Declare low-order three octets of Ethernet address.
 */
ETHERNET_ADDRESS = DEFINED(ETHERNET_ADDRESS) ? ETHERNET_ADDRESS : 0xDEAD12;

/*
 * Load objects
 */
SECTIONS {
	/*
	 * Hardware variations
	 */
	_RamSize = RamSize;
	__RamSize = RamSize;

        /*
         * Boot PROM
         */
        rom : {
                _RomBase = .;
                __RomBase = .;
        } >rom

        /*
         * Dynamic RAM
         */
        ram : {
                _RamBase = .;
                __RamBase = .;
        } >ram

        /*
         * Text, data and bss segments
         */
        .text : {
                CREATE_OBJECT_SYMBOLS
                *(.text)
                . = ALIGN (16);

		/*
		 * C++ constructors
		 */
		__CTOR_LIST__ = .;
		LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
		*(.ctors)
		LONG(0)
		__CTOR_END__ = .;
		__DTOR_LIST__ = .;
		LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
		*(.dtors)
		LONG(0)
		__DTOR_END__ = .;

                etext = .;
                _etext = .;
        } >rom 

	.eh_fram : {
		. = ALIGN (16);
		*(.eh_fram)
	} >ram

	.gcc_exc : {
		. = ALIGN (16);
		*(.gcc_exc)
	} >ram

       /*
        * On-chip memory/peripherals
        *
	*/
        dpram : {
                m340 = .;
                _m340 = .;
                . += (8 * 1024);
        } >ram

        .data : {
                copy_start = .;
                *(.data)
                . = ALIGN (16);
                _edata = .;
                copy_end = .;
        } >ram

        .bss : {
                M68Kvec = .;
                _M68Kvec = .;
                . += (256 * 4);
                clear_start = .;
                *(.bss)
                *(COMMON)
                . = ALIGN (16);
                _end = .;

                _HeapStart = .;
                __HeapStart = .;
                . += HeapSize;  /* XXX -- Old gld can't handle this */
                . += StackSize; /* XXX -- Old gld can't handle this */
                /* . += 0x10000; */ /* HeapSize for old gld */
                /* . += 0x1000;  */ /* StackSize for old gld */
                . = ALIGN (16);
                stack_init = .;
                clear_end = .;

                _WorkspaceBase = .;
                __WorkspaceBase = .;
        } >ram
}