From a985e9b9deabd81e16754584f4397a638e9d3f36 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 5 Feb 2018 09:12:42 +0000 Subject: [PATCH] Import patch from mainline to remove PROVODE qualifiers around definitions of __CTOR_LIST__ and __DTOR_LIST__ in PE linker scripts. PR 22762 * scripttempl/pe.sc: Remove PROVIDE()s from __CTOR_LIST__ and __DTOR_LIST__ symbols. Add a comment explaining why this is necessary. * scripttemp/pep.sc: Likewise. * ld.texinfo (PROVIDE): Add a note about the effect of common symbols. --- ld/ChangeLog | 14 ++++++++++++++ ld/ld.texinfo | 6 ++++++ ld/scripttempl/pe.sc | 24 ++++++++++++++++++++---- ld/scripttempl/pep.sc | 24 ++++++++++++++++++++---- 4 files changed, 60 insertions(+), 8 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 0f00265..bf129a1 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,17 @@ +2018-02-05 Nick Clifton + + Import from mainline: + + 2018-02-03 Nick Clifton + + PR 22762 + * scripttempl/pe.sc: Remove PROVIDE()s from __CTOR_LIST__ and + __DTOR_LIST__ symbols. Add a comment explaining why this is + necessary. + * scripttemp/pep.sc: Likewise. + * ld.texinfo (PROVIDE): Add a note about the effect of common + symbols. + 2018-01-27 Nick Clifton Back to development. diff --git a/ld/ld.texinfo b/ld/ld.texinfo index c89915f..764c401 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -4001,6 +4001,12 @@ underscore), the linker will silently use the definition in the program. If the program references @samp{etext} but does not define it, the linker will use the definition in the linker script. +Note - the @code{PROVIDE} directive considers a common symbol to be +defined, even though such a symbol could be combined with the symbol +that the @code{PROVIDE} would create. This is particularly important +when considering constructor and destructor list symbols such as +@samp{__CTOR_LIST__} as these are often defined as common symbols. + @node PROVIDE_HIDDEN @subsection PROVIDE_HIDDEN @cindex PROVIDE_HIDDEN diff --git a/ld/scripttempl/pe.sc b/ld/scripttempl/pe.sc index c8a45ca..f56d783 100644 --- a/ld/scripttempl/pe.sc +++ b/ld/scripttempl/pe.sc @@ -98,8 +98,22 @@ SECTIONS ${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. + + This does mean that it is not possible for a user to define + their own __CTOR_LIST__ and __DTOR_LIST__ symbols. If that + ability is needed 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). + + See PR 22762 for more details. */ + ___CTOR_LIST__ = .; + __CTOR_LIST__ = .; LONG (-1); KEEP(*(.ctors)); KEEP(*(.ctor)); @@ -107,8 +121,10 @@ SECTIONS 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)); diff --git a/ld/scripttempl/pep.sc b/ld/scripttempl/pep.sc index 8daacb2..3c6c84d 100644 --- a/ld/scripttempl/pep.sc +++ b/ld/scripttempl/pep.sc @@ -99,8 +99,22 @@ SECTIONS ${RELOCATING+*(.glue_7)} ${CONSTRUCTING+. = ALIGN(8);} ${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. + + This does mean that it is not possible for a user to define + their own __CTOR_LIST__ and __DTOR_LIST__ symbols. If that + ability is needed 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). + + See PR 22762 for more details. */ + ___CTOR_LIST__ = .; + __CTOR_LIST__ = .; LONG (-1); LONG (-1); KEEP (*(.ctors)); KEEP (*(.ctor)); @@ -108,8 +122,10 @@ SECTIONS LONG (0); 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); LONG (-1); KEEP (*(.dtors)); KEEP (*(.dtor)); -- 2.9.3