/*
 *      dpx2.ifile - for collectless G++ on Bull DPX/2
 *	
 *      Peter Schauer <Peter.Schauer@regent.e-technik.tu-muenchen.dbp.de>
 *
 *      Install this file as $prefix/gcc-lib/dpx2/VERSION/gcc.ifile
 *	and comment out the lines referring to COLLECT at the top
 *      of Makefile before building GCC.
 *	
 *      This file has been tested with gcc-2.2.2 on a DPX/2 340
 *      running BOS 2.00.45, if it doesn't work for you, stick
 *      with collect.
 *	--sjg
 */
/*
 *	Ifile to link with memory configured at 0.
 *	BLOCK to an offset that leaves room for many headers ( the value
 *	here allows for a file header, an outheader, and up to 11 section 
 *	headers on most systems.
 *	BIND to an address that excludes page 0 from being mapped. The value
 *	used for BLOCK should be or'd into this value. Here I'm setting BLOCK
 *	to 0x200 and BIND to ( 0x100000 | value_used_for(BLOCK) )
 *	If you are using shared libraries, watch that you don't overlap the
 *	address ranges assigned for shared libs.
 *
 *	GROUP BIND to a location in the next segment.  Here, the only value
 *	that you should change (I think) is that within NEXT, which I've set
 *	to my hardware segment size. You can always use a larger size, but not
 *	a smaller one.
 */
SECTIONS
{
	.text BIND(0x100200) BLOCK (0x200) :
	{
		 /* plenty of room for headers */
		*(.init)
		*(.text)
		_vfork = _fork; /* I got tired of editing peoples sloppy code */
		*(.fini)
	}
	GROUP BIND( NEXT(0x100000) + (ADDR(.text) + (SIZEOF(.text)) % 0x1000)):
	{
			.data : {
				___CTOR_LIST__ = . ; 
				. += 4 ;	/* leading NULL */
				*(.ctor) 
				. += 4 ;	/* trailing NULL */
				___DTOR_LIST__ = . ;
				. += 4 ;	/* leading NULL */
				*(.dtor) 
				. += 4 ; 	/* trailing NULL */
			 }
			.bss : { }
	}
}
