Home | History | Annotate | Download | only in scripttempl
      1 # Copyright (C) 2014 Free Software Foundation, Inc.
      2 # 
      3 # Copying and distribution of this file, with or without modification,
      4 # are permitted in any medium without royalty provided the copyright
      5 # notice and this notice are preserved.
      6 #
      7 # Unusual variables checked by this code:
      8 #	NOP - four byte opcode for no-op (defaults to 0)
      9 #	NO_SMALL_DATA - no .sbss/.sbss2/.sdata/.sdata2 sections if not
     10 #		empty.
     11 #	SMALL_DATA_CTOR - .ctors contains small data.
     12 #	SMALL_DATA_DTOR - .dtors contains small data.
     13 #	DATA_ADDR - if end-of-text-plus-one-page isn't right for data start
     14 #	INITIAL_READONLY_SECTIONS - at start of text segment
     15 #	OTHER_READONLY_SECTIONS - other than .text .init .rodata ...
     16 #		(e.g., .PARISC.milli)
     17 #	OTHER_TEXT_SECTIONS - these get put in .text when relocating
     18 #	OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ...
     19 #		(e.g., .PARISC.global)
     20 #	OTHER_RELRO_SECTIONS - other than .data.rel.ro ...
     21 #		(e.g. PPC32 .fixup, .got[12])
     22 #	OTHER_BSS_SECTIONS - other than .bss .sbss ...
     23 #	ATTRS_SECTIONS - at the end
     24 #	OTHER_SECTIONS - at the end
     25 #	EXECUTABLE_SYMBOLS - symbols that must be defined for an
     26 #		executable (e.g., _DYNAMIC_LINK)
     27 #       TEXT_START_ADDR - the first byte of the text segment, after any
     28 #               headers.
     29 #       TEXT_BASE_ADDRESS - the first byte of the text segment.
     30 #	TEXT_START_SYMBOLS - symbols that appear at the start of the
     31 #		.text section.
     32 #	DATA_START_SYMBOLS - symbols that appear at the start of the
     33 #		.data section.
     34 #	DATA_END_SYMBOLS - symbols that appear at the end of the
     35 #		writeable data sections.
     36 #	OTHER_GOT_SYMBOLS - symbols defined just before .got.
     37 #	OTHER_GOT_SECTIONS - sections just after .got.
     38 #	OTHER_SDATA_SECTIONS - sections just after .sdata.
     39 #	OTHER_BSS_SYMBOLS - symbols that appear at the start of the
     40 #		.bss section besides ___bss_start.
     41 #	DATA_PLT - .plt should be in data segment, not text segment.
     42 #	PLT_BEFORE_GOT - .plt just before .got when .plt is in data segement.
     43 #	BSS_PLT - .plt should be in bss segment
     44 #	NO_REL_RELOCS - Don't include .rel.* sections in script
     45 #	NO_RELA_RELOCS - Don't include .rela.* sections in script
     46 #	NON_ALLOC_DYN - Place dynamic sections after data segment.
     47 #	TEXT_DYNAMIC - .dynamic in text segment, not data segment.
     48 #	EMBEDDED - whether this is for an embedded system. 
     49 #	SHLIB_TEXT_START_ADDR - if set, add to SIZEOF_HEADERS to set
     50 #		start address of shared library.
     51 #	INPUT_FILES - INPUT command of files to always include
     52 #	WRITABLE_RODATA - if set, the .rodata section should be writable
     53 #	INIT_START, INIT_END -  statements just before and just after
     54 # 	combination of .init sections.
     55 #	FINI_START, FINI_END - statements just before and just after
     56 # 	combination of .fini sections.
     57 #	STACK_ADDR - start of a .stack section.
     58 #	OTHER_SYMBOLS - symbols to place right at the end of the script.
     59 #	ETEXT_NAME - name of a symbol for the end of the text section,
     60 #		normally etext.
     61 #	SEPARATE_GOTPLT - if set, .got.plt should be separate output section,
     62 #		so that .got can be in the RELRO area.  It should be set to
     63 #		the number of bytes in the beginning of .got.plt which can be
     64 #		in the RELRO area as well.
     65 #	USER_LABEL_PREFIX - prefix to add to user-visible symbols.
     66 #
     67 # When adding sections, do note that the names of some sections are used
     68 # when specifying the start address of the next.
     69 #
     70 
     71 #  Many sections come in three flavours.  There is the 'real' section,
     72 #  like ".data".  Then there are the per-procedure or per-variable
     73 #  sections, generated by -ffunction-sections and -fdata-sections in GCC,
     74 #  and useful for --gc-sections, which for a variable "foo" might be
     75 #  ".data.foo".  Then there are the linkonce sections, for which the linker
     76 #  eliminates duplicates, which are named like ".gnu.linkonce.d.foo".
     77 #  The exact correspondences are:
     78 #
     79 #  Section	Linkonce section
     80 #  .text	.gnu.linkonce.t.foo
     81 #  .rodata	.gnu.linkonce.r.foo
     82 #  .data	.gnu.linkonce.d.foo
     83 #  .bss		.gnu.linkonce.b.foo
     84 #  .sdata	.gnu.linkonce.s.foo
     85 #  .sbss	.gnu.linkonce.sb.foo
     86 #  .sdata2	.gnu.linkonce.s2.foo
     87 #  .sbss2	.gnu.linkonce.sb2.foo
     88 #  .debug_info	.gnu.linkonce.wi.foo
     89 #  .tdata	.gnu.linkonce.td.foo
     90 #  .tbss	.gnu.linkonce.tb.foo
     91 #  .lrodata	.gnu.linkonce.lr.foo
     92 #  .ldata	.gnu.linkonce.l.foo
     93 #  .lbss	.gnu.linkonce.lb.foo
     94 #
     95 #  Each of these can also have corresponding .rel.* and .rela.* sections.
     96 
     97 
     98 test -z "$ENTRY" && ENTRY=_start
     99 test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
    100 test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
    101 if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
    102 test -z "${ELFSIZE}" && ELFSIZE=32
    103 test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8"
    104 test "$LD_FLAG" = "N" && DATA_ADDR=.
    105 test -z "${ETEXT_NAME}" && ETEXT_NAME=etext
    106 test -n "$CREATE_SHLIB$CREATE_PIE" && test -n "$SHLIB_DATA_ADDR" && COMMONPAGESIZE=""
    107 test -z "$CREATE_SHLIB$CREATE_PIE" && test -n "$DATA_ADDR" && COMMONPAGESIZE=""
    108 test -n "$RELRO_NOW" && unset SEPARATE_GOTPLT
    109 test -z "$ATTRS_SECTIONS" && ATTRS_SECTIONS=".gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }"
    110 DATA_SEGMENT_ALIGN="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))"
    111 DATA_SEGMENT_RELRO_END=""
    112 DATA_SEGMENT_END=""
    113 if test -n "${COMMONPAGESIZE}"; then
    114   DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}) - ((${MAXPAGESIZE} - .) & (${MAXPAGESIZE} - 1)); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})"
    115   DATA_SEGMENT_END=". = DATA_SEGMENT_END (.);"
    116   DATA_SEGMENT_RELRO_END=". = DATA_SEGMENT_RELRO_END (${SEPARATE_GOTPLT-0}, .);"
    117 fi
    118 if test -z "${INITIAL_READONLY_SECTIONS}${CREATE_SHLIB}"; then
    119   INITIAL_READONLY_SECTIONS=".interp       ${RELOCATING-0} : { *(.interp) }"
    120 fi
    121 if test -z "$PLT"; then
    122   PLT=".plt          ${RELOCATING-0} : { *(.plt) }"
    123 fi
    124 test -n "${DATA_PLT-${BSS_PLT-text}}" && TEXT_PLT=yes
    125 if test -z "$GOT"; then
    126   if test -z "$SEPARATE_GOTPLT"; then
    127     GOT=".got          ${RELOCATING-0} : { *(.got.plt) *(.got) }"
    128   else
    129     GOT=".got          ${RELOCATING-0} : { *(.got) }"
    130     GOTPLT=".got.plt      ${RELOCATING-0} : { *(.got.plt) }"
    131   fi
    132 fi
    133 DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }"
    134 RODATA=".rodata ${RELOCATING+ADDR(.data)+SIZEOF(.data)} ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }  /*> INTERNAL_RAM*/"
    135 DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }"
    136 DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }"
    137 if test -z "${NO_SMALL_DATA}"; then
    138   SBSS=".sbss         ${RELOCATING-0} :
    139   {
    140     ${RELOCATING+${SBSS_START_SYMBOLS}}
    141     ${CREATE_SHLIB+*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)}
    142     *(.dynsbss)
    143     *(.sbss${RELOCATING+ .sbss.* .gnu.linkonce.sb.*})
    144     *(.scommon)
    145     ${RELOCATING+${SBSS_END_SYMBOLS}}
    146   }"
    147   SBSS2=".sbss2        ${RELOCATING-0} : { *(.sbss2${RELOCATING+ .sbss2.* .gnu.linkonce.sb2.*}) }"
    148   SDATA="/* We want the small data sections together, so single-instruction offsets
    149      can access them all, and initialized data all before uninitialized, so
    150      we can shorten the on-disk segment size.  */
    151   .sdata        ${RELOCATING-0} : 
    152   {
    153     ${RELOCATING+${SDATA_START_SYMBOLS}}
    154     ${CREATE_SHLIB+*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)}
    155     *(.sdata${RELOCATING+ .sdata.* .gnu.linkonce.s.*})
    156   }"
    157   SDATA2=".sdata2       ${RELOCATING-0} :
    158   {
    159     ${RELOCATING+${SDATA2_START_SYMBOLS}}
    160     *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*})
    161   }"
    162   REL_SDATA=".rel.sdata    ${RELOCATING-0} : { *(.rel.sdata${RELOCATING+ .rel.sdata.* .rel.gnu.linkonce.s.*}) }
    163   .rela.sdata   ${RELOCATING-0} : { *(.rela.sdata${RELOCATING+ .rela.sdata.* .rela.gnu.linkonce.s.*}) }"
    164   REL_SBSS=".rel.sbss     ${RELOCATING-0} : { *(.rel.sbss${RELOCATING+ .rel.sbss.* .rel.gnu.linkonce.sb.*}) }
    165   .rela.sbss    ${RELOCATING-0} : { *(.rela.sbss${RELOCATING+ .rela.sbss.* .rela.gnu.linkonce.sb.*}) }"
    166   REL_SDATA2=".rel.sdata2   ${RELOCATING-0} : { *(.rel.sdata2${RELOCATING+ .rel.sdata2.* .rel.gnu.linkonce.s2.*}) }
    167   .rela.sdata2  ${RELOCATING-0} : { *(.rela.sdata2${RELOCATING+ .rela.sdata2.* .rela.gnu.linkonce.s2.*}) }"
    168   REL_SBSS2=".rel.sbss2    ${RELOCATING-0} : { *(.rel.sbss2${RELOCATING+ .rel.sbss2.* .rel.gnu.linkonce.sb2.*}) }
    169   .rela.sbss2   ${RELOCATING-0} : { *(.rela.sbss2${RELOCATING+ .rela.sbss2.* .rela.gnu.linkonce.sb2.*}) }"
    170 else
    171   NO_SMALL_DATA=" "
    172 fi
    173 if test -z "${DATA_GOT}"; then
    174   if test -n "${NO_SMALL_DATA}"; then
    175     DATA_GOT=" "
    176   fi
    177 fi
    178 if test -z "${SDATA_GOT}"; then
    179   if test -z "${NO_SMALL_DATA}"; then
    180     SDATA_GOT=" "
    181   fi
    182 fi
    183 test -n "$SEPARATE_GOTPLT" && SEPARATE_GOTPLT=" "
    184 test "${LARGE_SECTIONS}" = "yes" && REL_LARGE="
    185   .rel.ldata    ${RELOCATING-0} : { *(.rel.ldata${RELOCATING+ .rel.ldata.* .rel.gnu.linkonce.l.*}) }
    186   .rela.ldata   ${RELOCATING-0} : { *(.rela.ldata${RELOCATING+ .rela.ldata.* .rela.gnu.linkonce.l.*}) }
    187   .rel.lbss     ${RELOCATING-0} : { *(.rel.lbss${RELOCATING+ .rel.lbss.* .rel.gnu.linkonce.lb.*}) }
    188   .rela.lbss    ${RELOCATING-0} : { *(.rela.lbss${RELOCATING+ .rela.lbss.* .rela.gnu.linkonce.lb.*}) }
    189   .rel.lrodata  ${RELOCATING-0} : { *(.rel.lrodata${RELOCATING+ .rel.lrodata.* .rel.gnu.linkonce.lr.*}) }
    190   .rela.lrodata ${RELOCATING-0} : { *(.rela.lrodata${RELOCATING+ .rela.lrodata.* .rela.gnu.linkonce.lr.*}) }"
    191 test "${LARGE_SECTIONS}" = "yes" && OTHER_BSS_SECTIONS="
    192   ${OTHER_BSS_SECTIONS}
    193   .lbss ${RELOCATING-0} :
    194   {
    195     *(.dynlbss)
    196     *(.lbss${RELOCATING+ .lbss.* .gnu.linkonce.lb.*})
    197     *(LARGE_COMMON)
    198   }"
    199 test "${LARGE_SECTIONS}" = "yes" && LARGE_SECTIONS="
    200   .lrodata ${RELOCATING-0} ${RELOCATING+ALIGN(${MAXPAGESIZE}) + (. & (${MAXPAGESIZE} - 1))} :
    201   {
    202     *(.lrodata${RELOCATING+ .lrodata.* .gnu.linkonce.lr.*})
    203   }
    204   .ldata ${RELOCATING-0} ${RELOCATING+ALIGN(${MAXPAGESIZE}) + (. & (${MAXPAGESIZE} - 1))} :
    205   {
    206     *(.ldata${RELOCATING+ .ldata.* .gnu.linkonce.l.*})
    207     ${RELOCATING+. = ALIGN(. != 0 ? ${ALIGNMENT} : 1);}
    208   }"
    209 CTOR=".ctors    ADDR(.text) + SIZEOF(.text)      ${CONSTRUCTING-0} : 
    210   {
    211     ${CONSTRUCTING+${CTOR_START}}
    212     /* gcc uses crtbegin.o to find the start of
    213        the constructors, so we make sure it is
    214        first.  Because this is a wildcard, it
    215        doesn't matter if the user does not
    216        actually link against crtbegin.o; the
    217        linker won't look for a file to match a
    218        wildcard.  The wildcard also means that it
    219        doesn't matter which directory crtbegin.o
    220        is in.  */
    221 
    222     KEEP (*crtbegin.o(.ctors))
    223     KEEP (*crtbegin?.o(.ctors))
    224 
    225     /* We don't want to include the .ctor section from
    226        the crtend.o file until after the sorted ctors.
    227        The .ctor section from the crtend file contains the
    228        end of ctors marker and it must be last */
    229 
    230     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
    231     KEEP (*(SORT(.ctors.*)))
    232     KEEP (*(.ctors))
    233     ${CONSTRUCTING+${CTOR_END}}
    234   }  /*> INTERNAL_RAM*/" 
    235 DTOR=".dtors     ADDR(.ctors) + SIZEOF(.ctors)    ${CONSTRUCTING-0} :
    236   {
    237     ${CONSTRUCTING+${DTOR_START}}
    238     KEEP (*crtbegin.o(.dtors))
    239     KEEP (*crtbegin?.o(.dtors))
    240     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
    241     KEEP (*(SORT(.dtors.*)))
    242     KEEP (*(.dtors))
    243     ${CONSTRUCTING+${DTOR_END}}
    244   }   /*> INTERNAL_RAM*/ "
    245 STACK="  .stack        ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} :
    246   {
    247     ${RELOCATING+___stack = .;}
    248     *(.stack)
    249   }"
    250 
    251 # If this is for an embedded system, don't add SIZEOF_HEADERS.
    252 if [ -z "$EMBEDDED" ]; then
    253    test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS"
    254 else
    255    test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}"
    256 fi
    257 
    258 cat <<EOF
    259 /* Copyright (C) 2014 Free Software Foundation, Inc.
    260 
    261    Copying and distribution of this script, with or without modification,
    262    are permitted in any medium without royalty provided the copyright
    263    notice and this notice are preserved.  */
    264 
    265 OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
    266 	      "${LITTLE_OUTPUT_FORMAT}")
    267 OUTPUT_ARCH(${OUTPUT_ARCH})
    268 ${RELOCATING+ENTRY(${ENTRY})}
    269 
    270 ${RELOCATING+${EXECUTABLE_SYMBOLS}}
    271 ${RELOCATING+${INPUT_FILES}}
    272 ${RELOCATING- /* For some reason, the Solaris linker makes bad executables
    273   if gld -r is used and the intermediate file has sections starting
    274   at non-zero addresses.  Could be a Solaris ld bug, could be a GNU ld
    275   bug.  But for now assigning the zero vmas works.  */}
    276 
    277 
    278 
    279 /* BSP specific*/
    280 __PROG_SIZE_FOR_CORE__ = 1M;
    281 __HEAP_SIZE_FOR_CORE__ = 1M;
    282 
    283 __MAX_NUM_CORES_IN_ROWS__ = 4;
    284 __MAX_NUM_CORES_IN_COLS__ = 4;
    285 
    286 __FIRST_CORE_ROW_ = 0x20;
    287 __FIRST_CORE_COL_ = 0x24;
    288 
    289 
    290 
    291 PROVIDE (__CORE_ROW_ = __FIRST_CORE_ROW_);
    292 PROVIDE (__CORE_COL_ = __FIRST_CORE_COL_);
    293 /* generic don't touch */
    294 /* used to calculated the slice address in the external memory*/
    295 __CORE_NUM_ =  (__CORE_ROW_ -  __FIRST_CORE_ROW_ )* __MAX_NUM_CORES_IN_COLS__ + (__CORE_COL_ - __FIRST_CORE_COL_ ) ;
    296 
    297 
    298 MEMORY
    299  {
    300  	EXTERNAL_DRAM_0 (WXAI) :     ORIGIN = 0x80000000,      LENGTH = 0x1000000  /*.text, data, rodata, bss and .stack*/
    301     EXTERNAL_DRAM_1 (WXAI) :        ORIGIN = 0x81000000,      LENGTH = 0x1000000 /*.heap */
    302     
    303     EXTERNAL_SRAM (WXAI) :       ORIGIN = 0x92000000,      LENGTH =   8K /* small external RAM, used for testing*/
    304     
    305     /* run time lib and crt0*/
    306     RESERVED_CRT0_RAM (WXAI) :    ORIGIN = 0,      LENGTH = 0x400
    307     
    308     /* user program, per bank usage */
    309     BANK0_SRAM (WXAI) : ORIGIN = LENGTH(RESERVED_CRT0_RAM),   LENGTH = 8K - LENGTH(RESERVED_CRT0_RAM)
    310     BANK1_SRAM (WXAI) : ORIGIN = 0x2000, LENGTH = 8K
    311     BANK2_SRAM (WXAI) : ORIGIN = 0x4000, LENGTH = 8K
    312     BANK3_SRAM (WXAI) : ORIGIN = 0x6000, LENGTH = 8K
    313     
    314     /* user program, continious placement */
    315     INTERNAL_RAM        (WXAI) :     ORIGIN = LENGTH(RESERVED_CRT0_RAM),  LENGTH = 32K - LENGTH(RESERVED_CRT0_RAM)
    316     
    317     MMR (WAI) 	      : ORIGIN = 0xF000, LENGTH = 32K
    318        
    319     /* multi cores space */   
    320 	CORE_0x20_0x24_INTERNAL_RAM :      ORIGIN = 0x82400000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    321 	CORE_0x20_0x25_INTERNAL_RAM :      ORIGIN = 0x82500000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    322 	CORE_0x20_0x26_INTERNAL_RAM :      ORIGIN = 0x82600000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    323 	CORE_0x20_0x27_INTERNAL_RAM :      ORIGIN = 0x82700000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    324 	CORE_0x21_0x24_INTERNAL_RAM :      ORIGIN = 0x86400000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    325 	CORE_0x21_0x25_INTERNAL_RAM :      ORIGIN = 0x86500000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    326 	CORE_0x21_0x26_INTERNAL_RAM :      ORIGIN = 0x86600000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    327 	CORE_0x21_0x27_INTERNAL_RAM :      ORIGIN = 0x86700000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    328 	CORE_0x22_0x24_INTERNAL_RAM :      ORIGIN = 0x8a400000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    329 	CORE_0x22_0x25_INTERNAL_RAM :      ORIGIN = 0x8a500000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    330 	CORE_0x22_0x26_INTERNAL_RAM :      ORIGIN = 0x8a600000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    331 	CORE_0x22_0x27_INTERNAL_RAM :      ORIGIN = 0x8a700000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    332 	CORE_0x23_0x24_INTERNAL_RAM :      ORIGIN = 0x8e400000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    333 	CORE_0x23_0x25_INTERNAL_RAM :      ORIGIN = 0x8e500000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    334 	CORE_0x23_0x26_INTERNAL_RAM :      ORIGIN = 0x8e600000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    335 	CORE_0x23_0x27_INTERNAL_RAM :      ORIGIN = 0x8e700000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    336 	CORE_0x24_0x24_INTERNAL_RAM :      ORIGIN = 0x82000000+LENGTH(RESERVED_CRT0_RAM),      LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
    337    
    338  }
    339 
    340 
    341 SECTIONS
    342 {
    343 
    344    IVT 0 : {*.o(IVT)  } > RESERVED_CRT0_RAM
    345    RESERVED_CRT0 : {*.o(RESERVED_CRT0)  } > RESERVED_CRT0_RAM
    346    RESERVED_CRT0 : {*.o(reserved_crt0)  } > RESERVED_CRT0_RAM
    347    
    348    CORE_RAM_0 :   {*.o(core_ram_0)  }  > BANK0_SRAM
    349    CORE_RAM_1 :   {*.o(core_ram_1)  }  > BANK1_SRAM
    350    CORE_RAM_2 :   {*.o(core_ram_2)  }  > BANK2_SRAM
    351    CORE_RAM_3 :   {*.o(core_ram_3)  }  > BANK3_SRAM
    352    
    353    SRAM_SOUTH :  {*.o(sram)  }  > EXTERNAL_SRAM
    354    DRAM_WEST :  {*.o(dram)  }  > EXTERNAL_DRAM_1
    355    
    356    CORE_INTERNAL :  {*.o(core_ram_internal)  }    /*> INTERNAL_RAM*/
    357    
    358    /* the newlib  (libc and libm)  library is maped to the dedicated section */
    359    
    360    __new_lib_start_external_ =  ( ORIGIN(EXTERNAL_DRAM_0) + __PROG_SIZE_FOR_CORE__ *__CORE_NUM_ );
    361    __new_lib_start_ = DEFINED(__USE_INTERNAL_MEM_FOR_NEW_LIB_) ? ORIGIN(BANK1_SRAM) :  __new_lib_start_external_ ;
    362    
    363    NEW_LIB_RO ${RELOCATING+__new_lib_start_} : { lib_a-*.o(.text  .rodata )  *.o(libgloss_epiphany)  }  /*  > INTERNAL_RAM*/
    364    GNU_C_BUILTIN_LIB_RO     ADDR(NEW_LIB_RO) + SIZEOF(NEW_LIB_RO) : {  
    365    								*mulsi3.o(.text  .rodata)  *modsi3.o(.text  .rodata)
    366    								*divsi3.o(.text  .rodata)  	*udivsi3.o(.text  .rodata)
    367    							    *umodsi3.o(.text  .rodata)   _*.o(.text  .rodata) 
    368    } 
    369  					 								
    370    NEW_LIB_WR   ADDR(GNU_C_BUILTIN_LIB_RO) + SIZEOF(GNU_C_BUILTIN_LIB_RO)  : { lib_a-*.o(.data ) }    /* >  INTERNAL_RAM*/ 
    371    
    372    
    373    __init_start = DEFINED(__USE_INTERNAL_MEM_) ? ORIGIN(BANK1_SRAM) :  (ADDR(NEW_LIB_WR) + SIZEOF(NEW_LIB_WR) ) ; 
    374    __init_start = DEFINED(__USE_INTERNAL_MEM_FOR_NEW_LIB_) ? ADDR(NEW_LIB_WR) + SIZEOF(NEW_LIB_WR)  : __init_start;
    375    
    376 
    377   /* Read-only sections, merged into text segment: */
    378   /*${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}}*/
    379   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + SIZEOF_HEADERS;}}
    380   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + SIZEOF_HEADERS;}}
    381   ${INITIAL_READONLY_SECTIONS}
    382   .note.gnu.build-id : { *(.note.gnu.build-id) }
    383 EOF
    384 
    385 test -n "${RELOCATING+0}" || unset NON_ALLOC_DYN
    386 test -z "${NON_ALLOC_DYN}" || TEXT_DYNAMIC=
    387 cat > ldscripts/dyntmp.$$ <<EOF
    388   ${TEXT_DYNAMIC+${DYNAMIC}}
    389   .hash         ${RELOCATING-0} : { *(.hash) }
    390   .gnu.hash     ${RELOCATING-0} : { *(.gnu.hash) }
    391   .dynsym       ${RELOCATING-0} : { *(.dynsym) }
    392   .dynstr       ${RELOCATING-0} : { *(.dynstr) }
    393   .gnu.version  ${RELOCATING-0} : { *(.gnu.version) }
    394   .gnu.version_d ${RELOCATING-0}: { *(.gnu.version_d) }
    395   .gnu.version_r ${RELOCATING-0}: { *(.gnu.version_r) }
    396 EOF
    397 
    398 if [ "x$COMBRELOC" = x ]; then
    399   COMBRELOCCAT="cat >> ldscripts/dyntmp.$$"
    400 else
    401   COMBRELOCCAT="cat > $COMBRELOC"
    402 fi
    403 eval $COMBRELOCCAT <<EOF
    404   .rel.init     ${RELOCATING-0} : { *(.rel.init) }
    405   .rela.init    ${RELOCATING-0} : { *(.rela.init) }
    406   .rel.text     ${RELOCATING-0} : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) }
    407   .rela.text    ${RELOCATING-0} : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) }
    408   .rel.fini     ${RELOCATING-0} : { *(.rel.fini) }
    409   .rela.fini    ${RELOCATING-0} : { *(.rela.fini) }
    410   .rel.rodata   ${RELOCATING-0} : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) }
    411   .rela.rodata  ${RELOCATING-0} : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) }
    412   ${OTHER_READONLY_RELOC_SECTIONS}
    413   .rel.data.rel.ro ${RELOCATING-0} : { *(.rel.data.rel.ro${RELOCATING+* .rel.gnu.linkonce.d.rel.ro.*}) }
    414   .rela.data.rel.ro ${RELOCATING-0} : { *(.rela.data.rel.ro${RELOCATING+* .rela.gnu.linkonce.d.rel.ro.*}) }
    415   .rel.data     ${RELOCATING-0} : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) }
    416   .rela.data    ${RELOCATING-0} : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) }
    417   .rel.tdata	${RELOCATING-0} : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) }
    418   .rela.tdata	${RELOCATING-0} : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) }
    419   .rel.tbss	${RELOCATING-0} : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) }
    420   .rela.tbss	${RELOCATING-0} : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) }
    421   .rel.ctors    ${RELOCATING-0} : { *(.rel.ctors) }
    422   .rela.ctors   ${RELOCATING-0} : { *(.rela.ctors) }
    423   .rel.dtors    ${RELOCATING-0} : { *(.rel.dtors) }
    424   .rela.dtors   ${RELOCATING-0} : { *(.rela.dtors) }
    425   .rel.got      ${RELOCATING-0} : { *(.rel.got) }
    426   .rela.got     ${RELOCATING-0} : { *(.rela.got) }
    427   ${OTHER_GOT_RELOC_SECTIONS}
    428   ${REL_SDATA}
    429   ${REL_SBSS}
    430   ${REL_SDATA2}
    431   ${REL_SBSS2}
    432   .rel.bss      ${RELOCATING-0} : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) }
    433   .rela.bss     ${RELOCATING-0} : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) }
    434   ${REL_LARGE}
    435 EOF
    436 
    437 if [ -n "$COMBRELOC" ]; then
    438 cat >> ldscripts/dyntmp.$$ <<EOF
    439   .rel.dyn      ${RELOCATING-0} :
    440     {
    441 EOF
    442 sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/      \1/' $COMBRELOC >> ldscripts/dyntmp.$$
    443 cat >> ldscripts/dyntmp.$$ <<EOF
    444     }
    445   .rela.dyn     ${RELOCATING-0} :
    446     {
    447 EOF
    448 sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/      \1/' $COMBRELOC >> ldscripts/dyntmp.$$
    449 cat >> ldscripts/dyntmp.$$ <<EOF
    450     }
    451 EOF
    452 fi
    453 
    454 cat >> ldscripts/dyntmp.$$ <<EOF
    455   .rel.plt      ${RELOCATING-0} : { *(.rel.plt) }
    456   .rela.plt     ${RELOCATING-0} : { *(.rela.plt) }
    457   ${OTHER_PLT_RELOC_SECTIONS}
    458 EOF
    459 
    460 if test -z "${NON_ALLOC_DYN}"; then
    461   if test -z "${NO_REL_RELOCS}${NO_RELA_RELOCS}"; then
    462     cat ldscripts/dyntmp.$$
    463   else
    464     if test -z "${NO_REL_RELOCS}"; then
    465       sed -e '/^[ 	]*\.rela\.[^}]*$/,/}/d' -e '/^[ 	]*\.rela\./d' ldscripts/dyntmp.$$
    466     fi
    467     if test -z "${NO_RELA_RELOCS}"; then
    468       sed -e '/^[ 	]*\.rel\.[^}]*$/,/}/d' -e '/^[ 	]*\.rel\./d' ldscripts/dyntmp.$$
    469     fi
    470   fi
    471   rm -f ldscripts/dyntmp.$$
    472 fi
    473 
    474 cat <<EOF
    475  
    476   .init  __init_start  : 
    477   {   
    478     ${RELOCATING+${INIT_START}}
    479     KEEP (*(.init))
    480     ${RELOCATING+${INIT_END}}
    481   }     /*> INTERNAL_RAM*/ =${NOP-0}
    482 
    483   ${TEXT_PLT+${PLT}}
    484   ${TINY_READONLY_SECTION}
    485   
    486   .fini ${RELOCATING+ADDR(.init)+SIZEOF(.init)} ${RELOCATING-0} :
    487   {
    488     ${RELOCATING+${FINI_START}}
    489     KEEP (*(.fini))
    490     ${RELOCATING+${FINI_END}}
    491   }    /*> INTERNAL_RAM*/ =${NOP-0}
    492   
    493   .text ${RELOCATING+ADDR(.fini)+SIZEOF(.fini)} ${RELOCATING-0} :
    494   {
    495     ${RELOCATING+${TEXT_START_SYMBOLS}}
    496     *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
    497     /* .gnu.warning sections are handled specially by elf32.em.  */
    498     *(.gnu.warning)
    499     ${RELOCATING+${OTHER_TEXT_SECTIONS}}
    500   }    /*> INTERNAL_RAM */ =${NOP-0}
    501 
    502   ${RELOCATING+PROVIDE (__${ETEXT_NAME} = .);}
    503   ${RELOCATING+PROVIDE (_${ETEXT_NAME} = .);}
    504   ${RELOCATING+PROVIDE (${ETEXT_NAME} = .);}
    505   ${WRITABLE_RODATA-${RODATA}}
    506   .rodata1      ${RELOCATING-0} : { *(.rodata1) } 
    507   ${CREATE_SHLIB-${SDATA2}}
    508   ${CREATE_SHLIB-${SBSS2}}
    509   ${OTHER_READONLY_SECTIONS}
    510   .eh_frame_hdr : { *(.eh_frame_hdr) }
    511   .eh_frame     ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) }
    512   .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
    513 
    514   /* Adjust the address for the data segment.  We want to adjust up to
    515      the same address within the page on the next page up.  */
    516   ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}}
    517   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
    518   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
    519 
    520   /* Exception handling  */
    521   .eh_frame     ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) }
    522   .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
    523 
    524   /* Thread Local Storage sections  */
    525   .tdata	${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
    526   .tbss		${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
    527 
    528   .preinit_array   ${RELOCATING-0} :
    529   {
    530     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_start = .);}}
    531     KEEP (*(.preinit_array))
    532     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_end = .);}}
    533   } 
    534   .init_array   ${RELOCATING-0} :
    535   {
    536      ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_start = .);}}
    537      KEEP (*(SORT(.init_array.*)))
    538      KEEP (*(.init_array))
    539      ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_end = .);}}
    540   }  
    541   .fini_array   ${RELOCATING-0} :
    542   {
    543     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_start = .);}}
    544     KEEP (*(.fini_array))
    545     KEEP (*(SORT(.fini_array.*)))
    546     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_end = .);}}
    547   } 
    548   ${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}}
    549   ${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}}
    550   .jcr          ${RELOCATING-0} : { KEEP (*(.jcr)) }
    551 
    552   ${RELOCATING+${DATARELRO}}
    553   ${OTHER_RELRO_SECTIONS}
    554   ${TEXT_DYNAMIC-${DYNAMIC}}
    555   ${DATA_GOT+${RELRO_NOW+${GOT}}}
    556   ${DATA_GOT+${RELRO_NOW+${GOTPLT}}}
    557   ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT+${GOT}}}}
    558   ${RELOCATING+${DATA_SEGMENT_RELRO_END}}
    559   ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT-${GOT}}}}
    560   ${DATA_GOT+${RELRO_NOW-${GOTPLT}}}
    561 
    562   ${DATA_PLT+${PLT_BEFORE_GOT-${PLT}}}
    563 
    564   .data ${RELOCATING+ADDR(.dtors)+SIZEOF(.dtors)} ${RELOCATING-0} :
    565   {
    566     ${RELOCATING+${DATA_START_SYMBOLS}}
    567     *(.data${RELOCATING+ .data.* .gnu.linkonce.d.*})
    568     ${CONSTRUCTING+SORT(CONSTRUCTORS)}
    569   }  /*> INTERNAL_RAM*/
    570   .data1        ${RELOCATING-0} : { *(.data1) }  
    571   ${WRITABLE_RODATA+${RODATA}}
    572   ${OTHER_READWRITE_SECTIONS}
    573   ${SMALL_DATA_CTOR+${RELOCATING+${CTOR}}}
    574   ${SMALL_DATA_DTOR+${RELOCATING+${DTOR}}}
    575   ${DATA_PLT+${PLT_BEFORE_GOT+${PLT}}}
    576   ${SDATA_GOT+${RELOCATING+${OTHER_GOT_SYMBOLS}}}
    577   ${SDATA_GOT+${GOT}}
    578   ${SDATA_GOT+${OTHER_GOT_SECTIONS}}
    579   ${SDATA}
    580   ${OTHER_SDATA_SECTIONS}
    581   ${RELOCATING+${DATA_END_SYMBOLS-${USER_LABEL_PREFIX}_edata = .; PROVIDE (${USER_LABEL_PREFIX}edata = .);}}
    582   /* Align ___bss_start and _end to a multiple of 8 so that we can use strd
    583      to clear bss.  N.B., without adding any extra alignment, we would have
    584      to clear the bss byte by byte.  */
    585   ${RELOCATING+. = ALIGN(8);}
    586   ${RELOCATING+___bss_start = .;}
    587   ${RELOCATING+${OTHER_BSS_SYMBOLS}}
    588   ${SBSS}
    589   ${BSS_PLT+${PLT}}
    590   .bss ${RELOCATING+ADDR(.rodata)+SIZEOF(.rodata)} ${RELOCATING-0} :
    591   {
    592    *(.dynbss)
    593    *(.bss${RELOCATING+ .bss.* .gnu.linkonce.b.*})
    594    *(COMMON)
    595    /* Align here to ensure that the .bss section occupies space up to
    596       _end.  Align after .bss to ensure correct alignment even if the
    597       .bss section disappears because there are no input sections.
    598       FIXME: Why do we need it? When there is no .bss section, we don't
    599       pad the .data section.  */
    600    ${RELOCATING+. = ALIGN(. != 0 ? ${ALIGNMENT} : 1);}
    601   }  /*> INTERNAL_RAM*/
    602   ${OTHER_BSS_SECTIONS}
    603   ${RELOCATING+${OTHER_BSS_END_SYMBOLS}}
    604   ${RELOCATING+. = ALIGN(${ALIGNMENT});}
    605   ${LARGE_SECTIONS}
    606   ${RELOCATING+. = ALIGN(${ALIGNMENT});}
    607   ${RELOCATING+. = ALIGN(8);}
    608   ${RELOCATING+${OTHER_END_SYMBOLS}}
    609   ${RELOCATING+${END_SYMBOLS-${USER_LABEL_PREFIX}_end = .; PROVIDE (${USER_LABEL_PREFIX}end = .);}}
    610   ${RELOCATING+${DATA_SEGMENT_END}}
    611 EOF
    612 
    613 if test -n "${NON_ALLOC_DYN}"; then
    614   if test -z "${NO_REL_RELOCS}${NO_RELA_RELOCS}"; then
    615     cat ldscripts/dyntmp.$$
    616   else
    617     if test -z "${NO_REL_RELOCS}"; then
    618       sed -e '/^[ 	]*\.rela\.[^}]*$/,/}/d' -e '/^[ 	]*\.rela\./d' ldscripts/dyntmp.$$
    619     fi
    620     if test -z "${NO_RELA_RELOCS}"; then
    621       sed -e '/^[ 	]*\.rel\.[^}]*$/,/}/d' -e '/^[ 	]*\.rel\./d' ldscripts/dyntmp.$$
    622     fi
    623   fi
    624   rm -f ldscripts/dyntmp.$$
    625 fi
    626 
    627 cat <<EOF
    628   /* Stabs debugging sections.  */
    629   .stab          0 : { *(.stab) }
    630   .stabstr       0 : { *(.stabstr) }
    631   .stab.excl     0 : { *(.stab.excl) }
    632   .stab.exclstr  0 : { *(.stab.exclstr) }
    633   .stab.index    0 : { *(.stab.index) }
    634   .stab.indexstr 0 : { *(.stab.indexstr) }
    635 
    636   .comment       0 : { *(.comment) }
    637 
    638 EOF
    639 
    640 . $srcdir/scripttempl/DWARF.sc
    641 
    642 cat <<EOF
    643   ${TINY_DATA_SECTION}
    644   ${TINY_BSS_SECTION}
    645 
    646   /*${STACK_ADDR+${STACK}}*/
    647   
    648   PROVIDE ( __stack_start_ = ORIGIN(EXTERNAL_DRAM_0) + __PROG_SIZE_FOR_CORE__ * __CORE_NUM_ + __PROG_SIZE_FOR_CORE__  - 0x10) ;
    649   .stack ${RELOCATING+__stack_start_} :  {    ___stack = .;    *(.stack)  }
    650 
    651   PROVIDE (  ___heap_start = ORIGIN(EXTERNAL_DRAM_1)  + __HEAP_SIZE_FOR_CORE__ * __CORE_NUM_ );
    652   /*.heap_start      __heap_start_    :  {    _heap_start_ = .;    *(.heap_start)  }*/
    653 
    654   PROVIDE (  ___heap_end =   ORIGIN(EXTERNAL_DRAM_1)  + __HEAP_SIZE_FOR_CORE__ * __CORE_NUM_  + __HEAP_SIZE_FOR_CORE__ - 4 );
    655   
    656   
    657  /* .heap_end      __heap_end_    :  {    _heap_end_ = .;    *(.heap_end)  }*/
    658 
    659 
    660   ${ATTRS_SECTIONS}
    661   ${OTHER_SECTIONS}
    662   ${RELOCATING+${OTHER_SYMBOLS}}
    663   ${RELOCATING+${DISCARDED}}
    664 }
    665 EOF
    666