Enable initfini array support on Solaris (PR target/50166)
* acinclude.m4 (gcc_AC_INITFINI_ARRAY): Require gcc_SUN_LD_VERSION. Define _start. Remove -e 0 from $gcc_cv_ld invocation. Only use __GLIBC_PREREQ if defined. Enable on Solaris since Solaris 8 patch. (gcc_SUN_LD_VERSION): New macro. * configure.ac (ld_ver) <*-*-solaris2*>: Refer to gcc_SUN_LD_VERSION for version number format. * configure: Regenerate. * varasm.c (get_elf_initfini_array_priority_section): Set SECTION_NOTYPE for non-default priority. Use get_section instead of get_unnamed_section to emit .init_array/.fini_array with default priority. From-SVN: r184390
This commit is contained in:
parent
d150390867
commit
e992fc2e5d
5 changed files with 155 additions and 32 deletions
|
@ -1,3 +1,20 @@
|
|||
2012-02-20 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||
|
||||
PR target/50166
|
||||
* acinclude.m4 (gcc_AC_INITFINI_ARRAY): Require gcc_SUN_LD_VERSION.
|
||||
Define _start.
|
||||
Remove -e 0 from $gcc_cv_ld invocation.
|
||||
Only use __GLIBC_PREREQ if defined.
|
||||
Enable on Solaris since Solaris 8 patch.
|
||||
(gcc_SUN_LD_VERSION): New macro.
|
||||
* configure.ac (ld_ver) <*-*-solaris2*>: Refer to
|
||||
gcc_SUN_LD_VERSION for version number format.
|
||||
* configure: Regenerate.
|
||||
* varasm.c (get_elf_initfini_array_priority_section): Set
|
||||
SECTION_NOTYPE for non-default priority.
|
||||
Use get_section instead of get_unnamed_section to emit
|
||||
.init_array/.fini_array with default priority.
|
||||
|
||||
2012-02-19 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
* config/mips/mips.c (mips_need_mips16_rdhwr_p): New variable.
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
dnl Copyright (C) 2005, 2006, 2007, 2008, 2011 Free Software Foundation, Inc.
|
||||
dnl Copyright (C) 2005, 2006, 2007, 2008, 2011, 2012
|
||||
dnl Free Software Foundation, Inc.
|
||||
dnl
|
||||
dnl This file is part of GCC.
|
||||
dnl
|
||||
|
@ -370,7 +371,8 @@ fi
|
|||
fi])
|
||||
|
||||
AC_DEFUN([gcc_AC_INITFINI_ARRAY],
|
||||
[AC_ARG_ENABLE(initfini-array,
|
||||
[AC_REQUIRE([gcc_SUN_LD_VERSION])dnl
|
||||
AC_ARG_ENABLE(initfini-array,
|
||||
[ --enable-initfini-array use .init_array/.fini_array sections],
|
||||
[], [
|
||||
AC_CACHE_CHECK(for .preinit_array/.init_array/.fini_array support,
|
||||
|
@ -427,9 +429,11 @@ int (*fp) (void) __attribute__ ((section (".init_array"))) = foo;
|
|||
.balign 4
|
||||
.byte 'H', 'H', 'H', 'H'
|
||||
.text
|
||||
.globl _start
|
||||
_start:
|
||||
EOF
|
||||
if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1 \
|
||||
&& $gcc_cv_ld -e 0 -o conftest conftest.o > /dev/null 2>&1 \
|
||||
&& $gcc_cv_ld -o conftest conftest.o > /dev/null 2>&1 \
|
||||
&& $gcc_cv_objdump -s -j .init_array conftest \
|
||||
| grep HHHHFFFFDDDDBBBB > /dev/null 2>&1 \
|
||||
&& $gcc_cv_objdump -s -j .fini_array conftest \
|
||||
|
@ -442,14 +446,38 @@ changequote([,])dnl
|
|||
fi
|
||||
AC_PREPROC_IFELSE([AC_LANG_SOURCE([
|
||||
#ifndef __ELF__
|
||||
#error Not an ELF OS
|
||||
# error Not an ELF OS
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#if defined __GLIBC_PREREQ && __GLIBC_PREREQ (2, 4)
|
||||
#if defined __GLIBC_PREREQ
|
||||
# if __GLIBC_PREREQ (2, 4)
|
||||
# else
|
||||
# error GLIBC 2.4 required
|
||||
# endif
|
||||
#else
|
||||
#error The C library not known to support .init_array/.fini_array
|
||||
# if defined __sun__ && defined __svr4__
|
||||
/* Solaris ld.so.1 supports .init_array/.fini_array since Solaris 8. */
|
||||
# else
|
||||
# error The C library not known to support .init_array/.fini_array
|
||||
# endif
|
||||
#endif
|
||||
])],, [gcc_cv_initfini_array=no]);;
|
||||
])],[
|
||||
case "${target}" in
|
||||
*-*-solaris2.8*)
|
||||
# .init_array/.fini_array support was introduced in Solaris 8
|
||||
# patches 109147-08 (sparc) and 109148-08 (x86). Since ld.so.1 and
|
||||
# ld are guaranteed to be updated in lockstep, we can check ld -V
|
||||
# instead. Unfortunately, proper ld version numbers were only
|
||||
# introduced in rev. -14, so we check for that.
|
||||
if test "$gcc_cv_sun_ld_vers_minor" -lt 272; then
|
||||
gcc_cv_initfini_array=no
|
||||
fi
|
||||
;;
|
||||
*-*-solaris2.9* | *-*-solaris2.1[[0-9]]*)
|
||||
# .init_array/.fini_array support is present since Solaris 9 FCS.
|
||||
;;
|
||||
esac
|
||||
], [gcc_cv_initfini_array=no]);;
|
||||
esac
|
||||
else
|
||||
AC_MSG_CHECKING(cross compile... guessing)
|
||||
|
@ -569,6 +597,43 @@ if test $[$2] = yes; then
|
|||
$7
|
||||
fi])])
|
||||
|
||||
dnl gcc_SUN_LD_VERSION
|
||||
dnl
|
||||
dnl Determines Sun linker version numbers, setting gcc_cv_sun_ld_vers to
|
||||
dnl the complete version number and gcc_cv_sun_ld_vers_{major, minor} to
|
||||
dnl the corresponding fields.
|
||||
dnl
|
||||
dnl ld and ld.so.1 are guaranteed to be updated in lockstep, so ld version
|
||||
dnl numbers can be used in ld.so.1 feature checks even if a different
|
||||
dnl linker is configured.
|
||||
dnl
|
||||
AC_DEFUN([gcc_SUN_LD_VERSION],
|
||||
[changequote(,)dnl
|
||||
if test "x${build}" = "x${target}" && test "x${build}" = "x${host}"; then
|
||||
case "${target}" in
|
||||
*-*-solaris2*)
|
||||
#
|
||||
# Solaris 2 ld -V output looks like this for a regular version:
|
||||
#
|
||||
# ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1699
|
||||
#
|
||||
# but test versions add stuff at the end:
|
||||
#
|
||||
# ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1701:onnv-ab196087-6931056-03/25/10
|
||||
#
|
||||
gcc_cv_sun_ld_ver=`/usr/ccs/bin/ld -V 2>&1`
|
||||
if echo "$gcc_cv_sun_ld_ver" | grep 'Solaris Link Editors' > /dev/null; then
|
||||
gcc_cv_sun_ld_vers=`echo $gcc_cv_sun_ld_ver | sed -n \
|
||||
-e 's,^.*: 5\.[0-9][0-9]*-\([0-9]\.[0-9][0-9]*\).*$,\1,p'`
|
||||
gcc_cv_sun_ld_vers_major=`expr "$gcc_cv_sun_ld_vers" : '\([0-9]*\)'`
|
||||
gcc_cv_sun_ld_vers_minor=`expr "$gcc_cv_sun_ld_vers" : '[0-9]*\.\([0-9]*\)'`
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
changequote([,])dnl
|
||||
])
|
||||
|
||||
dnl GCC_TARGET_TEMPLATE(KEY)
|
||||
dnl ------------------------
|
||||
dnl Define KEY as a valid configure key on the target machine.
|
||||
|
|
69
gcc/configure
vendored
69
gcc/configure
vendored
|
@ -22214,15 +22214,11 @@ if test $in_tree_ld != yes ; then
|
|||
else
|
||||
case "${target}" in
|
||||
*-*-solaris2*)
|
||||
# See acinclude.m4 (gcc_SUN_LD_VERSION) for the version number
|
||||
# format.
|
||||
#
|
||||
# Solaris 2 ld -V output looks like this for a regular version:
|
||||
#
|
||||
# ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1699
|
||||
#
|
||||
# but test versions add stuff at the end:
|
||||
#
|
||||
# ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1701:onnv-ab196087-6931056-03/25/10
|
||||
#
|
||||
# Don't reuse gcc_gv_sun_ld_vers_* in case a linker other than
|
||||
# /usr/ccs/bin/ld has been configured.
|
||||
ld_ver=`$gcc_cv_ld -V 2>&1`
|
||||
if echo "$ld_ver" | grep 'Solaris Link Editors' > /dev/null; then
|
||||
ld_vers=`echo $ld_ver | sed -n \
|
||||
|
@ -22350,6 +22346,29 @@ fi
|
|||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld_ro_rw_mix" >&5
|
||||
$as_echo "$gcc_cv_ld_ro_rw_mix" >&6; }
|
||||
|
||||
if test "x${build}" = "x${target}" && test "x${build}" = "x${host}"; then
|
||||
case "${target}" in
|
||||
*-*-solaris2*)
|
||||
#
|
||||
# Solaris 2 ld -V output looks like this for a regular version:
|
||||
#
|
||||
# ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1699
|
||||
#
|
||||
# but test versions add stuff at the end:
|
||||
#
|
||||
# ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1701:onnv-ab196087-6931056-03/25/10
|
||||
#
|
||||
gcc_cv_sun_ld_ver=`/usr/ccs/bin/ld -V 2>&1`
|
||||
if echo "$gcc_cv_sun_ld_ver" | grep 'Solaris Link Editors' > /dev/null; then
|
||||
gcc_cv_sun_ld_vers=`echo $gcc_cv_sun_ld_ver | sed -n \
|
||||
-e 's,^.*: 5\.[0-9][0-9]*-\([0-9]\.[0-9][0-9]*\).*$,\1,p'`
|
||||
gcc_cv_sun_ld_vers_major=`expr "$gcc_cv_sun_ld_vers" : '\([0-9]*\)'`
|
||||
gcc_cv_sun_ld_vers_minor=`expr "$gcc_cv_sun_ld_vers" : '[0-9]*\.\([0-9]*\)'`
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Check whether --enable-initfini-array was given.
|
||||
if test "${enable_initfini_array+set}" = set; then :
|
||||
enableval=$enable_initfini_array;
|
||||
|
@ -22425,9 +22444,11 @@ fi
|
|||
.balign 4
|
||||
.byte 'H', 'H', 'H', 'H'
|
||||
.text
|
||||
.globl _start
|
||||
_start:
|
||||
EOF
|
||||
if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1 \
|
||||
&& $gcc_cv_ld -e 0 -o conftest conftest.o > /dev/null 2>&1 \
|
||||
&& $gcc_cv_ld -o conftest conftest.o > /dev/null 2>&1 \
|
||||
&& $gcc_cv_objdump -s -j .init_array conftest \
|
||||
| grep HHHHFFFFDDDDBBBB > /dev/null 2>&1 \
|
||||
&& $gcc_cv_objdump -s -j .fini_array conftest \
|
||||
|
@ -22440,17 +22461,41 @@ EOF
|
|||
/* end confdefs.h. */
|
||||
|
||||
#ifndef __ELF__
|
||||
#error Not an ELF OS
|
||||
# error Not an ELF OS
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#if defined __GLIBC_PREREQ && __GLIBC_PREREQ (2, 4)
|
||||
#if defined __GLIBC_PREREQ
|
||||
# if __GLIBC_PREREQ (2, 4)
|
||||
# else
|
||||
# error GLIBC 2.4 required
|
||||
# endif
|
||||
#else
|
||||
#error The C library not known to support .init_array/.fini_array
|
||||
# if defined __sun__ && defined __svr4__
|
||||
/* Solaris ld.so.1 supports .init_array/.fini_array since Solaris 8. */
|
||||
# else
|
||||
# error The C library not known to support .init_array/.fini_array
|
||||
# endif
|
||||
#endif
|
||||
|
||||
_ACEOF
|
||||
if ac_fn_c_try_cpp "$LINENO"; then :
|
||||
|
||||
case "${target}" in
|
||||
*-*-solaris2.8*)
|
||||
# .init_array/.fini_array support was introduced in Solaris 8
|
||||
# patches 109147-08 (sparc) and 109148-08 (x86). Since ld.so.1 and
|
||||
# ld are guaranteed to be updated in lockstep, we can check ld -V
|
||||
# instead. Unfortunately, proper ld version numbers were only
|
||||
# introduced in rev. -14, so we check for that.
|
||||
if test "$gcc_cv_sun_ld_vers_minor" -lt 272; then
|
||||
gcc_cv_initfini_array=no
|
||||
fi
|
||||
;;
|
||||
*-*-solaris2.9* | *-*-solaris2.1[0-9]*)
|
||||
# .init_array/.fini_array support is present since Solaris 9 FCS.
|
||||
;;
|
||||
esac
|
||||
|
||||
else
|
||||
gcc_cv_initfini_array=no
|
||||
fi
|
||||
|
|
|
@ -2296,15 +2296,11 @@ if test $in_tree_ld != yes ; then
|
|||
else
|
||||
case "${target}" in
|
||||
*-*-solaris2*)
|
||||
# See acinclude.m4 (gcc_SUN_LD_VERSION) for the version number
|
||||
# format.
|
||||
#
|
||||
# Solaris 2 ld -V output looks like this for a regular version:
|
||||
#
|
||||
# ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1699
|
||||
#
|
||||
# but test versions add stuff at the end:
|
||||
#
|
||||
# ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1701:onnv-ab196087-6931056-03/25/10
|
||||
#
|
||||
# Don't reuse gcc_gv_sun_ld_vers_* in case a linker other than
|
||||
# /usr/ccs/bin/ld has been configured.
|
||||
ld_ver=`$gcc_cv_ld -V 2>&1`
|
||||
if echo "$ld_ver" | grep 'Solaris Link Editors' > /dev/null; then
|
||||
ld_vers=`echo $ld_ver | sed -n \
|
||||
|
|
10
gcc/varasm.c
10
gcc/varasm.c
|
@ -7658,7 +7658,7 @@ get_elf_initfini_array_priority_section (int priority,
|
|||
sprintf (buf, "%s.%.5u",
|
||||
constructor_p ? ".init_array" : ".fini_array",
|
||||
priority);
|
||||
sec = get_section (buf, SECTION_WRITE, NULL_TREE);
|
||||
sec = get_section (buf, SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -7666,16 +7666,16 @@ get_elf_initfini_array_priority_section (int priority,
|
|||
{
|
||||
if (elf_init_array_section == NULL)
|
||||
elf_init_array_section
|
||||
= get_unnamed_section (0, output_section_asm_op,
|
||||
"\t.section\t.init_array");
|
||||
= get_section (".init_array",
|
||||
SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
|
||||
sec = elf_init_array_section;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (elf_fini_array_section == NULL)
|
||||
elf_fini_array_section
|
||||
= get_unnamed_section (0, output_section_asm_op,
|
||||
"\t.section\t.fini_array");
|
||||
= get_section (".fini_array",
|
||||
SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
|
||||
sec = elf_fini_array_section;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue