# Linker script for PE.
+#
+# Copyright (C) 2014-2021 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.
if test -z "${RELOCATEABLE_OUTPUT_FORMAT}"; then
RELOCATEABLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
R_TEXT='*(SORT(.text$*))'
if test "x$LD_FLAG" = "xauto_import" ; then
R_DATA='*(SORT(.data$*))
- *(.rdata)
+ *(.rdata)
*(SORT(.rdata$*))'
R_RDATA=''
else
R_DATA='*(SORT(.data$*))'
R_RDATA='*(.rdata)
- *(SORT(.rdata$*))'
+ *(SORT(.rdata$*))'
fi
R_IDATA234='
- SORT(*)(.idata$2)
- SORT(*)(.idata$3)
+ KEEP (SORT(*)(.idata$2))
+ KEEP (SORT(*)(.idata$3))
/* These zeroes mark the end of the import list. */
LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
- SORT(*)(.idata$4)'
- R_IDATA5='SORT(*)(.idata$5)'
+ KEEP (SORT(*)(.idata$4))'
+ R_IDATA5='KEEP (SORT(*)(.idata$5))'
R_IDATA67='
- SORT(*)(.idata$6)
- SORT(*)(.idata$7)'
- R_CRT_XC='*(SORT(.CRT$XC*)) /* C initialization */'
- R_CRT_XI='*(SORT(.CRT$XI*)) /* C++ initialization */'
- R_CRT_XL='*(SORT(.CRT$XL*)) /* TLS callbacks */'
- R_CRT_XP='*(SORT(.CRT$XP*)) /* Pre-termination */'
- R_CRT_XT='*(SORT(.CRT$XT*)) /* Termination */'
+ KEEP (SORT(*)(.idata$6))
+ KEEP (SORT(*)(.idata$7))'
+ R_CRT_XC='KEEP (*(SORT(.CRT$XC*))) /* C initialization */'
+ R_CRT_XI='KEEP (*(SORT(.CRT$XI*))) /* C++ initialization */'
+ R_CRT_XL='KEEP (*(SORT(.CRT$XL*))) /* TLS callbacks */'
+ R_CRT_XP='KEEP (*(SORT(.CRT$XP*))) /* Pre-termination */'
+ R_CRT_XT='KEEP (*(SORT(.CRT$XT*))) /* Termination */'
R_TLS='
- *(.tls$AAA)
- *(.tls)
- *(.tls$)
- *(SORT(.tls$*))
- *(.tls$ZZZ)'
- if test -z "$DEFAULT_MANIFEST"; then
- R_RSRC='
- *(.rsrc)
- *(SORT(.rsrc$*))'
- else
- R_RSRC="
- /* The default manifest contains information necessary for
- binaries to run under Windows 8 (or later). It is included as
- the last resource file so that if the application has provided
- its own manifest then that one will take precedence. */
- *(EXCLUDE_FILE ($DEFAULT_MANIFEST) .rsrc)
- *(SORT(.rsrc*))
- KEEP ($DEFAULT_MANIFEST(.rsrc))"
- fi
+ KEEP (*(.tls$AAA))
+ KEEP (*(.tls))
+ KEEP (*(.tls$))
+ KEEP (*(SORT(.tls$*)))
+ KEEP (*(.tls$ZZZ))'
+ R_RSRC='
+ KEEP (*(.rsrc))
+ KEEP (*(.rsrc$*))'
else
R_TEXT=
R_DATA=
R_IDATA234=
R_IDATA5=
R_IDATA67=
- R_CRT=
+ R_CRT_XC=
+ R_CRT_XI=
+ R_CRT_XL=
+ R_CRT_XP=
+ R_CRT_XT=
+ R_TLS='*(.tls)'
R_RSRC='*(.rsrc)'
fi
cat <<EOF
+/* Copyright (C) 2014-2021 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. */
+
${RELOCATING+OUTPUT_FORMAT(${OUTPUT_FORMAT})}
${RELOCATING-OUTPUT_FORMAT(${RELOCATEABLE_OUTPUT_FORMAT})}
${OUTPUT_ARCH+OUTPUT_ARCH(${OUTPUT_ARCH})}
${RELOCATING+. = ALIGN(__section_alignment__);}
.text ${RELOCATING+ __image_base__ + ( __section_alignment__ < ${TARGET_PAGE_SIZE} ? . : __section_alignment__ )} :
{
- ${RELOCATING+ *(.init)}
+ ${RELOCATING+KEEP (*(SORT_NONE(.init)))}
*(.text)
${R_TEXT}
${RELOCATING+ *(.text.*)}
${RELOCATING+ *(.gnu.linkonce.t.*)}
- *(.glue_7t)
- *(.glue_7)
- ${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
- LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*)); LONG (0); }
- ${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
- LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*)); LONG (0); }
- ${RELOCATING+ *(.fini)}
- /* ??? Why is .gcc_exc here? */
+ ${RELOCATING+*(.glue_7t)}
+ ${RELOCATING+*(.glue_7)}
+ ${CONSTRUCTING+
+ /* Note: we always define __CTOR_LIST__ and ___CTOR_LIST__ here,
+ we do not PROVIDE them. This is because the ctors.o startup
+ code in libgcc defines them as common symbols, with the
+ expectation that they will be overridden by the definitions
+ here. If we PROVIDE the symbols then they will not be
+ overridden and global constructors will not be run.
+ See PR 22762 for more details.
+
+ This does mean that it is not possible for a user to define
+ their own __CTOR_LIST__ and __DTOR_LIST__ symbols; if they do,
+ the content from those variables are included but the symbols
+ defined here silently take precedence. If they truly need to
+ be redefined, a custom linker script will have to be used.
+ (The custom script can just be a copy of this script with the
+ PROVIDE() qualifiers added).
+
+ In particular this means that ld -Ur does not work, because
+ the proper __CTOR_LIST__ set by ld -Ur is overridden by a
+ bogus __CTOR_LIST__ set by the final link. See PR 46. */
+ ___CTOR_LIST__ = .;
+ __CTOR_LIST__ = .;
+ LONG (-1);
+ KEEP(*(.ctors));
+ KEEP(*(.ctor));
+ KEEP(*(SORT_BY_NAME(.ctors.*)));
+ LONG (0);
+ }
+ ${CONSTRUCTING+
+ /* See comment about __CTOR_LIST__ above. The same reasoning
+ applies here too. */
+ ___DTOR_LIST__ = .;
+ __DTOR_LIST__ = .;
+ LONG (-1);
+ KEEP(*(.dtors));
+ KEEP(*(.dtor));
+ KEEP(*(SORT_BY_NAME(.dtors.*)));
+ LONG (0);
+ }
+ ${RELOCATING+KEEP (*(SORT_NONE(.fini)))}
+ ${RELOCATING+/* ??? Why is .gcc_exc here? */}
${RELOCATING+ *(.gcc_exc)}
${RELOCATING+PROVIDE (etext = .);}
${RELOCATING+PROVIDE (_etext = .);}
- ${RELOCATING+ *(.gcc_except_table)}
+ ${RELOCATING+ KEEP (*(.gcc_except_table))}
}
/* The Cygwin32 library uses a section to avoid copying certain data
{
${RELOCATING+__data_start__ = . ;}
*(.data)
- *(.data2)
+ ${RELOCATING+*(.data2)}
${R_DATA}
- *(.jcr)
+ KEEP(*(.jcr))
${RELOCATING+__data_end__ = . ;}
${RELOCATING+*(.data_cygwin_nocopy)}
}
.rdata ${RELOCATING+BLOCK(__section_alignment__)} :
{
${R_RDATA}
+ . = ALIGN(4);
${RELOCATING+__rt_psrelocs_start = .;}
- *(.rdata_runtime_pseudo_reloc)
+ ${RELOCATING+KEEP(*(.rdata_runtime_pseudo_reloc))}
${RELOCATING+__rt_psrelocs_end = .;}
}
${RELOCATING+__rt_psrelocs_size = __rt_psrelocs_end - __rt_psrelocs_start;}
.eh_frame ${RELOCATING+BLOCK(__section_alignment__)} :
{
- *(.eh_frame*)
+ KEEP(*(.eh_frame${RELOCATING+*}))
}
.pdata ${RELOCATING+BLOCK(__section_alignment__)} :
{
- *(.pdata)
+ KEEP(*(.pdata${RELOCATING+*}))
}
.bss ${RELOCATING+BLOCK(__section_alignment__)} :
${R_IDATA67}
}
.CRT ${RELOCATING+BLOCK(__section_alignment__)} :
- {
+ {
${RELOCATING+___crt_xc_start__ = . ;}
${R_CRT_XC}
${RELOCATING+___crt_xc_end__ = . ;}
be at the beginning of the section to enable SECREL32 relocations with TLS
data. */
.tls ${RELOCATING+BLOCK(__section_alignment__)} :
- {
+ {
${RELOCATING+___tls_start__ = . ;}
${R_TLS}
${RELOCATING+___tls_end__ = . ;}
${RELOCATING+ __end__ = .;}
}
- .rsrc ${RELOCATING+BLOCK(__section_alignment__)} :
+ .rsrc ${RELOCATING+BLOCK(__section_alignment__)} : SUBALIGN(4)
{
${R_RSRC}
}
{
*(.zdebug_types${RELOCATING+ .gnu.linkonce.wt.*})
}
+
+ /* For Go and Rust. */
+ .debug_gdb_scripts ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
+ {
+ *(.debug_gdb_scripts)
+ }
+ .zdebug_gdb_scripts ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
+ {
+ *(.zdebug_gdb_scripts)
+ }
}
EOF