/* -----------------------------------------------------------------------
 *   
 *   Copyright 2008-2009 H. Peter Anvin - All Rights Reserved
 *   Copyright 2009 Intel Corporation; author: H. Peter Anvin
 *
 *   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, Inc., 51 Franklin St, Fifth Floor,
 *   Boston MA 02110-1301, USA; either version 2 of the License, or
 *   (at your option) any later version; incorporated herein by reference.
 *
 * ----------------------------------------------------------------------- */

/*
 * Linker script for the SYSLINUX core
 */

OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(_start)

SECTIONS
{
	. = 0;
	ImageBase = .;		/* For gnu-efi's crt0 */
	__module_start = .;
	. = SEGMENT_START("text-segment", 0) + SIZEOF_HEADERS;
	.text : {
		FILL(0x90909090)
		__text_start = .;
		*(.text)
		*(.text.*)
		__text_end = .;
	}

	. = ALIGN(16);

	.rodata : {
		__rodata_start = .;
		*(.rodata)
		*(.rodata.*)
		__rodata_end = .;
	}

	. = ALIGN(4);

	.ctors : {
		__ctors_start = .;
		KEEP (*(SORT(.ctors.*)))
		KEEP (*(.ctors))
		__ctors_end = .;
	}

	.dtors : {
		__dtors_start = .;
		KEEP (*(SORT(.dtors.*)))
		KEEP (*(.dtors))
		__dtors_end = .;
	}

	. = ALIGN(4096);
	.rel : {
		*(.rel.got)
		*(.rel.data)
		*(.rel.data.*)
		*(.rel.ctors)
	}

	. = ALIGN(4);

	.gnu.hash : {
		__gnu_hash_start = .;
		*(.gnu.hash)
		__gnu_hash_end = .;
	}


	.dynsym : {
		__dynsym_start = .;
		*(.dynsym)
		__dynsym_end = .;
	}

	. = ALIGN(4);

	.dynstr : {
		__dynstr_start = .;
		*(.dynstr)
		__dynstr_end = .;
	}

	. = ALIGN(4);

	.dynlink : {
		__dynlink_start = .;
		*(.dynlink)
		__dynlink_end = .;
	}

	. = ALIGN(4);

	.got : {
		__got_start = .;
		KEEP (*(.got.plt))
		KEEP (*(.got))
		__got_end = .;
	}

	. = ALIGN(4);

	.dynamic : {
		__dynamic_start = .;
		*(.dynamic)
		__dynamic_end = .;
	}

	. = ALIGN(16);

	.data : {
		__data_start = .;
		*(.data)
		*(.data.*)
		*(.lowmem)
		__data_end = .;
	}

	.reloc : {
		*(.reloc)
	}

	.symtab : {
		*(.symtab)
	}

	.strtab : {
		*(.strtab)
	}

	.bss (NOLOAD) : {
		/* the EFI loader doesn't seem to like a .bss section,
		   so we stick it all into .data: */
		__bss_start = .;
		*(.bss)
		*(.bss.*)
		*(.bss16)
		*(.hugebss)
		*(COMMON)
		__bss_end = .;
		*(.sbss)
		*(.scommon)
	}
	__bss_len = ABSOLUTE(__bss_end) - ABSOLUTE(__bss_start);
	__bss_dwords = (__bss_len + 3) >> 2;

	. = ALIGN(128);

	/* Very large objects which don't need to be zeroed */

	.hugebss : {
		__hugebss_start = .;
		*(.hugebss)
		*(.hugebss.*)
		__hugebss_end = .;
	}

	_end = .;

	/* Stuff we don't need... */
	/DISCARD/ : {
		*(.eh_frame)
		*(.comment)
	}
}
