]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Add configure check to test if gcc supports attribute ifunc.
authorStefan Liebler <stli@linux.vnet.ibm.com>
Fri, 7 Oct 2016 07:56:46 +0000 (09:56 +0200)
committerStefan Liebler <stli@linux.vnet.ibm.com>
Fri, 7 Oct 2016 08:02:59 +0000 (10:02 +0200)
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.

ChangeLog
INSTALL
NEWS
config.h.in
configure
configure.ac
manual/install.texi

index 437667385afd83387affc638c8af2b989a6f8912..bc0c75c3d126867573528a8953dbe2448c412c33 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/INSTALL b/INSTALL
index 51f26bf962677de6bd290ee1268110fee4b51b9a..b5acedcc9690f0eac7c180c3a79cefba4dfada86 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -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.
 
diff --git a/NEWS b/NEWS
index b5894afce3490aeec8f3be83d7b65693cccb8e23..b077d0a0782f7f5704302f8f19a2d6ddee9d12d5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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
index 8cd08b0e89a27862807f25aac8f0c6cd6e5b5d6a..33757bd553711a96e5526c327390867ec9e0b268 100644 (file)
 /* 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
 
index 6ff252744bd373f7104c9c93644d8da62bb9285a..e80e0ad56c3b025614cb7125ed79698ffe371d46 100755 (executable)
--- a/configure
+++ b/configure
@@ -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.
 
index 9938ab0dc27df75fbbb332470259604a6a1e6e6a..a64aeb9979a53cd7f69c20f6f38db75c7a1bdf49 100644 (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)
index 663f8d59fbf156e76c443f6ad62dc8e6b5bef4e6..de1c2030d3f1a895332e57d1ebcb9c82e8172609 100644 (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{}.