# A PE linker script for PowerPC.
# Loosely based on Steve Chamberlain's pe.sc.
# All new mistakes should be credited to Kim Knuttila (krk@cygnus.com)
#
# These are substituted in as variables in order to get '}' in a shell
# conditional expansion.
INIT='.init : { *(.init) }'
FINI='.fini : { *(.fini) }'
cat <<EOF
OUTPUT_FORMAT(${OUTPUT_FORMAT})
${LIB_SEARCH_DIRS}

/* Much of this layout was determined by delving into .exe files for
   the box generated by other compilers/linkers/etc. This means that
   if a particular feature did not happen to appear in one of the 
   subject files, then it may not be yet supported.
*/

/* It's "mainCRTStartup", not "_mainCRTStartup", and it's located in
   one of the two .lib files (libc.lib and kernel32.lib) that currently
   must be present on the link line. This means that you must use 
   "-u mainCRTStartup" to make sure it gets included in the link.
*/

ENTRY(mainCRTStartup)

SECTIONS
{

  /* text - the usual meaning */
  .text ${RELOCATING+ __image_base__ + __section_alignment__ } : 
	{
	    ${RELOCATING+ *(.init);}
	    *(.text)
	    *(.gcc_except_table)
	    ${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ; 
		        LONG (-1); *(.ctors); *(.ctor); LONG (0); }
            ${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ; 
			LONG (-1); *(.dtors); *(.dtor);  LONG (0); }
	    ${RELOCATING+ *(.fini);}
	    ${RELOCATING+ etext  =  .};
	}

  /* rdata - Read Only Runtime Data
     CTR sections: All of the CRT (read only C runtime data) sections 
	appear at the start of the .rdata (read only runtime data) 
	section, in the following order. Don't know if it matters or not.
	Not all sections are always present either.
     .rdata: compiler generated read only data
     .xdata: compiler generated exception handling table. (Most docs
	seem to suggest that this section is now deprecated infavor
	of the ydata section)
     .edata: The exported names table.
  */
  .rdata BLOCK(__section_alignment__) :
	{
	    *(.CRT\$XCA);
	    *(.CRT\$XCC);
	    *(.CRT\$XCZ);
	    *(.CRT\$XIA);
	    *(.CRT\$XIC);
	    *(.CRT\$XIZ);
	    *(.CRT\$XLA);
	    *(.CRT\$XLZ);
	    *(.CRT\$XPA);
	    *(.CRT\$XPX);
	    *(.CRT\$XPZ);
	    *(.CRT\$XTA);
	    *(.CRT\$XTZ);
	    *(.rdata);
	    *(.xdata);
	}

  .edata BLOCK(__section_alignment__) :
	{
    	    *(.edata);
	}

  /* data - initialized data
     .ydata: exception handling information.
     .data: the usual meaning.
     .data2: more of the same.
     .bss: For some reason, bss appears to be included in the data
	section, as opposed to being given a section of it's own.
     COMMON:
  */
  .data BLOCK(__section_alignment__) : 
	{
	    __data_start__ = . ; 
	    *(.ydata);
	    *(.data);
	    *(.data2);
	    __bss_start__ = . ;
	    *(.bss) ;
	    *(COMMON);
	    __bss_end__ = . ;
	    ${RELOCATING+ end =  .};
 	    __data_end__ = . ; 
	}

  /* The exception handling table. A sequence of 5 word entries. Section
     address and extent are placed in the DataDirectory.
  */
  .pdata BLOCK(__section_alignment__) :
	{ 					
	    *(.pdata)
 	    ;
	}

  /* The idata section is chock full of magic bits. 
	1. Boundaries around various idata parts are used to initialize
	   some of the fields of the DataDirectory. In particular, the
	   magic for 2, 4 and 5 are known to be used. Some compilers
	   appear to generate magic section symbols for this purpose.
	   Where we can, we catch such symbols and use our own. This of
	   course is something less than a perfect strategy.
	2. The table of contents is placed immediately after idata4.
	   The ".private.toc" sections are generated by the ppc bfd. The
	   .toc variable is generated by gas, and resolved here. It is
	   used to initialized function descriptors (and anyone else who
	   needs the address of the module's toc). The only thing 
	   interesting about it at all? Most ppc instructions using it
	   have a 16bit displacement field. The convention for addressing
	   is to initialize the .toc value to 32K past the start of the
	   actual toc, and subtract 32K from all references, thus using
	   the entire 64K range. Naturally, the reloc code must agree
	   on this number or you get pretty stupid results.
  */
  .idata BLOCK(__section_alignment__) :
	{ 					
	    __idata2_magic__ = .;
	    *(.idata\$2);
	    __idata3_magic__ = .;
	    *(.idata\$3);
	    __idata4_magic__ = .;
	    *(.idata\$4);
	    . = ALIGN(4);
	    .toc = . + 32768;
	    *(.private.toc);
	    __idata5_magic__ = .;
	    *(.idata\$5);
	    __idata6_magic__ = .;
	    *(.idata\$6);
	    __idata7_magic__ = .;
	    *(.idata\$7);
	    ;
	}

  /* reldata -- data that requires relocation
  */
  .reldata BLOCK(__section_alignment__) :
	{ 					
	    *(.reldata)
 	    ;
	}


  /* Resources */
  .rsrc BLOCK(__section_alignment__) :
	{ 					
	    *(.rsrc\$01)
	    *(.rsrc\$02)
	    ;
	}

  .stab BLOCK(__section_alignment__)  ${RELOCATING+(NOLOAD)} : 
  {
    [ .stab ]
  }

  .stabstr BLOCK(__section_alignment__) ${RELOCATING+(NOLOAD)} :
  {
    [ .stabstr ]
  }

  /* The .reloc section is currently generated by the dlltool from Steve 
     Chamberlain in a second pass of linking. Section address and extent
     are placed in the DataDirectory.
  */
  .reloc BLOCK(__section_alignment__) :
	{ 					
	    *(.reloc)
	    ;
	}

  /* We don't do anything useful with codeview debugger support or the
     directive section (yet). Hopefully, we junk them correctly. 
  */
  /DISCARD/ BLOCK(__section_alignment__) : 
	{
    	    *(.debug\$S)
    	    *(.debug\$T)
    	    *(.debug\$F)
    	    *(.drectve)
    	    ;
   	}
}
EOF
