diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-12-18 12:24:26 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-12-18 12:24:38 -0800 |
commit | 00c714df398b63934540d95ce3792596f7a94a6c (patch) | |
tree | f96ed5735a44f5a6afff6efafe5dc86f1b93fecb | |
parent | 8e1472d2c1e25e6eabc2059170731365f6d5b3d1 (diff) | |
download | glibc-00c714df398b63934540d95ce3792596f7a94a6c.tar.gz glibc-00c714df398b63934540d95ce3792596f7a94a6c.tar.xz glibc-00c714df398b63934540d95ce3792596f7a94a6c.zip |
Pass -no-pie to GCC only if GCC defaults to PIE [BZ #22614]
After --enable-static-pie is added to configure, libc_cv_pie_default is set to yes when either --enable-static-pie is used to configure glibc or GCC defaults to PIE. We should set no-pie-ldflag to -no-pie, which is supported on GCC 6 and later, only if GCC defaults to PIE, not when --enable-static-pie is used to configure glibc. Tested on x32 with --enable-static-pie using GCC 5 and without --enable-static-pie using GCC 7. [BZ #22614] * Makeconfig (no-pie-ldflag): Set to -no-pie only if $(cc-pie-default) == yes. * config.make.in (cc-pie-default): New. * configure.ac (libc_cv_pie_default): Renamed to ... (libc_cv_cc_pie_default): This. (libc_cv_pie_default): Set to $libc_cv_cc_pie_default. * configure: Regenerated.
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | Makeconfig | 4 | ||||
-rw-r--r-- | config.make.in | 1 | ||||
-rwxr-xr-x | configure | 13 | ||||
-rw-r--r-- | configure.ac | 8 |
5 files changed, 28 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog index a46375fd56..e7d5d4b110 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2017-12-18 H.J. Lu <hongjiu.lu@intel.com> + + [BZ #22614] + * Makeconfig (no-pie-ldflag): Set to -no-pie only if + $(cc-pie-default) == yes. + * config.make.in (cc-pie-default): New. + * configure.ac (libc_cv_pie_default): Renamed to ... + (libc_cv_cc_pie_default): This. + (libc_cv_pie_default): Set to $libc_cv_cc_pie_default. + * configure: Regenerated. + 2017-12-18 Florian Weimer <fweimer@redhat.com> [BZ #20204] diff --git a/Makeconfig b/Makeconfig index 99cc136bfa..80c498e33b 100644 --- a/Makeconfig +++ b/Makeconfig @@ -464,8 +464,10 @@ endif # Commands for linking programs with the C library. ifndef +link ifeq (yes,$(build-shared)) -ifeq (yes,$(build-pie-default)) +ifeq (yes,$(cc-pie-default)) no-pie-ldflag = -no-pie +endif +ifeq (yes,$(build-pie-default)) +link = $(+link-pie) +link-tests = $(+link-pie-tests) +link-printers-tests = $(+link-pie-printers-tests) diff --git a/config.make.in b/config.make.in index 04513dbb74..9e5e24b2c6 100644 --- a/config.make.in +++ b/config.make.in @@ -89,6 +89,7 @@ static-nss-crypt = @libc_cv_static_nss_crypt@ build-shared = @shared@ build-pic-default= @libc_cv_pic_default@ build-pie-default= @libc_cv_pie_default@ +cc-pie-default= @libc_cv_cc_pie_default@ build-profile = @profile@ build-static-nss = @static_nss@ cross-compiling = @cross_compiling@ diff --git a/configure b/configure index 9da9fb2736..7a8bd3f817 100755 --- a/configure +++ b/configure @@ -596,6 +596,7 @@ static_nss profile libc_cv_multidir libc_cv_pie_default +libc_cv_cc_pie_default libc_cv_pic_default shared static @@ -6748,22 +6749,24 @@ $as_echo "$libc_cv_pic_default" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -fPIE is default" >&5 $as_echo_n "checking whether -fPIE is default... " >&6; } -if ${libc_cv_pie_default+:} false; then : +if ${libc_cv_cc_pie_default+:} false; then : $as_echo_n "(cached) " >&6 else - libc_cv_pie_default=yes + libc_cv_cc_pie_default=yes cat > conftest.c <<EOF #if defined __PIE__ || defined __pie__ || defined PIE || defined pie # error PIE is default. #endif EOF if eval "${CC-cc} -S conftest.c 2>&5 1>&5"; then - libc_cv_pie_default=no + libc_cv_cc_pie_default=no fi rm -f conftest.* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_pie_default" >&5 -$as_echo "$libc_cv_pie_default" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_pie_default" >&5 +$as_echo "$libc_cv_cc_pie_default" >&6; } +libc_cv_pie_default=$libc_cv_cc_pie_default + # Set the `multidir' variable by grabbing the variable from the compiler. diff --git a/configure.ac b/configure.ac index 8e4006f0a9..ca1282a6b3 100644 --- a/configure.ac +++ b/configure.ac @@ -1794,17 +1794,19 @@ fi rm -f conftest.*]) AC_SUBST(libc_cv_pic_default) -AC_CACHE_CHECK([whether -fPIE is default], libc_cv_pie_default, -[libc_cv_pie_default=yes +AC_CACHE_CHECK([whether -fPIE is default], libc_cv_cc_pie_default, +[libc_cv_cc_pie_default=yes cat > conftest.c <<EOF #if defined __PIE__ || defined __pie__ || defined PIE || defined pie # error PIE is default. #endif EOF if eval "${CC-cc} -S conftest.c 2>&AS_MESSAGE_LOG_FD 1>&AS_MESSAGE_LOG_FD"; then - libc_cv_pie_default=no + libc_cv_cc_pie_default=no fi rm -f conftest.*]) +libc_cv_pie_default=$libc_cv_cc_pie_default +AC_SUBST(libc_cv_cc_pie_default) AC_SUBST(libc_cv_pie_default) # Set the `multidir' variable by grabbing the variable from the compiler. |