1999-05-03 09:29:11 +02:00
|
|
|
# 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)
|
|
|
|
#
|
2020-01-01 08:57:01 +01:00
|
|
|
# Copyright (C) 2014-2020 Free Software Foundation, Inc.
|
2017-10-12 12:58:30 +02:00
|
|
|
#
|
2014-08-20 11:34:58 +02:00
|
|
|
# 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.
|
|
|
|
#
|
|
|
|
|
1999-05-03 09:29:11 +02:00
|
|
|
cat <<EOF
|
2020-01-01 08:57:01 +01:00
|
|
|
/* Copyright (C) 2014-2020 Free Software Foundation, Inc.
|
2014-08-20 11:34:58 +02:00
|
|
|
|
|
|
|
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. */
|
|
|
|
|
1999-05-03 09:29:11 +02:00
|
|
|
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
|
2017-10-12 12:58:30 +02:00
|
|
|
if a particular feature did not happen to appear in one of the
|
1999-05-03 09:29:11 +02:00
|
|
|
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
|
2017-10-12 12:58:30 +02:00
|
|
|
must be present on the link line. This means that you must use
|
1999-05-03 09:29:11 +02:00
|
|
|
"-u mainCRTStartup" to make sure it gets included in the link.
|
|
|
|
*/
|
|
|
|
|
2009-09-09 13:59:14 +02:00
|
|
|
${RELOCATING+ENTRY (mainCRTStartup)}
|
1999-05-03 09:29:11 +02:00
|
|
|
|
|
|
|
SECTIONS
|
|
|
|
{
|
|
|
|
|
|
|
|
/* text - the usual meaning */
|
2017-10-12 12:58:30 +02:00
|
|
|
.text ${RELOCATING+ __image_base__ + __section_alignment__ } :
|
1999-05-03 09:29:11 +02:00
|
|
|
{
|
Add SORT_NONE to .init and .fini in scripts
The special case for .init and .fini in update_wild_statements is
ineffective for .init or .fini wildcards inside other output sections.
The special case needs to be on the wildcard, not the output section.
This patch is belt and braces, both fixing update_wild_statements and
the scripts.
* scripttempl/alpha.sc, * scripttempl/armbpabi.sc,
* scripttempl/crisaout.sc, * scripttempl/elf32cr16.sc,
* scripttempl/elf32crx.sc, * scripttempl/elf32xc16x.sc,
* scripttempl/elf32xc16xl.sc, * scripttempl/elf32xc16xs.sc,
* scripttempl/elf64hppa.sc, * scripttempl/elf_chaos.sc,
* scripttempl/elfarc.sc, * scripttempl/elfarcv2.sc,
* scripttempl/elfd30v.sc, * scripttempl/elfm68hc11.sc,
* scripttempl/elfm68hc12.sc, * scripttempl/elfm9s12z.sc,
* scripttempl/elfmicroblaze.sc, * scripttempl/elfxgate.sc,
* scripttempl/elfxtensa.sc, * scripttempl/epiphany_4x4.sc,
* scripttempl/ft32.sc, * scripttempl/i386beos.sc,
* scripttempl/iq2000.sc, * scripttempl/mcorepe.sc,
* scripttempl/mep.sc, * scripttempl/mips.sc, * scripttempl/moxie.sc,
* scripttempl/pe.sc, * scripttempl/pep.sc, * scripttempl/ppcpe.sc,
* scripttempl/tic4xcoff.sc, * scripttempl/tic80coff.sc,
* scripttempl/v850.sc, * scripttempl/v850_rh850.sc,
* scripttempl/visium.sc, * scripttempl/xstormy16.sc: Add KEEP and
SORT_NONE to .init and .fini wildcards.
* scripttempl/elf32xc16x.sc,
* scripttempl/elf32xc16xl.sc,
* scripttempl/elf32xc16xs.sc: Add .fini wildcard.
* scripttempl/elf_chaos.sc: Add .init output section.
* scripttempl/elfd30v.sc: Remove duplicate .init.
* scripttempl/elfm68hc11.sc, * scripttempl/elfm68hc12.sc,
* scripttempl/elfm9s12z.sc, * scripttempl/elfxgate.sc: Remove
duplicate .init, and add .fini wildcard.
* scripttempl/ppcpe.sc (INIT, FINI): Delete.
* ldlang.c (update_wild_statements): Special case .init and
.fini in the wildcard, not the output section.
2019-03-21 05:28:35 +01:00
|
|
|
${RELOCATING+ KEEP (*(SORT_NONE(.init)))}
|
1999-05-03 09:29:11 +02:00
|
|
|
*(.text)
|
2009-09-03 20:04:35 +02:00
|
|
|
${RELOCATING+ *(.text.*)}
|
1999-05-03 09:29:11 +02:00
|
|
|
*(.gcc_except_table)
|
2017-10-12 12:58:30 +02:00
|
|
|
${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
|
|
|
|
LONG (-1); *(.ctors); *(.ctor); LONG (0); }
|
|
|
|
${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
|
|
|
|
LONG (-1); *(.dtors); *(.dtor); LONG (0); }
|
Add SORT_NONE to .init and .fini in scripts
The special case for .init and .fini in update_wild_statements is
ineffective for .init or .fini wildcards inside other output sections.
The special case needs to be on the wildcard, not the output section.
This patch is belt and braces, both fixing update_wild_statements and
the scripts.
* scripttempl/alpha.sc, * scripttempl/armbpabi.sc,
* scripttempl/crisaout.sc, * scripttempl/elf32cr16.sc,
* scripttempl/elf32crx.sc, * scripttempl/elf32xc16x.sc,
* scripttempl/elf32xc16xl.sc, * scripttempl/elf32xc16xs.sc,
* scripttempl/elf64hppa.sc, * scripttempl/elf_chaos.sc,
* scripttempl/elfarc.sc, * scripttempl/elfarcv2.sc,
* scripttempl/elfd30v.sc, * scripttempl/elfm68hc11.sc,
* scripttempl/elfm68hc12.sc, * scripttempl/elfm9s12z.sc,
* scripttempl/elfmicroblaze.sc, * scripttempl/elfxgate.sc,
* scripttempl/elfxtensa.sc, * scripttempl/epiphany_4x4.sc,
* scripttempl/ft32.sc, * scripttempl/i386beos.sc,
* scripttempl/iq2000.sc, * scripttempl/mcorepe.sc,
* scripttempl/mep.sc, * scripttempl/mips.sc, * scripttempl/moxie.sc,
* scripttempl/pe.sc, * scripttempl/pep.sc, * scripttempl/ppcpe.sc,
* scripttempl/tic4xcoff.sc, * scripttempl/tic80coff.sc,
* scripttempl/v850.sc, * scripttempl/v850_rh850.sc,
* scripttempl/visium.sc, * scripttempl/xstormy16.sc: Add KEEP and
SORT_NONE to .init and .fini wildcards.
* scripttempl/elf32xc16x.sc,
* scripttempl/elf32xc16xl.sc,
* scripttempl/elf32xc16xs.sc: Add .fini wildcard.
* scripttempl/elf_chaos.sc: Add .init output section.
* scripttempl/elfd30v.sc: Remove duplicate .init.
* scripttempl/elfm68hc11.sc, * scripttempl/elfm68hc12.sc,
* scripttempl/elfm9s12z.sc, * scripttempl/elfxgate.sc: Remove
duplicate .init, and add .fini wildcard.
* scripttempl/ppcpe.sc (INIT, FINI): Delete.
* ldlang.c (update_wild_statements): Special case .init and
.fini in the wildcard, not the output section.
2019-03-21 05:28:35 +01:00
|
|
|
${RELOCATING+ KEEP (*(SORT_NONE(.fini)))}
|
2017-10-12 12:58:30 +02:00
|
|
|
${RELOCATING+ etext = .};
|
1999-05-03 09:29:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* rdata - Read Only Runtime Data
|
2017-10-12 12:58:30 +02:00
|
|
|
CTR sections: All of the CRT (read only C runtime data) sections
|
|
|
|
appear at the start of the .rdata (read only runtime data)
|
1999-05-03 09:29:11 +02:00
|
|
|
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__) :
|
|
|
|
{
|
2017-10-12 12:58:30 +02:00
|
|
|
*(.edata);
|
1999-05-03 09:29:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* 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:
|
|
|
|
*/
|
2017-10-12 12:58:30 +02:00
|
|
|
.data BLOCK(__section_alignment__) :
|
1999-05-03 09:29:11 +02:00
|
|
|
{
|
2017-10-12 12:58:30 +02:00
|
|
|
__data_start__ = . ;
|
1999-05-03 09:29:11 +02:00
|
|
|
*(.ydata);
|
|
|
|
*(.data);
|
|
|
|
*(.data2);
|
|
|
|
__bss_start__ = . ;
|
|
|
|
*(.bss) ;
|
|
|
|
*(COMMON);
|
|
|
|
__bss_end__ = . ;
|
|
|
|
${RELOCATING+ end = .};
|
2017-10-12 12:58:30 +02:00
|
|
|
__data_end__ = . ;
|
1999-05-03 09:29:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* The exception handling table. A sequence of 5 word entries. Section
|
|
|
|
address and extent are placed in the DataDirectory.
|
|
|
|
*/
|
|
|
|
.pdata BLOCK(__section_alignment__) :
|
2017-10-12 12:58:30 +02:00
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
*(.pdata)
|
2017-10-12 12:58:30 +02:00
|
|
|
;
|
1999-05-03 09:29:11 +02:00
|
|
|
}
|
|
|
|
|
2017-10-12 12:58:30 +02:00
|
|
|
/* The idata section is chock full of magic bits.
|
1999-05-03 09:29:11 +02:00
|
|
|
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
|
2017-10-12 12:58:30 +02:00
|
|
|
needs the address of the module's toc). The only thing
|
1999-05-03 09:29:11 +02:00
|
|
|
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__) :
|
2017-10-12 12:58:30 +02:00
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
__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__) :
|
2017-10-12 12:58:30 +02:00
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
*(.reldata)
|
2017-10-12 12:58:30 +02:00
|
|
|
;
|
1999-05-03 09:29:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Resources */
|
|
|
|
.rsrc BLOCK(__section_alignment__) :
|
2017-10-12 12:58:30 +02:00
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
*(.rsrc\$01)
|
|
|
|
*(.rsrc\$02)
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
2017-10-12 12:58:30 +02:00
|
|
|
.stab BLOCK(__section_alignment__) ${RELOCATING+(NOLOAD)} :
|
1999-05-03 09:29:11 +02:00
|
|
|
{
|
|
|
|
[ .stab ]
|
|
|
|
}
|
|
|
|
|
|
|
|
.stabstr BLOCK(__section_alignment__) ${RELOCATING+(NOLOAD)} :
|
|
|
|
{
|
|
|
|
[ .stabstr ]
|
|
|
|
}
|
|
|
|
|
2017-10-12 12:58:30 +02:00
|
|
|
/* The .reloc section is currently generated by the dlltool from Steve
|
1999-05-03 09:29:11 +02:00
|
|
|
Chamberlain in a second pass of linking. Section address and extent
|
|
|
|
are placed in the DataDirectory.
|
|
|
|
*/
|
|
|
|
.reloc BLOCK(__section_alignment__) :
|
2017-10-12 12:58:30 +02:00
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
*(.reloc)
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We don't do anything useful with codeview debugger support or the
|
2017-10-12 12:58:30 +02:00
|
|
|
directive section (yet). Hopefully, we junk them correctly.
|
1999-05-03 09:29:11 +02:00
|
|
|
*/
|
2017-10-12 12:58:30 +02:00
|
|
|
/DISCARD/ BLOCK(__section_alignment__) :
|
1999-05-03 09:29:11 +02:00
|
|
|
{
|
2017-10-12 12:58:30 +02:00
|
|
|
*(.debug\$S)
|
|
|
|
*(.debug\$T)
|
|
|
|
*(.debug\$F)
|
|
|
|
*(.drectve)
|
|
|
|
;
|
|
|
|
}
|
1999-05-03 09:29:11 +02:00
|
|
|
}
|
|
|
|
EOF
|