| # 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) |
| # |
| # Copyright (C) 2014-2016 Free Software Foundation, Inc. |
| # |
| # Copying and distribution of this file, with or without modification, |
| # are permitted in any medium without royalty provided the copyright |
| # notice and this notice are preserved. |
| # |
| # These are substituted in as variables in order to get '}' in a shell |
| # conditional expansion. |
| |
| INIT='.init : { *(.init) }' |
| FINI='.fini : { *(.fini) }' |
| |
| cat <<EOF |
| /* Copyright (C) 2014-2016 Free Software Foundation, Inc. |
| |
| Copying and distribution of this script, with or without modification, |
| are permitted in any medium without royalty provided the copyright |
| notice and this notice are preserved. */ |
| |
| 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. |
| */ |
| |
| ${RELOCATING+ENTRY (mainCRTStartup)} |
| |
| SECTIONS |
| { |
| |
| /* text - the usual meaning */ |
| .text ${RELOCATING+ __image_base__ + __section_alignment__ } : |
| { |
| ${RELOCATING+ *(.init);} |
| *(.text) |
| ${RELOCATING+ *(.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 |