From 6bfea97493900d456245ca9f29765e1f0ee9d649 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 21 Nov 2012 12:31:01 -0800 Subject: [PATCH] Properly check linker -z XXX support --- ChangeLog | 6 +++ NEWS | 2 +- aclocal.m4 | 28 ++++++++++++ configure | 140 ++++++++++++++++++++++++++++++++++------------------------- configure.in | 71 +++++------------------------- 5 files changed, 126 insertions(+), 121 deletions(-) diff --git a/ChangeLog b/ChangeLog index b2b2538..4f19853 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2012-11-21 H.J. Lu + [BZ #14865] + * aclocal.m4 (LIBC_LINKER_FEATURE): New macro. + * configure.in: Use LIBC_LINKER_FEATURE to check -z nodelete, + -z nodlopen, -z initfirst and -z execstack support. + * configure: Regenerated. + * elf/elf.h (DF_1_NODIRECT): New macro. (DF_1_IGNMULDEF): Likewise. (DF_1_NOKSYMS): Likewise. diff --git a/NEWS b/NEWS index 9eb0a10..8df3022 100644 --- a/NEWS +++ b/NEWS @@ -21,7 +21,7 @@ Version 2.17 14638, 14645, 14648, 14652, 14660, 14661, 14669, 14672, 14683, 14694, 14716, 14719, 14743, 14767, 14783, 14784, 14785, 14793, 14796, 14797, 14801, 14805, 14807, 14809, 14811, 14815, 14821, 14824, 14828, 14831, - 14835, 14838, 14856, 14866. + 14835, 14838, 14856, 14865, 14866. * Port to ARM AArch64 contributed by Linaro. diff --git a/aclocal.m4 b/aclocal.m4 index b173e9e..956ea86 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -213,3 +213,31 @@ AC_DEFUN([ACX_BUGURL],[ AC_SUBST(REPORT_BUGS_TO) AC_SUBST(REPORT_BUGS_TEXI) ]) + +dnl Check linker option support. +dnl LIBC_LINKER_FEATURE([ld_option], [cc_option], [action-if-true], [action-if-false]) +AC_DEFUN([LIBC_LINKER_FEATURE], +[AC_MSG_CHECKING([for linker that supports $1]) +libc_linker_feature=no +if test x"$gnu_ld" = x"yes"; then + libc_linker_check=`$LD -v --help 2>/dev/null | grep "\$1"` + if test -n "$libc_linker_check"; then + cat > conftest.c <&AS_MESSAGE_LOG_FD]) + then + libc_linker_feature=yes + fi + rm -f conftest* + fi +fi +if test $libc_linker_feature = yes; then + $3 +else + $4 +fi +AC_MSG_RESULT($libc_linker_feature)]) diff --git a/configure b/configure index 1927ce8..ff2d34c 100755 --- a/configure +++ b/configure @@ -6235,86 +6235,101 @@ if test $libc_cv_cc_with_libunwind = yes; then fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -z nodelete option" >&5 -$as_echo_n "checking for -z nodelete option... " >&6; } -if ${libc_cv_z_nodelete+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat > conftest.c <&5 +$as_echo_n "checking for linker that supports -z nodelete... " >&6; } +libc_linker_feature=no +if test x"$gnu_ld" = x"yes"; then + libc_linker_check=`$LD -v --help 2>/dev/null | grep "\-z nodelete"` + if test -n "$libc_linker_check"; then + cat > conftest.c <&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } -then + then + libc_linker_feature=yes + fi + rm -f conftest* + fi +fi +if test $libc_linker_feature = yes; then libc_cv_z_nodelete=yes else as_fn_error $? "linker with -z nodelete support required" "$LINENO" 5 fi -rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_z_nodelete" >&5 -$as_echo "$libc_cv_z_nodelete" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5 +$as_echo "$libc_linker_feature" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -z nodlopen option" >&5 -$as_echo_n "checking for -z nodlopen option... " >&6; } -if ${libc_cv_z_nodlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat > conftest.c <&5 +$as_echo_n "checking for linker that supports -z nodlopen... " >&6; } +libc_linker_feature=no +if test x"$gnu_ld" = x"yes"; then + libc_linker_check=`$LD -v --help 2>/dev/null | grep "\-z nodlopen"` + if test -n "$libc_linker_check"; then + cat > conftest.c <&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } -then + then + libc_linker_feature=yes + fi + rm -f conftest* + fi +fi +if test $libc_linker_feature = yes; then libc_cv_z_nodlopen=yes else as_fn_error $? "linker with -z nodlopen support required" "$LINENO" 5 fi -rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_z_nodlopen" >&5 -$as_echo "$libc_cv_z_nodlopen" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5 +$as_echo "$libc_linker_feature" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -z initfirst option" >&5 -$as_echo_n "checking for -z initfirst option... " >&6; } -if ${libc_cv_z_initfirst+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat > conftest.c <&5 +$as_echo_n "checking for linker that supports -z initfirst... " >&6; } +libc_linker_feature=no +if test x"$gnu_ld" = x"yes"; then + libc_linker_check=`$LD -v --help 2>/dev/null | grep "\-z initfirst"` + if test -n "$libc_linker_check"; then + cat > conftest.c <&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } -then + then + libc_linker_feature=yes + fi + rm -f conftest* + fi +fi +if test $libc_linker_feature = yes; then libc_cv_z_initfirst=yes else as_fn_error $? "linker with -z initfirst support required" "$LINENO" 5 fi -rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_z_initfirst" >&5 -$as_echo "$libc_cv_z_initfirst" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5 +$as_echo "$libc_linker_feature" >&6; } # Add-on fragments can set these for other machines. libc_commonpagesize=${libc_commonpagesize:-no} @@ -6511,32 +6526,37 @@ if test "$libc_cv_z_combreloc" = yes; then fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -z execstack" >&5 -$as_echo_n "checking for -z execstack... " >&6; } -if ${libc_cv_z_execstack+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat > conftest.c <&5 +$as_echo_n "checking for linker that supports -z execstack... " >&6; } +libc_linker_feature=no +if test x"$gnu_ld" = x"yes"; then + libc_linker_check=`$LD -v --help 2>/dev/null | grep "\-z execstack"` + if test -n "$libc_linker_check"; then + cat > conftest.c <&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } -then + then + libc_linker_feature=yes + fi + rm -f conftest* + fi +fi +if test $libc_linker_feature = yes; then libc_cv_z_execstack=yes else libc_cv_z_execstack=no fi -rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_z_execstack" >&5 -$as_echo "$libc_cv_z_execstack" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5 +$as_echo "$libc_linker_feature" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fpie" >&5 diff --git a/configure.in b/configure.in index 9decd7d..a7f7198 100644 --- a/configure.in +++ b/configure.in @@ -1409,53 +1409,17 @@ if test $libc_cv_cc_with_libunwind = yes; then AC_DEFINE(HAVE_CC_WITH_LIBUNWIND) fi -AC_CACHE_CHECK(for -z nodelete option, - libc_cv_z_nodelete, [dnl -cat > conftest.c <&AS_MESSAGE_LOG_FD]) -then - libc_cv_z_nodelete=yes -else - AC_MSG_ERROR(linker with -z nodelete support required) -fi -rm -f conftest*]) +LIBC_LINKER_FEATURE([-z nodelete], [-Wl,--enable-new-dtags,-z,nodelete], + [libc_cv_z_nodelete=yes], + [AC_MSG_ERROR(linker with -z nodelete support required)]) -AC_CACHE_CHECK(for -z nodlopen option, - libc_cv_z_nodlopen, [dnl -cat > conftest.c <&AS_MESSAGE_LOG_FD]) -then - libc_cv_z_nodlopen=yes -else - AC_MSG_ERROR(linker with -z nodlopen support required) -fi -rm -f conftest*]) +LIBC_LINKER_FEATURE([-z nodlopen], [-Wl,--enable-new-dtags,-z,nodlopen], + [libc_cv_z_nodlopen=yes], + [AC_MSG_ERROR(linker with -z nodlopen support required)]) -AC_CACHE_CHECK(for -z initfirst option, - libc_cv_z_initfirst, [dnl -cat > conftest.c <&AS_MESSAGE_LOG_FD]) -then - libc_cv_z_initfirst=yes -else - AC_MSG_ERROR(linker with -z initfirst support required) -fi -rm -f conftest*]) +LIBC_LINKER_FEATURE([-z initfirst], [-Wl,--enable-new-dtags,-z,initfirst], + [libc_cv_z_initfirst=yes], + [AC_MSG_ERROR(linker with -z initfirst support required)]) # Add-on fragments can set these for other machines. libc_commonpagesize=${libc_commonpagesize:-no} @@ -1593,21 +1557,8 @@ if test "$libc_cv_z_combreloc" = yes; then fi AC_SUBST(libc_cv_z_combreloc) -AC_CACHE_CHECK(for -z execstack, - libc_cv_z_execstack, [dnl -cat > conftest.c <&AS_MESSAGE_LOG_FD]) -then - libc_cv_z_execstack=yes -else - libc_cv_z_execstack=no -fi -rm -f conftest*]) +LIBC_LINKER_FEATURE([-z execstack], [-Wl,-z,execstack], + [libc_cv_z_execstack=yes], [libc_cv_z_execstack=no]) AC_SUBST(libc_cv_z_execstack) AC_CACHE_CHECK(for -fpie, libc_cv_fpie, [dnl -- 2.7.4