/*
 * \brief  Linker script for Genode programs
 * \author Christian Helmuth
 * \date   2006-04-12
 */

/*
 * Copyright (C) 2006-2012 Genode Labs GmbH
 *
 * This file is part of the Genode OS framework, which is distributed
 * under the terms of the GNU General Public License version 2.
 */

/* values taken from Codezero's mm0 linker script */
/*physical_base = 0x00208000;*/
/*virtual_base  = 0xe0000000;*/
/*offset        = virtual_base - physical_base;*/

/*
 * Addresses correspond to the linker script generated by
 * the Codezero build system.
 */
vma_start = 0x100000;
lma_start = 0x40000;
offset = vma_start - lma_start;


ENTRY(_start)

PHDRS
{
  ro PT_LOAD;
  rw PT_LOAD;
}

SECTIONS
{
	. = vma_start;

	.text : AT (ADDR(.text) - offset) {
		/* begin of program image (link address) */
		_prog_img_beg = .;

		*(.text.crt0)
		*(.init)
		*(.text .text.* .gnu.linkonce.t.*)
		*(.fini)
		*(.rodata .rodata.* .gnu.linkonce.r.*)

		. = ALIGN(0x08);

		_ctors_start = .;
		KEEP (*(.ctors))
		KEEP (*(SORT(.ctors.*)))
		KEEP (*(.init_array)) /* list of constructors specific for ARM eabi */
		_ctors_end = .;
		_dtors_start = .;
		KEEP (*(SORT(.dtors.*)))
		KEEP (*(.dtors))
		_dtors_end = .;
	} : ro = 0x90909090

	/* Linux: exception section for uaccess mechanism */
	__ex_table : { *(__ex_table) }

	.eh_frame_hdr : { *(.eh_frame_hdr) }

	. = ALIGN(0x1000);

	_prog_img_data = .;

	.data : AT (ADDR(.data) - offset) {
		/*
		 * Leave space for parent capability parameters at start of data
		 * section. The protection domain creator is reponsible for storing
		 * sane values here.
		 */
		_parent_cap = .;
		LONG(0xffffffff);
		LONG(0xffffffff);
		_vma_start = .;
		LONG(vma_start);
		_lma_start = .;
		LONG(lma_start);

		*(.data .data.* .gnu.linkonce.d.*)
	} : rw

	/* exception frames for C++ */
	.eh_frame : {
		__eh_frame_start__ = .;
		KEEP (*(.eh_frame))
		LONG(0)
	} : rw

	.init_array : {
		PROVIDE_HIDDEN (__init_array_start = .);
		KEEP (*(SORT(.init_array.*)))
		KEEP (*(.init_array))
		PROVIDE_HIDDEN (__init_array_end = .);
	}

	.gcc_except_table : { KEEP(*(.gcc_except_table)) }
	.dynamic :  { *(.dynamic) }

	/* .ARM.exidx is sorted, so has to go in its own output section */
	__exidx_start = .;
	.ARM.exidx : {
		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
	}
	__exidx_end = .;

	.ARM.extab : {
		*(.ARM.extab*)
	} : rw

	. = ALIGN(4);

	.bss : AT (ADDR(.bss) - offset) {
		*(.bss .bss.* .gnu.linkonce.b.* COMMON)
	}

	/* end of program image -- must be after last section */
	_prog_img_end = .;

	/DISCARD/ : {
		*(.note)
		*(.note.ABI-tag)
		*(.comment)
	}
}
