Pass -no-pie to GCC only if GCC defaults to PIE [BZ #22614]

Message ID 20171216022921.GA24140@gmail.com
State Committed
Commit 00c714df398b63934540d95ce3792596f7a94a6c
Headers

Commit Message

H.J. Lu Dec. 16, 2017, 2:29 a.m. UTC
  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.

OK for master?

H.J.
---
	[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.
---
 Makeconfig     |  4 +++-
 config.make.in |  1 +
 configure      | 13 ++++++++-----
 configure.ac   |  8 +++++---
 4 files changed, 17 insertions(+), 9 deletions(-)
  

Comments

Carlos O'Donell Dec. 18, 2017, 7:43 p.m. UTC | #1
On 12/15/2017 06:29 PM, H.J. Lu wrote:
> 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.
> 
> OK for master?

LGTM.
  

Patch

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.