/* PHDRS specifies ELF Program Headers (or segments) to the plugin linker */
PHDRS {
  plugin PT_LOAD ; /* Specifies that the plugin segment should be loaded from file */
  shorts PT_LOAD ; /* Specifies that the shorts segment should be loaded from file */
}

SECTIONS {
	.text 0: {
		_ftext = . ;
		*(.text)
		*(.text.*)
		*(.gnu.linkonce.t*)
		KEEP(*(.init))
		KEEP(*(.fini))
		QUAD(0)
	} : plugin /*The ": plugin" tells the linker to assign this and
  	             the following sections to the "plugin" segment*/
	PROVIDE(_etext = .);
	PROVIDE(etext = .);

	.reginfo : { *(.reginfo) }

	/* Global/static constructors and deconstructors. */
	.ctors ALIGN(16): {
	        ___plugin_ctors = .;
		KEEP(*(SORT(.ctors.*)))
		KEEP(*(.ctors))
		___plugin_ctors_end = .;
	}
	.dtors ALIGN(16): {
		___plugin_dtors = .;
		KEEP(*(SORT(.dtors.*)))
		KEEP(*(.dtors))
		___plugin_dtors_end = .;
	}

	/* Static data.  */
	.rodata ALIGN(128): {
		*(.rodata)
		*(.rodata.*)
		*(.gnu.linkonce.r*)
	}

	.data ALIGN(128): {
		_fdata = . ;
		*(.data)
		*(.data.*)
		*(.gnu.linkonce.d*)
		SORT(CONSTRUCTORS)
	}

	.rdata ALIGN(128): { *(.rdata) }
	.gcc_except_table ALIGN(128): { *(.gcc_except_table) }

	.bss ALIGN(128) : {
		*(.bss)
		*(.bss.*)
		*(.gnu.linkonce.b*)
		*(COMMON)
	}
	_end_bss = .;

	_end = . ;
	PROVIDE(end = .);

	/* Symbols needed by crt0.s.  */
	PROVIDE(_heap_size = -1);
	PROVIDE(_stack = -1);
	PROVIDE(_stack_size = 128 * 1024);	

	/*We assign the output location counter to the plugin hole made
   	  in main_prog.ld, then assign the small data sections to the shorts segment*/
	. = __plugin_hole_start;
	.lit4 ALIGN(128): { *(.lit4) } : shorts
	.lit8 ALIGN(128): { *(.lit8) }

	.sdata ALIGN(128): {
		*(.sdata)
		*(.sdata.*)
		*(.gnu.linkonce.s*)
	}

	_edata = .;
	PROVIDE(edata = .);

	/* Uninitialized data.  */
	.sbss ALIGN(128) : {
		_fbss = . ;
		*(.sbss)
		*(.sbss.*)
		*(.gnu.linkonce.sb*)
		*(.scommon)
	}
}