diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2012-11-21 12:31:01 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2012-11-21 12:34:32 -0800 |
commit | 6bfea97493900d456245ca9f29765e1f0ee9d649 (patch) | |
tree | 29187abc833cddbe02fe07b6eb96232300f9ab49 | |
parent | ad35f2dd750ed3e3f483409ef50b38ea19745002 (diff) | |
download | glibc-6bfea97493900d456245ca9f29765e1f0ee9d649.zip glibc-6bfea97493900d456245ca9f29765e1f0ee9d649.tar.gz glibc-6bfea97493900d456245ca9f29765e1f0ee9d649.tar.bz2 |
Properly check linker -z XXX support
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | aclocal.m4 | 28 | ||||
-rwxr-xr-x | configure | 140 | ||||
-rw-r--r-- | configure.in | 71 |
5 files changed, 126 insertions, 121 deletions
@@ -1,5 +1,11 @@ 2012-11-21 H.J. Lu <hongjiu.lu@intel.com> + [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. @@ -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. @@ -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 <<EOF +int _start (void) { return 42; } +EOF + if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS + $2 -nostdlib -nostartfiles + -fPIC -shared -o conftest.so conftest.c + 1>&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)]) @@ -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 <<EOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z nodelete" >&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 <<EOF int _start (void) { return 42; } EOF -if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS - -fPIC -shared -o conftest.so conftest.c - -nostartfiles -nostdlib - -Wl,--enable-new-dtags,-z,nodelete 1>&5' + if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS + -Wl,--enable-new-dtags,-z,nodelete -nostdlib -nostartfiles + -fPIC -shared -o conftest.so conftest.c + 1>&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&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 <<EOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z nodlopen" >&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 <<EOF int _start (void) { return 42; } EOF -if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS - -fPIC -shared -o conftest.so conftest.c - -nostartfiles -nostdlib - -Wl,--enable-new-dtags,-z,nodlopen 1>&5' + if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS + -Wl,--enable-new-dtags,-z,nodlopen -nostdlib -nostartfiles + -fPIC -shared -o conftest.so conftest.c + 1>&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&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 <<EOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z initfirst" >&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 <<EOF int _start (void) { return 42; } EOF -if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS - -fPIC -shared -o conftest.so conftest.c - -nostartfiles -nostdlib - -Wl,--enable-new-dtags,-z,initfirst 1>&5' + if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS + -Wl,--enable-new-dtags,-z,initfirst -nostdlib -nostartfiles + -fPIC -shared -o conftest.so conftest.c + 1>&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&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 <<EOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z execstack" >&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 <<EOF int _start (void) { return 42; } EOF -if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS - -fPIC -shared -o conftest.so conftest.c - -Wl,-z,execstack -nostdlib - 1>&5' + if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS + -Wl,-z,execstack -nostdlib -nostartfiles + -fPIC -shared -o conftest.so conftest.c + 1>&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&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 <<EOF -int _start (void) { return 42; } -EOF -if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS - -fPIC -shared -o conftest.so conftest.c - -nostartfiles -nostdlib - -Wl,--enable-new-dtags,-z,nodelete 1>&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 <<EOF -int _start (void) { return 42; } -EOF -if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS - -fPIC -shared -o conftest.so conftest.c - -nostartfiles -nostdlib - -Wl,--enable-new-dtags,-z,nodlopen 1>&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 <<EOF -int _start (void) { return 42; } -EOF -if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS - -fPIC -shared -o conftest.so conftest.c - -nostartfiles -nostdlib - -Wl,--enable-new-dtags,-z,initfirst 1>&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 <<EOF -int _start (void) { return 42; } -EOF -if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS - -fPIC -shared -o conftest.so conftest.c - -Wl,-z,execstack -nostdlib - 1>&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 |