# Linker script for PE.
#
-# Copyright (C) 2014-2018 Free Software Foundation, Inc.
+# Copyright (C) 2014-2020 Free Software Foundation, Inc.
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
fi
cat <<EOF
-/* Copyright (C) 2014-2018 Free Software Foundation, Inc.
+/* Copyright (C) 2014-2020 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
${RELOCATING+. = ALIGN(__section_alignment__);}
.text ${RELOCATING+ __image_base__ + ( __section_alignment__ < ${TARGET_PAGE_SIZE} ? . : __section_alignment__ )} :
{
- ${RELOCATING+ KEEP(*(.init))}
+ ${RELOCATING+KEEP (*(SORT_NONE(.init)))}
*(.text)
${R_TEXT}
${RELOCATING+ *(.text.*)}
${RELOCATING+*(.glue_7t)}
${RELOCATING+*(.glue_7)}
${CONSTRUCTING+
- PROVIDE(___CTOR_LIST__ = .);
- PROVIDE(__CTOR_LIST__ = .);
+ /* 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));
LONG (0);
}
${CONSTRUCTING+
- PROVIDE(___DTOR_LIST__ = .);
- PROVIDE(__DTOR_LIST__ = .);
+ /* 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 (*(.fini))}
- /* ??? Why is .gcc_exc here? */
+ ${RELOCATING+KEEP (*(SORT_NONE(.fini)))}
+ ${RELOCATING+/* ??? Why is .gcc_exc here? */}
${RELOCATING+ *(.gcc_exc)}
${RELOCATING+PROVIDE (etext = .);}
${RELOCATING+PROVIDE (_etext = .);}
.rdata ${RELOCATING+BLOCK(__section_alignment__)} :
{
${R_RDATA}
+ . = ALIGN(4);
${RELOCATING+__rt_psrelocs_start = .;}
${RELOCATING+KEEP(*(.rdata_runtime_pseudo_reloc))}
${RELOCATING+__rt_psrelocs_end = .;}