Avoid build multiarch if compiler warns about mismatched alias

GCC 8 emits an warning for alias for functions with incompatible types
and it is used extensivelly for ifunc resolvers implementations in C
(for instance on weak_alias with the internal symbol name to the
external one or with the libc_hidden_def to set ifunc for internal
usage).

This breaks the build when the ifunc resolver is not defined using
gcc attribute extensions (HAVE_GCC_IFUNC being 0).  Although for
all currently architectures that have multiarch support this compiler
options is enabled for default, there is still the option where the
user might try build glibc with a compiler without support for such
extension.  In this case this patch just disable the multiarch folder
in sysdeps selections.

GCC 7 and before still builds IFUNCs regardless of compiler support
(although for the lack of attribute support debug information would
be optimal).

Checked with a build on multiarch support architectures (aarch64,
arm, sparc, s390, powerpc, x86_64, i386) with multiarch enable
and disable and with GCC 7 and GCC 8.

	* configure.ac (libc_cv_gcc_incompatbile_alias): New define:
	indicates whether compiler emits an warning for alias for
	functions with incompatible types.
This commit is contained in:
Adhemerval Zanella 2017-10-10 11:12:50 -03:00
parent fe05e1cb6d
commit 8f6f536272
3 changed files with 80 additions and 6 deletions

View File

@ -1,5 +1,9 @@
2017-10-20 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* configure.ac (libc_cv_gcc_incompatbile_alias): New define:
indicates whether compiler emits an warning for alias for
functions with incompatible types.
[BZ #22273]
* sysdeps/unix/sysv/linux/spawni.c (__spawnix): Handle the case where
the auxiliary process is terminated by a signal before calling _exit

45
configure vendored
View File

@ -3996,6 +3996,32 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_indirect_function" >&5
$as_echo "$libc_cv_gcc_indirect_function" >&6; }
# Check if gcc warns about alias for function with incompatible types.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler warns about alias for function with incompatible types" >&5
$as_echo_n "checking if compiler warns about alias for function with incompatible types... " >&6; }
if ${libc_cv_gcc_incompatible_alias+:} false; then :
$as_echo_n "(cached) " >&6
else
cat > conftest.c <<EOF
int __redirect_foo (const void *s, int c);
__typeof (__redirect_foo) *foo_impl (void) __asm__ ("foo");
__typeof (__redirect_foo) *foo_impl (void)
{
return 0;
}
extern __typeof (__redirect_foo) foo_alias __attribute__ ((alias ("foo")));
EOF
libc_cv_gcc_incompatible_alias=yes
if ${CC-cc} -Werror -c conftest.c -o conftest.o 1>&5 2>&5 ; then
libc_cv_gcc_incompatible_alias=no
fi
rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_incompatible_alias" >&5
$as_echo "$libc_cv_gcc_incompatible_alias" >&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
@ -4003,12 +4029,25 @@ 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.
if test x"$libc_cv_gcc_indirect_function" != xyes; then
# GCC 8+ emits a warning for alias with incompatible types and it might
# fail to build ifunc resolvers aliases to either weak or internal
# symbols. Disables multiarch build in this case.
if test x"$libc_cv_gcc_incompatible_alias" == xyes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gcc emits a warning for alias between functions of incompatible types" >&5
$as_echo "$as_me: WARNING: gcc emits a warning for alias between functions of incompatible types" >&2;}
if test x"$multi_arch" = xyes; then
as_fn_error $? "--enable-multi-arch support requires a gcc with gnu-indirect-function support" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Multi-arch is disabled." >&5
$as_echo "$as_me: WARNING: Multi-arch is disabled." >&2;}
multi_arch=no
elif 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
fi
multi_arch_d=
if test x"$multi_arch" != xno; then

View File

@ -634,6 +634,26 @@ if ${CC-cc} -c conftest.c -o conftest.o 1>&AS_MESSAGE_LOG_FD \
fi
rm -f conftest*])
# Check if gcc warns about alias for function with incompatible types.
AC_CACHE_CHECK([if compiler warns about alias for function with incompatible types],
libc_cv_gcc_incompatible_alias, [dnl
cat > conftest.c <<EOF
int __redirect_foo (const void *s, int c);
__typeof (__redirect_foo) *foo_impl (void) __asm__ ("foo");
__typeof (__redirect_foo) *foo_impl (void)
{
return 0;
}
extern __typeof (__redirect_foo) foo_alias __attribute__ ((alias ("foo")));
EOF
libc_cv_gcc_incompatible_alias=yes
if ${CC-cc} -Werror -c conftest.c -o conftest.o 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ; then
libc_cv_gcc_incompatible_alias=no
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,10 +661,21 @@ 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.
if test x"$libc_cv_gcc_indirect_function" != xyes; then
# GCC 8+ emits a warning for alias with incompatible types and it might
# fail to build ifunc resolvers aliases to either weak or internal
# symbols. Disables multiarch build in this case.
if test x"$libc_cv_gcc_incompatible_alias" == xyes; then
AC_MSG_WARN([gcc emits a warning for alias between functions of incompatible types])
if test x"$multi_arch" = xyes; then
AC_MSG_ERROR([--enable-multi-arch support requires a gcc with gnu-indirect-function support])
fi
AC_MSG_WARN([Multi-arch is disabled.])
multi_arch=no
elif 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
fi
multi_arch_d=
if test x"$multi_arch" != xno; then