Add configure check to test if gcc supports attribute ifunc.

This patch adds a configure check to test if gcc supports attribute ifunc.
The support can either be enabled in <gcc-src>/gcc/config.gcc for one
architecture in general by setting default_gnu_indirect_function variable to yes
or by configuring gcc with --enable-gnu-indirect-function.

The next patch rewrites libc_ifunc macro to use gcc attribute ifunc instead
of inline assembly to generate the IFUNC symbols due to false debuginfo.

If gcc does not support attribute ifunc, the old approach for generating
ifunc'ed symbols is used. Then the debug-information is false. Thus it is
recommended to use a gcc with indirect function support (See notes in INSTALL).
After this patch-series these inline assemblies for ifunc-handling are not
scattered in multiple files but are used only indirect via ifunc-macros
and can simply removed in libc-symbols.h in future.

If glibc is configured with --enable-multi-arch and gcc does not support
attribute ifunc, a configure warning is dumped!

ChangeLog:

	* config.h.in (HAVE_GCC_IFUNC): New undef.
	* configure.ac: Add check if gcc supports attribute ifunc feature.
	* configure: Regenerated.
	* manual/install.texi: Add recommendation for gcc with
	indirect-function support.
	* INSTALL: Regenerated.
This commit is contained in:
Stefan Liebler 2016-10-07 09:56:46 +02:00
parent 1e7c8fcca5
commit 022dfdce00
7 changed files with 113 additions and 0 deletions

View file

@ -1,3 +1,12 @@
2016-10-07 Stefan Liebler <stli@linux.vnet.ibm.com>
* config.h.in (HAVE_GCC_IFUNC): New undef.
* configure.ac: Add check if gcc supports attribute ifunc feature.
* configure: Regenerated.
* manual/install.texi: Add recommendation for gcc with
indirect-function support.
* INSTALL: Regenerated.
2016-10-06 Joseph Myers <joseph@codesourcery.com>
* math/math.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (iseqsig): New

View file

@ -359,6 +359,15 @@ build the GNU C Library:
better code. As of release time, GCC 5.3 is the newest compiler
verified to work to build the GNU C Library.
For multi-arch support it is recommended to use a GCC which has
been built with support for GNU indirect functions. This ensures
that correct debugging information is generated for functions
selected by IFUNC resolvers. This support can either be enabled by
configuring GCC with '--enable-gnu-indirect-function', or by
enabling it by default by setting 'default_gnu_indirect_function'
variable for a particular architecture in the GCC source file
'gcc/config.gcc'.
You can use whatever compiler you like to compile programs that use
the GNU C Library.

9
NEWS
View file

@ -76,6 +76,15 @@ Version 2.25
The glibc stub resolver did not support these hooks, but the header file
did not reflect that.
* For multi-arch support it is recommended to use a GCC which has
been built with support for GNU indirect functions. This ensures
that correct debugging information is generated for functions
selected by IFUNC resolvers. This support can either be enabled by
configuring GCC with '--enable-gnu-indirect-function', or by
enabling it by default by setting 'default_gnu_indirect_function'
variable for a particular architecture in the GCC source file
'gcc/config.gcc'.
Security related changes:
On ARM EABI (32-bit), generating a backtrace for execution contexts which

View file

@ -174,6 +174,9 @@
/* Define to 1 if STT_GNU_IFUNC support actually works. */
#define HAVE_IFUNC 0
/* Define if gcc supports attribute ifunc. */
#undef HAVE_GCC_IFUNC
/* Define if the linker defines __ehdr_start. */
#undef HAVE_EHDR_START

42
configure vendored
View file

