From 0cae3f4b033e441d820f4521fa5736e4e6e4d713 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 22 Oct 2012 23:40:42 -0400 Subject: [PATCH] change ifunc assembly test to a link test The test currently tests the binutils frontend support which passes for all versions of binutils we currently require (2.20+). It doesn't test the backend which is required for ifunc to actually work, and which most targets don't yet support. Change the assembly code so that when we link it, we get a file that has ifunc relocations if the backend supports it. That way we can test to see if binutils supports everything we need. Signed-off-by: Mike Frysinger --- ChangeLog | 7 ++ configure | 221 +++++++++++++++++++++++++++++++---------------------------- configure.in | 31 ++++++--- 3 files changed, 144 insertions(+), 115 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0b34621859..3c9a31e2eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2012-10-24 Mike Frysinger + * configure.in: Move READELF check to start of file. + (libc_cv_ld_gnu_indirect_function): Change to a link test. Rename from + libc_cv_asm_gnu_indirect_function in the process. + * configure: Regenerated. + +2012-10-24 Mike Frysinger + * configure.in (libc_cv_gcc_static_libgcc): Drop -q flag to grep and send the output to /dev/null. (libc_cv_cc_with_libunwind): Likewise. diff --git a/configure b/configure index 2592022260..8cd403bf4e 100755 --- a/configure +++ b/configure @@ -631,7 +631,6 @@ CXX_SYSINCLUDES SYSINCLUDES AUTOCONF NM -READELF AWK SED MAKEINFO @@ -664,6 +663,7 @@ oldest_abi use_default_link sysheaders with_fp +READELF ac_ct_CXX CXXFLAGS CXX @@ -3397,6 +3397,98 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}readelf", so it can be a program name with args. +set dummy ${ac_tool_prefix}readelf; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_READELF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$READELF"; then + ac_cv_prog_READELF="$READELF" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_READELF="${ac_tool_prefix}readelf" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +READELF=$ac_cv_prog_READELF +if test -n "$READELF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5 +$as_echo "$READELF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_READELF"; then + ac_ct_READELF=$READELF + # Extract the first word of "readelf", so it can be a program name with args. +set dummy readelf; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_READELF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_READELF"; then + ac_cv_prog_ac_ct_READELF="$ac_ct_READELF" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_READELF="readelf" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_READELF=$ac_cv_prog_ac_ct_READELF +if test -n "$ac_ct_READELF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_READELF" >&5 +$as_echo "$ac_ct_READELF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_READELF" = x; then + READELF="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + READELF=$ac_ct_READELF + fi +else + READELF="$ac_cv_prog_READELF" +fi + if test "`cd $srcdir; /bin/pwd`" = "`/bin/pwd`"; then as_fn_error $? "you must configure in a separate build directory" "$LINENO" 5 @@ -4053,25 +4145,36 @@ if test "$base_machine" = "i386"; then fi -# For the multi-arch option we need support in the assembler. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler gnu_indirect_function symbol type support" >&5 -$as_echo_n "checking for assembler gnu_indirect_function symbol type support... " >&6; } -if ${libc_cv_asm_gnu_indirect_function+:} false; then : +# For the multi-arch option we need support in the assembler & linker. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler and linker STT_GNU_IFUNC support" >&5 +$as_echo_n "checking for assembler and linker STT_GNU_IFUNC support... " >&6; } +if ${libc_cv_ld_gnu_indirect_function+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.s <&5 2>&5; -then - libc_cv_asm_gnu_indirect_function=yes -else - libc_cv_asm_gnu_indirect_function=no +libc_cv_ld_gnu_indirect_function=no +if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \ + -nostartfiles -nostdlib \ + -o conftest conftest.s 1>&5 2>&5; then + # Do a link to see if the backend supports IFUNC relocs. + $READELF -r conftest 1>&5 + LC_ALL=C $READELF -r conftest | grep 'no relocations' >/dev/null || { + libc_cv_ld_gnu_indirect_function=yes + } fi rm -f conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_gnu_indirect_function" >&5 -$as_echo "$libc_cv_asm_gnu_indirect_function" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ld_gnu_indirect_function" >&5 +$as_echo "$libc_cv_ld_gnu_indirect_function" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .text pseudo-op must be used" >&5 $as_echo_n "checking whether .text pseudo-op must be used... " >&6; } @@ -4101,7 +4204,7 @@ else $as_echo "yes" >&6; } fi -if test x"$libc_cv_asm_gnu_indirect_function" != xyes; then +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 else @@ -5066,98 +5169,6 @@ fi if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}readelf", so it can be a program name with args. -set dummy ${ac_tool_prefix}readelf; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_READELF+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$READELF"; then - ac_cv_prog_READELF="$READELF" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_READELF="${ac_tool_prefix}readelf" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -READELF=$ac_cv_prog_READELF -if test -n "$READELF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5 -$as_echo "$READELF" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_READELF"; then - ac_ct_READELF=$READELF - # Extract the first word of "readelf", so it can be a program name with args. -set dummy readelf; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_READELF+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_READELF"; then - ac_cv_prog_ac_ct_READELF="$ac_ct_READELF" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_READELF="readelf" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_READELF=$ac_cv_prog_ac_ct_READELF -if test -n "$ac_ct_READELF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_READELF" >&5 -$as_echo "$ac_ct_READELF" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_READELF" = x; then - READELF="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - READELF=$ac_ct_READELF - fi -else - READELF="$ac_cv_prog_READELF" -fi - -if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. set dummy ${ac_tool_prefix}nm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 diff --git a/configure.in b/configure.in index b3fab3772b..4f7bc09842 100644 --- a/configure.in +++ b/configure.in @@ -23,6 +23,7 @@ AC_SUBST(cross_compiling) AC_PROG_CPP # We need the C++ compiler only for testing. AC_PROG_CXX +AC_CHECK_TOOL(READELF, readelf, false) if test "`cd $srcdir; /bin/pwd`" = "`/bin/pwd`"; then AC_MSG_ERROR([you must configure in a separate build directory]) @@ -566,17 +567,28 @@ if test "$base_machine" = "i386"; then AC_DEFINE(USE_REGPARMS) fi -# For the multi-arch option we need support in the assembler. -AC_CACHE_CHECK([for assembler gnu_indirect_function symbol type support], - libc_cv_asm_gnu_indirect_function, [dnl +# For the multi-arch option we need support in the assembler & linker. +AC_CACHE_CHECK([for assembler and linker STT_GNU_IFUNC support], + libc_cv_ld_gnu_indirect_function, [dnl cat > conftest.s <&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; -then - libc_cv_asm_gnu_indirect_function=yes -else - libc_cv_asm_gnu_indirect_function=no +libc_cv_ld_gnu_indirect_function=no +if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \ + -nostartfiles -nostdlib \ + -o conftest conftest.s 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + # Do a link to see if the backend supports IFUNC relocs. + $READELF -r conftest 1>&AS_MESSAGE_LOG_FD + LC_ALL=C $READELF -r conftest | grep 'no relocations' >/dev/null || { + libc_cv_ld_gnu_indirect_function=yes + } fi rm -f conftest*]) @@ -596,7 +608,7 @@ else AC_MSG_RESULT(yes) fi -if test x"$libc_cv_asm_gnu_indirect_function" != xyes; then +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]) else @@ -930,7 +942,6 @@ AC_CHECK_PROG_VER(AWK, gawk, --version, [GNU Awk[^0-9]*\([0-9][0-9.]*\)], [[3-9].*], critic_missing="$critic_missing gawk") -AC_CHECK_TOOL(READELF, readelf, false) AC_CHECK_TOOL(NM, nm, false) AC_CHECK_PROGS(AUTOCONF, autoconf, no) -- 2.11.4.GIT