# Copyright (C) 2014-2021 Free Software Foundation, Inc.
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.

cat <<EOF
/* Copyright (C) 2014-2021 Free Software Foundation, Inc.

   Copying and distribution of this script, with or without modification,
   are permitted in any medium without royalty provided the copyright
   notice and this notice are preserved.  */

OUTPUT_FORMAT("${OUTPUT_FORMAT}")
OUTPUT_ARCH(${ARCH})
EOF

test -n "${RELOCATING}" && cat <<EOF
ENTRY ("_start")
MEMORY
{
	vectarea : o =0xc00000, l = 0x0300

	introm    : o = 0xc00300, l = 0x16000
	/* The stack starts at the top of main ram.  */

	dram   : o = 0x8000 , l = 0xffff
	/* At the very top of the address space is the 8-bit area.  */

	ldata	: o =0x4000 ,l = 0x0200
}

EOF

cat <<EOF
SECTIONS
{
/*.vects :
	{
	  *(.vects)
	} ${RELOCATING+ > vectarea} */
.init :
	{
	  KEEP (*(SORT_NONE(.init)))
	  ${RELOCATING+KEEP (*(SORT_NONE(.fini)))}
	} ${RELOCATING+ >introm}

.text :
	{
	  ${RELOCATING+*(.rodata)}
	  ${RELOCATING+*(.text.*)}
	  *(.text)
	  ${RELOCATING+ _etext = . ; }
	} ${RELOCATING+ > introm}
.data :
	{
	  *(.data)
	  ${RELOCATING+*(.data.*)}

	  ${RELOCATING+ _edata = . ; }
	} ${RELOCATING+ > dram}

.bss :
	{
	  ${RELOCATING+ _bss_start = . ;}
	  *(.bss)
	  ${RELOCATING+*(COMMON)}
	  ${RELOCATING+ _end = . ;  }
	} ${RELOCATING+ > dram}

.ldata :
	{
	  *(.ldata)
	} ${RELOCATING+ > ldata}

.vects :
	{
	  *(.vects)
	} ${RELOCATING+ > vectarea}
}
EOF