@ -3916,6 +3916,36 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ld_gnu_indirect_function" >&5
$as_echo "$libc_cv_ld_gnu_indirect_function" >&6; }
# Check if gcc supports attribute ifunc as it is used in libc_ifunc macro.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc attribute ifunc support" >&5
$as_echo_n "checking for gcc attribute ifunc support... " >&6; }
if ${libc_cv_gcc_indirect_function+:} false; then :
$as_echo_n "(cached) " >&6
else
cat > conftest.c <<EOF
extern int func (int);
int used_func (int a)
{
return a;
}
static void *resolver ()
{
return &used_func;
}
extern __typeof (func) func __attribute__ ((ifunc ("resolver")));
EOF
libc_cv_gcc_indirect_function=no
if ${CC-cc} -c conftest.c -o conftest.o 1>&5 \
2>&5 ; then
if $READELF -s conftest.o | grep IFUNC >/dev/null 2>&5; then
libc_cv_gcc_indirect_function=yes
fi
fi
rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_indirect_function" >&5
$as_echo "$libc_cv_gcc_indirect_function" >&6; }
if test x"$libc_cv_ld_gnu_indirect_function" != xyes; then
if test x"$multi_arch" = xyes; then
as_fn_error $? "--enable-multi-arch support requires assembler and linker support" "$LINENO" 5
@ -3923,6 +3953,13 @@ if test x"$libc_cv_ld_gnu_indirect_function" != xyes; then
multi_arch=no
fi
fi
if test x"$libc_cv_gcc_indirect_function" != xyes &&
test x"$multi_arch" = xyes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-multi-arch support recommends a gcc with gnu-indirect-function support.
Please use a gcc which supports it by default or configure gcc with --enable-gnu-indirect-function" >&5
$as_echo "$as_me: WARNING: --enable-multi-arch support recommends a gcc with gnu-indirect-function support.
Please use a gcc which supports it by default or configure gcc with --enable-gnu-indirect-function" >&2;}
fi
multi_arch_d=
if test x"$multi_arch" != xno; then
multi_arch_d=/multiarch
@ -6518,6 +6555,11 @@ if test x"$libc_cv_ld_gnu_indirect_function" = xyes; then
fi
if test x"$libc_cv_gcc_indirect_function" = xyes; then
$as_echo "#define HAVE_GCC_IFUNC 1" >>confdefs.h
fi
# This is far from the AC_ARG_ENABLE that sets it so that a sysdeps
# configure fragment can override the value to prevent this AC_DEFINE.

View file

@ -634,6 +634,30 @@ if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
fi
rm -f conftest*])
# Check if gcc supports attribute ifunc as it is used in libc_ifunc macro.
AC_CACHE_CHECK([for gcc attribute ifunc support],
libc_cv_gcc_indirect_function, [dnl
cat > conftest.c <<EOF
extern int func (int);
int used_func (int a)
{
return a;
}
static void *resolver ()
{
return &used_func;
}
extern __typeof (func) func __attribute__ ((ifunc ("resolver")));
EOF
libc_cv_gcc_indirect_function=no
if ${CC-cc} -c conftest.c -o conftest.o 1>&AS_MESSAGE_LOG_FD \
2>&AS_MESSAGE_LOG_FD ; then
if $READELF -s conftest.o | grep IFUNC >/dev/null 2>&AS_MESSAGE_LOG_FD; then
libc_cv_gcc_indirect_function=yes
fi
fi
rm -f conftest*])
if test x"$libc_cv_ld_gnu_indirect_function" != xyes; then
if test x"$multi_arch" = xyes; then
AC_MSG_ERROR([--enable-multi-arch support requires assembler and linker support])
@ -641,6 +665,11 @@ if test x"$libc_cv_ld_gnu_indirect_function" != xyes; then
multi_arch=no
fi
fi
if test x"$libc_cv_gcc_indirect_function" != xyes &&
test x"$multi_arch" = xyes; then
AC_MSG_WARN([--enable-multi-arch support recommends a gcc with gnu-indirect-function support.
Please use a gcc which supports it by default or configure gcc with --enable-gnu-indirect-function])
fi
multi_arch_d=
if test x"$multi_arch" != xno; then
multi_arch_d=/multiarch
@ -1782,6 +1811,10 @@ if test x"$libc_cv_ld_gnu_indirect_function" = xyes; then
AC_DEFINE(HAVE_IFUNC)
fi
if test x"$libc_cv_gcc_indirect_function" = xyes; then
AC_DEFINE(HAVE_GCC_IFUNC)
fi
# This is far from the AC_ARG_ENABLE that sets it so that a sysdeps
# configure fragment can override the value to prevent this AC_DEFINE.
AC_SUBST(use_nscd)

View file

@ -402,6 +402,14 @@ the newest version of the compiler that is known to work for building
release time, GCC 5.3 is the newest compiler verified to work to build
@theglibc{}.
For multi-arch support it is recommended to use a GCC which has been built with
support for GNU indirect functions. This ensures that correct debugging
information is generated for functions selected by IFUNC resolvers. This
support can either be enabled by configuring GCC with
@samp{--enable-gnu-indirect-function}, or by enabling it by default by setting
@samp{default_gnu_indirect_function} variable for a particular architecture in
the GCC source file @file{gcc/config.gcc}.
You can use whatever compiler you like to compile programs that use
@theglibc{}.