/* Test linker script for OpenRISC.

   Copyright (C) 2017-2021 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

MEMORY
{
    /* The exception vectors actually start at 0x100, but if you specify
       that address here, the "--output-target binary" step will start from
       address 0 with the contents meant for address 0x100.  */
    exception_vectors : ORIGIN =  0 , LENGTH = 8K
    ram               : ORIGIN =  8K, LENGTH = 2M - 8K
}

SECTIONS
{
    .exception_vectors :
    {
	KEEP(*(.exception_vectors))
    } > exception_vectors

    .text :
    {
	*(.text)
	*(.text.*)
	*(.rodata)
	*(.rodata.*)
    } > ram

    .data :
    {
	*(.data)
	*(.data.*)
    } > ram

    .bss :
    {
	*(.bss)
	*(.bss.*)

	/* WARNING about section size alignment:
	   The start-up assembly code can only clear BSS section sizes
	   which are aligned to 4 bytes.  However, the size of the BSS
	   section may not be aligned, therefore up to 3 bytes more could
	   be zeroed on start-up.  This is normally not an issue, as the
	   start of the next section is usually aligned too, so those extra
	   bytes should be just padding.  I did try the following trick to
	   align the BSS section size, to no avail:

	   . = ALIGN(., 4);
	*/
    } > ram

    _bss_begin = ADDR(.bss);
    _bss_end   = _bss_begin + SIZEOF(.bss);

    .stack ALIGN(16) (NOLOAD):
    {
      *(.stack)
    } > ram
}

ENTRY(_start)  /* Otherwise, --gc-sections would throw everything away. */
