This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v2 1/9] Add configure check to test if gcc supports attribute ifunc.
- From: Stefan Liebler <stli at linux dot vnet dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Cc: stli at linux dot vnet dot ibm dot com, fweimer at redhat dot com, murphyp at linux dot vnet dot ibm dot com, schwab at linux-m68k dot org, joseph_myers at mentor dot com
- Date: Mon, 8 Aug 2016 16:38:57 +0200
- Subject: [PATCH v2 1/9] Add configure check to test if gcc supports attribute ifunc.
- Authentication-results: sourceware.org; auth=none
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 and glibc is configured with
--enable-multi-arch then configure will abort with an error message.
If --enable-multi-arch is not given then configure will silently
disable multi-arch support.
ChangeLog:
* configure.ac: Add check if gcc supports attribute ifunc feature.
* configure: Regenerated.
---
configure | 38 +++++++++++++++++++++++++++++++++++---
configure.ac | 32 +++++++++++++++++++++++++++++---
2 files changed, 64 insertions(+), 6 deletions(-)
diff --git a/configure b/configure
index 17625e1..aedada3 100755
--- a/configure
+++ b/configure
@@ -3914,9 +3914,40 @@ 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; }
-if test x"$libc_cv_ld_gnu_indirect_function" != xyes; then
+# 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 \
+ || test x"$libc_cv_gcc_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
+ as_fn_error $? "--enable-multi-arch support require gcc, assembler and linker indirect-function support" "$LINENO" 5
else
multi_arch=no
fi
@@ -6499,7 +6530,8 @@ fi
# A sysdeps configure fragment can reset this if IFUNC is not actually
# usable even though the assembler knows how to generate the symbol type.
-if test x"$libc_cv_ld_gnu_indirect_function" = xyes; then
+if test x"$libc_cv_ld_gnu_indirect_function" = xyes \
+ && test x"$libc_cv_gcc_indirect_function" = xyes; then
$as_echo "#define HAVE_IFUNC 1" >>confdefs.h
fi
diff --git a/configure.ac b/configure.ac
index 33bcd62..0961151 100644
--- a/configure.ac
+++ b/configure.ac
@@ -634,9 +634,34 @@ if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
fi
rm -f conftest*])
-if test x"$libc_cv_ld_gnu_indirect_function" != xyes; then
+# 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 \
+ || test x"$libc_cv_gcc_indirect_function" != xyes; then
if test x"$multi_arch" = xyes; then
- AC_MSG_ERROR([--enable-multi-arch support requires assembler and linker support])
+ AC_MSG_ERROR([--enable-multi-arch support require gcc, assembler and linker indirect-function support])
else
multi_arch=no
fi
@@ -1766,7 +1791,8 @@ AC_SUBST(libc_cv_gcc_unwind_find_fde)
# A sysdeps configure fragment can reset this if IFUNC is not actually
# usable even though the assembler knows how to generate the symbol type.
-if test x"$libc_cv_ld_gnu_indirect_function" = xyes; then
+if test x"$libc_cv_ld_gnu_indirect_function" = xyes \
+ && test x"$libc_cv_gcc_indirect_function" = xyes; then
AC_DEFINE(HAVE_IFUNC)
fi
--
2.5.5