This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
.ctor vs. .init_array ordering
- From: Alan Modra <amodra at gmail dot com>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: binutils at sourceware dot org
- Date: Fri, 8 Feb 2013 16:29:56 +1030
- Subject: .ctor vs. .init_array ordering
Hi HJ,
I see your .ctors in .init_array changes do the right thing for
constructors with a priority attribute. ie. the constructor priority
attribute is respected regardless of whether gcc generates
.ctors.NNNNN or .init_array.NNNNN.
This:
SORT_INIT_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))"
is good. What's more, constructors with the same priority will appear
in object file order regardless of their naming.
However, this:
KEEP (*(.init_array))
${CTORS_IN_INIT_ARRAY}
which expands to
KEEP (*(.init_array))
KEEP (*(EXCLUDE_FILE (<startup file patterns>) .ctors))
means ld puts all .init_array sections before .ctors sections. So we
aren't consistent with the priority case.
I know we don't promise anything regarding constructor order across
TUs except that specified by priority attributes, and that the older
scheme with .ctors was reverse file order while the new .init_array is
in file order, but having this further inconsistency is even more
confusing. So how about the following?
* scripttempl/elf.sc (.init_array, .fini_array): Don't sort all
.init_array/.fini_array input sections before .ctors/.dtors input
sections.
(CTORS_IN_INIT_ARRAY, DTORS_IN_INIT_ARRAY): Adjust to suit.
Index: ld/scripttempl/elf.sc
===================================================================
RCS file: /cvs/src/src/ld/scripttempl/elf.sc,v
retrieving revision 1.119
diff -u -p -r1.119 elf.sc
--- ld/scripttempl/elf.sc 14 Jan 2013 13:37:10 -0000 1.119
+++ ld/scripttempl/elf.sc 8 Feb 2013 05:29:21 -0000
@@ -233,8 +233,8 @@ test "${LARGE_SECTIONS}" = "yes" && LARG
if test "${ENABLE_INITFINI_ARRAY}" = "yes"; then
SORT_INIT_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))"
SORT_FINI_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))"
- CTORS_IN_INIT_ARRAY="KEEP (*(EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))"
- DTORS_IN_FINI_ARRAY="KEEP (*(EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))"
+ CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors"
+ DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors"
else
SORT_INIT_ARRAY="KEEP (*(SORT(.init_array.*)))"
SORT_FINI_ARRAY="KEEP (*(SORT(.fini_array.*)))"
@@ -245,16 +245,14 @@ INIT_ARRAY=".init_array ${RELOCATING-0
{
${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_start = .);}}
${SORT_INIT_ARRAY}
- KEEP (*(.init_array))
- ${CTORS_IN_INIT_ARRAY}
+ KEEP (*(.init_array ${CTORS_IN_INIT_ARRAY}))
${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_end = .);}}
}"
FINI_ARRAY=".fini_array ${RELOCATING-0} :
{
${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_start = .);}}
${SORT_FINI_ARRAY}
- KEEP (*(.fini_array))
- ${DTORS_IN_FINI_ARRAY}
+ KEEP (*(.fini_array ${DTORS_IN_FINI_ARRAY}))
${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_end = .);}}
}"
CTOR=".ctors ${CONSTRUCTING-0} :
--
Alan Modra
Australia Development Lab, IBM