Blame SOURCES/gcc11-pie.patch

e7fd42
From 088d8e322811394203220663c3b9c925980d57a2 Mon Sep 17 00:00:00 2001
e7fd42
From: Marek Polacek <polacek@redhat.com>
e7fd42
Date: Tue, 1 Feb 2022 18:27:16 -0500
e7fd42
Subject: [PATCH] configure: Implement --enable-host-pie
e7fd42
e7fd42
This patch implements the --enable-host-pie configure option which
e7fd42
makes the compiler executables PIE.  This can be used to enhance
e7fd42
protection against ROP attacks, and can be viewed as part of a wider
e7fd42
trend to harden binaries.
e7fd42
e7fd42
It is similar to the option --enable-host-shared, except that --e-h-s
e7fd42
won't add -shared to the linker flags whereas --e-h-p will add -pie.
e7fd42
It is different from --enable-default-pie because that option just
e7fd42
adds an implicit -fPIE/-pie when the compiler is invoked, but the
e7fd42
compiler itself isn't PIE.
e7fd42
e7fd42
Since r12-5768-gfe7c3ecf, PCH works well with PIE, so there are no PCH
e7fd42
regressions.
e7fd42
e7fd42
I plan to add an option to link with -Wl,-z,now.
e7fd42
e7fd42
c++tools/ChangeLog:
e7fd42
e7fd42
	* Makefile.in: Rename PIEFLAG to PICFLAG.  Set LD_PICFLAG.  Use it.
e7fd42
	Use pic/libiberty.a if PICFLAG is set.
e7fd42
	* configure.ac (--enable-default-pie): Set PICFLAG instead of PIEFLAG.
e7fd42
	(--enable-host-pie): New check.
e7fd42
	* configure: Regenerate.
e7fd42
e7fd42
gcc/ChangeLog:
e7fd42
e7fd42
	* Makefile.in: Set LD_PICFLAG.  Use it.  Set enable_host_pie.
e7fd42
	Remove NO_PIE_CFLAGS and NO_PIE_FLAG.  Pass LD_PICFLAG to
e7fd42
	ALL_LINKERFLAGS.  Use the "pic" build of libiberty if --enable-host-pie.
e7fd42
	* configure.ac (--enable-host-shared): Don't set PICFLAG here.
e7fd42
	(--enable-host-pie): New check.  Set PICFLAG and LD_PICFLAG after this
e7fd42
	check.
e7fd42
	* configure: Regenerate.
e7fd42
	* doc/install.texi: Document --enable-host-pie.
e7fd42
e7fd42
libcody/ChangeLog:
e7fd42
e7fd42
	* Makefile.in: Pass LD_PICFLAG to LDFLAGS.
e7fd42
	* configure.ac (--enable-host-shared): Don't set PICFLAG here.
e7fd42
	(--enable-host-pie): New check.  Set PICFLAG and LD_PICFLAG after this
e7fd42
	check.
e7fd42
	* configure: Regenerate.
e7fd42
e7fd42
libcpp/ChangeLog:
e7fd42
e7fd42
	* configure.ac (--enable-host-shared): Don't set PICFLAG here.
e7fd42
	(--enable-host-pie): New check.  Set PICFLAG after this check.
e7fd42
	* configure: Regenerate.
e7fd42
e7fd42
libdecnumber/ChangeLog:
e7fd42
e7fd42
	* configure.ac (--enable-host-shared): Don't set PICFLAG here.
e7fd42
	(--enable-host-pie): New check.  Set PICFLAG after this check.
e7fd42
	* configure: Regenerate.
e7fd42
e7fd42
zlib/ChangeLog:
e7fd42
e7fd42
	* configure.ac (--enable-host-shared): Don't set PICFLAG here.
e7fd42
	(--enable-host-pie): New check.  Set PICFLAG after this check.
e7fd42
	* configure: Regenerate.
e7fd42
---
e7fd42
 c++tools/Makefile.in      | 11 ++++++---
e7fd42
 c++tools/configure        | 17 +++++++++++---
e7fd42
 c++tools/configure.ac     | 11 +++++++--
e7fd42
 gcc/Makefile.in           | 29 ++++++++++++++----------
e7fd42
 gcc/configure             | 47 +++++++++++++++++++++++++++------------
e7fd42
 gcc/configure.ac          | 36 +++++++++++++++++++++---------
e7fd42
 gcc/d/Make-lang.in        |  2 +-
e7fd42
 gcc/doc/install.texi      | 16 +++++++++++--
e7fd42
 libcody/Makefile.in       |  2 +-
e7fd42
 libcody/configure         | 30 ++++++++++++++++++++++++-
e7fd42
 libcody/configure.ac      | 26 ++++++++++++++++++++--
e7fd42
 libcpp/configure          | 22 +++++++++++++++++-
e7fd42
 libcpp/configure.ac       | 19 ++++++++++++++--
e7fd42
 libdecnumber/configure    | 22 +++++++++++++++++-
e7fd42
 libdecnumber/configure.ac | 19 ++++++++++++++--
e7fd42
 zlib/configure            | 30 ++++++++++++++++++++-----
e7fd42
 zlib/configure.ac         | 21 ++++++++++++++---
e7fd42
 17 files changed, 295 insertions(+), 65 deletions(-)
e7fd42
e7fd42
diff --git a/c++tools/Makefile.in b/c++tools/Makefile.in
e7fd42
index d6a33613732..4d5a5b0522b 100644
e7fd42
--- a/c++tools/Makefile.in
e7fd42
+++ b/c++tools/Makefile.in
e7fd42
@@ -28,8 +28,9 @@ AUTOCONF := @AUTOCONF@
e7fd42
 AUTOHEADER := @AUTOHEADER@
e7fd42
 CXX := @CXX@
e7fd42
 CXXFLAGS := @CXXFLAGS@
e7fd42
-PIEFLAG := @PIEFLAG@
e7fd42
-CXXOPTS := $(CXXFLAGS) $(PIEFLAG) -fno-exceptions -fno-rtti
e7fd42
+PICFLAG := @PICFLAG@
e7fd42
+LD_PICFLAG := @LD_PICFLAG@
e7fd42
+CXXOPTS := $(CXXFLAGS) $(PICFLAG) -fno-exceptions -fno-rtti
e7fd42
 LDFLAGS := @LDFLAGS@
e7fd42
 exeext := @EXEEXT@
e7fd42
 LIBIBERTY := ../libiberty/libiberty.a
e7fd42
@@ -87,11 +88,15 @@ ifeq (@CXX_AUX_TOOLS@,yes)
e7fd42
 
e7fd42
 all::g++-mapper-server$(exeext)
e7fd42
 
e7fd42
+ifneq ($(PICFLAG),)
e7fd42
+override LIBIBERTY := ../libiberty/pic/libiberty.a
e7fd42
+endif
e7fd42
+
e7fd42
 MAPPER.O := server.o resolver.o
e7fd42
 CODYLIB = ../libcody/libcody.a
e7fd42
 CXXINC += -I$(srcdir)/../libcody -I$(srcdir)/../include -I$(srcdir)/../gcc -I.
e7fd42
 g++-mapper-server$(exeext): $(MAPPER.O) $(CODYLIB)
e7fd42
-	+$(CXX) $(LDFLAGS) $(PIEFLAG) -o $@ $^ $(VERSION.O) $(LIBIBERTY) $(NETLIBS)
e7fd42
+	+$(CXX) $(LDFLAGS) $(PICFLAG) $(LD_PICFLAG) -o $@ $^ $(VERSION.O) $(LIBIBERTY) $(NETLIBS)
e7fd42
 
e7fd42
 # copy to gcc dir so tests there can run
e7fd42
 all::../gcc/g++-mapper-server$(exeext)
e7fd42
diff --git a/c++tools/configure b/c++tools/configure
e7fd42
index 742816e4253..88087009383 100755
e7fd42
--- a/c++tools/configure
e7fd42
+++ b/c++tools/configure
e7fd42
@@ -630,7 +630,8 @@ CPP
e7fd42
 ac_ct_CC
e7fd42
 CFLAGS
e7fd42
 CC
e7fd42
-PIEFLAG
e7fd42
+LD_PICFLAG
e7fd42
+PICFLAG
e7fd42
 MAINTAINER
e7fd42
 CXX_AUX_TOOLS
e7fd42
 AUTOHEADER
e7fd42
@@ -702,6 +703,7 @@ enable_option_checking
e7fd42
 enable_c___tools
e7fd42
 enable_maintainer_mode
e7fd42
 enable_default_pie
e7fd42
+enable_host_pie
e7fd42
 with_gcc_major_version_only
e7fd42
 '
e7fd42
       ac_precious_vars='build_alias
e7fd42
@@ -1333,6 +1335,7 @@ Optional Features:
e7fd42
                           enable maintainer mode. Add rules to rebuild
e7fd42
                           configurey bits
e7fd42
   --enable-default-pie    enable Position Independent Executable as default
e7fd42
+  --enable-host-pie       build host code as PIE
e7fd42
 
e7fd42
 Optional Packages:
e7fd42
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
e7fd42
@@ -2992,12 +2995,20 @@ test "$maintainer_mode" = yes && MAINTAI
e7fd42
 # Check whether --enable-default-pie was given.
e7fd42
 # Check whether --enable-default-pie was given.
e7fd42
 if test "${enable_default_pie+set}" = set; then :
e7fd42
-  enableval=$enable_default_pie; PIEFLAG=-fPIE
e7fd42
+  enableval=$enable_default_pie; PICFLAG=-fPIE
e7fd42
 else
e7fd42
-  PIEFLAG=
e7fd42
+  PICFLAG=
e7fd42
 fi
e7fd42
 
e7fd42
 
e7fd42
+# Enable --enable-host-pie
e7fd42
+# Check whether --enable-host-pie was given.
e7fd42
+if test "${enable_host_pie+set}" = set; then :
e7fd42
+  enableval=$enable_host_pie; PICFLAG=-fPIE; LD_PICFLAG=-pie
e7fd42
+fi
e7fd42
+
e7fd42
+
e7fd42
+
e7fd42
 
e7fd42
 # Check if O_CLOEXEC is defined by fcntl
e7fd42
 ac_ext=c
e7fd42
diff --git a/c++tools/configure.ac b/c++tools/configure.ac
e7fd42
index 6662b5ad7c9..1e42689f2eb 100644
e7fd42
--- a/c++tools/configure.ac
e7fd42
+++ b/c++tools/configure.ac
e7fd42
@@ -102,8 +102,15 @@ fi
e7fd42
 AC_ARG_ENABLE(default-pie,
e7fd42
 [AS_HELP_STRING([--enable-default-pie],
e7fd42
 		  [enable Position Independent Executable as default])],
e7fd42
-[PIEFLAG=-fPIE], [PIEFLAG=])
e7fd42
-AC_SUBST([PIEFLAG])
e7fd42
+[PICFLAG=-fPIE], [PICFLAG=])
e7fd42
+
e7fd42
+# Enable --enable-host-pie
e7fd42
+AC_ARG_ENABLE(host-pie,
e7fd42
+[AS_HELP_STRING([--enable-host-pie],
e7fd42
+		[build host code as PIE])],
e7fd42
+[PICFLAG=-fPIE; LD_PICFLAG=-pie], [])
e7fd42
+AC_SUBST(PICFLAG)
e7fd42
+AC_SUBST(LD_PICFLAG)
e7fd42
 
e7fd42
 # Check if O_CLOEXEC is defined by fcntl
e7fd42
 AC_CACHE_CHECK(for O_CLOEXEC, ac_cv_o_cloexec, [
e7fd42
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
e7fd42
index 31ff95500c9..151dbfa54ec 100644
e7fd42
--- a/gcc/Makefile.in
e7fd42
+++ b/gcc/Makefile.in
e7fd42
@@ -155,6 +155,9 @@ LDFLAGS = @LDFLAGS@
e7fd42
 # Should we build position-independent host code?
e7fd42
 PICFLAG = @PICFLAG@
e7fd42
 
e7fd42
+# The linker flag for the above.
e7fd42
+LD_PICFLAG = @LD_PICFLAG@
e7fd42
+
e7fd42
 # Flags to determine code coverage. When coverage is disabled, this will
e7fd42
 # contain the optimization flags, as you normally want code coverage
e7fd42
 # without optimization.
e7fd42
@@ -263,18 +266,17 @@ LINKER = $(CC)
e7fd42
 LINKER_FLAGS = $(CFLAGS)
e7fd42
 endif
e7fd42
 
e7fd42
+enable_host_pie = @enable_host_pie@
e7fd42
+
e7fd42
 # Enable Intel CET on Intel CET enabled host if needed.
e7fd42
 CET_HOST_FLAGS = @CET_HOST_FLAGS@
e7fd42
 COMPILER += $(CET_HOST_FLAGS)
e7fd42
 
e7fd42
-NO_PIE_CFLAGS = @NO_PIE_CFLAGS@
e7fd42
-NO_PIE_FLAG = @NO_PIE_FLAG@
e7fd42
-
e7fd42
-# We don't want to compile the compilers with -fPIE, it make PCH fail.
e7fd42
-COMPILER += $(NO_PIE_CFLAGS)
e7fd42
+# Maybe compile the compilers with -fPIE or -fPIC.
e7fd42
+COMPILER += $(PICFLAG)
e7fd42
 
e7fd42
-# Link with -no-pie since we compile the compiler with -fno-PIE.
e7fd42
-LINKER += $(NO_PIE_FLAG)
e7fd42
+# Link with -pie, or -no-pie, depending on the above.
e7fd42
+LINKER += $(LD_PICFLAG)
e7fd42
 
e7fd42
 # Like LINKER, but use a mutex for serializing front end links.
e7fd42
 ifeq (@DO_LINK_MUTEX@,true)
e7fd42
@@ -1057,18 +1059,21 @@ ALL_CPPFLAGS = $(INCLUDES) $(CPPFLAGS)
e7fd42
 ALL_COMPILERFLAGS = $(ALL_CXXFLAGS)
e7fd42
 
e7fd42
 # This is the variable to use when using $(LINKER).
e7fd42
-ALL_LINKERFLAGS = $(ALL_CXXFLAGS)
e7fd42
+ALL_LINKERFLAGS = $(ALL_CXXFLAGS) $(LD_PICFLAG)
e7fd42
 
e7fd42
 # Build and host support libraries.
e7fd42
 
e7fd42
-# Use the "pic" build of libiberty if --enable-host-shared, unless we are
e7fd42
-# building for mingw.
e7fd42
+# Use the "pic" build of libiberty if --enable-host-shared or --enable-host-pie,
e7fd42
+# unless we are building for mingw.
e7fd42
 LIBIBERTY_PICDIR=$(if $(findstring mingw,$(target)),,pic)
e7fd42
-ifeq ($(enable_host_shared),yes)
e7fd42
+ifneq ($(enable_host_shared)$(enable_host_pie),)
e7fd42
 LIBIBERTY = ../libiberty/$(LIBIBERTY_PICDIR)/libiberty.a
e7fd42
-BUILD_LIBIBERTY = $(build_libobjdir)/libiberty/$(LIBIBERTY_PICDIR)/libiberty.a
e7fd42
 else
e7fd42
 LIBIBERTY = ../libiberty/libiberty.a
e7fd42
+endif
e7fd42
+ifeq ($(enable_host_shared),yes)
e7fd42
+BUILD_LIBIBERTY = $(build_libobjdir)/libiberty/$(LIBIBERTY_PICDIR)/libiberty.a
e7fd42
+else
e7fd42
 BUILD_LIBIBERTY = $(build_libobjdir)/libiberty/libiberty.a
e7fd42
 endif
e7fd42
 
e7fd42
diff --git a/gcc/configure b/gcc/configure
e7fd42
index 258b17a226e..bd4fe1fd6ca 100755
e7fd42
--- a/gcc/configure
e7fd42
+++ b/gcc/configure
e7fd42
@@ -632,10 +632,10 @@ ac_includes_default="\
e7fd42
 ac_subst_vars='LTLIBOBJS
e7fd42
 LIBOBJS
e7fd42
 CET_HOST_FLAGS
e7fd42
-NO_PIE_FLAG
e7fd42
-NO_PIE_CFLAGS
e7fd42
-enable_default_pie
e7fd42
+LD_PICFLAG
e7fd42
 PICFLAG
e7fd42
+enable_default_pie
e7fd42
+enable_host_pie
e7fd42
 enable_host_shared
e7fd42
 enable_plugin
e7fd42
 pluginlibs
e7fd42
@@ -1025,6 +1025,7 @@ enable_link_serialization
e7fd42
 enable_version_specific_runtime_libs
e7fd42
 enable_plugin
e7fd42
 enable_host_shared
e7fd42
+enable_host_pie
e7fd42
 enable_libquadmath_support
e7fd42
 with_linker_hash_style
e7fd42
 with_diagnostics_color
e7fd42
@@ -1787,6 +1788,7 @@ Optional Features:
e7fd42
                           in a compiler-specific directory
e7fd42
   --enable-plugin         enable plugin support
e7fd42
   --enable-host-shared    build host code as shared libraries
e7fd42
+  --enable-host-pie       build host code as PIE
e7fd42
   --disable-libquadmath-support
e7fd42
                           disable libquadmath support for Fortran
e7fd42
   --enable-default-pie    enable Position Independent Executable as default
e7fd42
@@ -19659,7 +19661,7 @@ else
e7fd42
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
e7fd42
   lt_status=$lt_dlunknown
e7fd42
   cat > conftest.$ac_ext <<_LT_EOF
e7fd42
-#line 19395 "configure"
e7fd42
+#line 19409 "configure"
e7fd42
 #include "confdefs.h"
e7fd42
 
e7fd42
 #if HAVE_DLFCN_H
e7fd42
@@ -19765,7 +19767,7 @@ else
e7fd42
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
e7fd42
   lt_status=$lt_dlunknown
e7fd42
   cat > conftest.$ac_ext <<_LT_EOF
e7fd42
-#line 19501 "configure"
e7fd42
+#line 19515 "configure"
e7fd42
 #include "confdefs.h"
e7fd42
 
e7fd42
 #if HAVE_DLFCN_H
e7fd42
@@ -32221,13 +32223,17 @@ fi
e7fd42
 # Enable --enable-host-shared
e7fd42
 # Check whether --enable-host-shared was given.
e7fd42
 if test "${enable_host_shared+set}" = set; then :
e7fd42
-  enableval=$enable_host_shared; PICFLAG=-fPIC
e7fd42
-else
e7fd42
-  PICFLAG=
e7fd42
+  enableval=$enable_host_shared;
e7fd42
 fi
e7fd42
 
e7fd42
 
e7fd42
 
e7fd42
+# Enable --enable-host-pie
e7fd42
+# Check whether --enable-host-pie was given.
e7fd42
+if test "${enable_host_pie+set}" = set; then :
e7fd42
+  enableval=$enable_host_pie;
e7fd42
+fi
e7fd42
+
e7fd42
 
e7fd42
 
e7fd42
 # Check whether --enable-libquadmath-support was given.
e7fd42
@@ -32381,10 +32387,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
e7fd42
 fi
e7fd42
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_c_no_fpie" >&5
e7fd42
 $as_echo "$gcc_cv_c_no_fpie" >&6; }
e7fd42
-if test "$gcc_cv_c_no_fpie" = "yes"; then
e7fd42
-  NO_PIE_CFLAGS="-fno-PIE"
e7fd42
-fi
e7fd42
-
e7fd42
 
e7fd42
 # Check if -no-pie works.
e7fd42
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -no-pie option" >&5
e7fd42
@@ -32409,11 +32411,28 @@ rm -f core conftest.err conftest.$ac_objext \
e7fd42
 fi
e7fd42
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_no_pie" >&5
e7fd42
 $as_echo "$gcc_cv_no_pie" >&6; }
e7fd42
-if test "$gcc_cv_no_pie" = "yes"; then
e7fd42
-  NO_PIE_FLAG="-no-pie"
e7fd42
+
e7fd42
+if test x$enable_host_shared = xyes; then
e7fd42
+  PICFLAG=-fPIC
e7fd42
+elif test x$enable_host_pie = xyes; then
e7fd42
+  PICFLAG=-fPIE
e7fd42
+elif test x$gcc_cv_c_no_fpie = xyes; then
e7fd42
+  PICFLAG=-fno-PIE
e7fd42
+else
e7fd42
+  PICFLAG=
e7fd42
+fi
e7fd42
+
e7fd42
+if test x$enable_host_pie = xyes; then
e7fd42
+  LD_PICFLAG=-pie
e7fd42
+elif test x$gcc_cv_no_pie = xyes; then
e7fd42
+  LD_PICFLAG=-no-pie
e7fd42
+else
e7fd42
+  LD_PICFLAG=
e7fd42
 fi
e7fd42
 
e7fd42
 
e7fd42
+
e7fd42
+
e7fd42
 # Enable Intel CET on Intel CET enabled host if jit is enabled.
e7fd42
  # Check whether --enable-cet was given.
e7fd42
 if test "${enable_cet+set}" = set; then :
e7fd42
diff --git a/gcc/configure.ac b/gcc/configure.ac
e7fd42
index 06750cee977..dca995aeec7 100644
e7fd42
--- a/gcc/configure.ac
e7fd42
+++ b/gcc/configure.ac
e7fd42
@@ -7488,11 +7488,14 @@ fi
e7fd42
 # Enable --enable-host-shared
e7fd42
 AC_ARG_ENABLE(host-shared,
e7fd42
 [AS_HELP_STRING([--enable-host-shared],
e7fd42
-		[build host code as shared libraries])],
e7fd42
-[PICFLAG=-fPIC], [PICFLAG=])
e7fd42
+		[build host code as shared libraries])])
e7fd42
 AC_SUBST(enable_host_shared)
e7fd42
-AC_SUBST(PICFLAG)
e7fd42
 
e7fd42
+# Enable --enable-host-pie
e7fd42
+AC_ARG_ENABLE(host-pie,
e7fd42
+[AS_HELP_STRING([--enable-host-pie],
e7fd42
+		[build host code as PIE])])
e7fd42
+AC_SUBST(enable_host_pie)
e7fd42
 
e7fd42
 AC_ARG_ENABLE(libquadmath-support,
e7fd42
 [AS_HELP_STRING([--disable-libquadmath-support],
e7fd42
@@ -7614,10 +7617,6 @@ AC_CACHE_CHECK([for -fno-PIE option],
e7fd42
      [gcc_cv_c_no_fpie=yes],
e7fd42
      [gcc_cv_c_no_fpie=no])
e7fd42
    CXXFLAGS="$saved_CXXFLAGS"])
e7fd42
-if test "$gcc_cv_c_no_fpie" = "yes"; then
e7fd42
-  NO_PIE_CFLAGS="-fno-PIE"
e7fd42
-fi
e7fd42
-AC_SUBST([NO_PIE_CFLAGS])
e7fd42
 
e7fd42
 # Check if -no-pie works.
e7fd42
 AC_CACHE_CHECK([for -no-pie option],
e7fd42
@@ -7628,10 +7627,27 @@ AC_CACHE_CHECK([for -no-pie option],
e7fd42
      [gcc_cv_no_pie=yes],
e7fd42
      [gcc_cv_no_pie=no])
e7fd42
    LDFLAGS="$saved_LDFLAGS"])
e7fd42
-if test "$gcc_cv_no_pie" = "yes"; then
e7fd42
-  NO_PIE_FLAG="-no-pie"
e7fd42
+
e7fd42
+if test x$enable_host_shared = xyes; then
e7fd42
+  PICFLAG=-fPIC
e7fd42
+elif test x$enable_host_pie = xyes; then
e7fd42
+  PICFLAG=-fPIE
e7fd42
+elif test x$gcc_cv_c_no_fpie = xyes; then
e7fd42
+  PICFLAG=-fno-PIE
e7fd42
+else
e7fd42
+  PICFLAG=
e7fd42
 fi
e7fd42
-AC_SUBST([NO_PIE_FLAG])
e7fd42
+
e7fd42
+if test x$enable_host_pie = xyes; then
e7fd42
+  LD_PICFLAG=-pie
e7fd42
+elif test x$gcc_cv_no_pie = xyes; then
e7fd42
+  LD_PICFLAG=-no-pie
e7fd42
+else
e7fd42
+  LD_PICFLAG=
e7fd42
+fi
e7fd42
+
e7fd42
+AC_SUBST([PICFLAG])
e7fd42
+AC_SUBST([LD_PICFLAG])
e7fd42
 
e7fd42
 # Enable Intel CET on Intel CET enabled host if jit is enabled.
e7fd42
 GCC_CET_HOST_FLAGS(CET_HOST_FLAGS)
e7fd42
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
e7fd42
index 93eae1f2582..be6985646b2 100644
e7fd42
--- a/gcc/doc/install.texi
e7fd42
+++ b/gcc/doc/install.texi
e7fd42
@@ -1021,14 +1021,26 @@ code.
e7fd42
 
e7fd42
 @item --enable-host-shared
e7fd42
 Specify that the @emph{host} code should be built into position-independent
e7fd42
-machine code (with -fPIC), allowing it to be used within shared libraries,
e7fd42
-but yielding a slightly slower compiler.
e7fd42
+machine code (with @option{-fPIC}), allowing it to be used within shared
e7fd42
+libraries, but yielding a slightly slower compiler.
e7fd42
 
e7fd42
 This option is required when building the libgccjit.so library.
e7fd42
 
e7fd42
 Contrast with @option{--enable-shared}, which affects @emph{target}
e7fd42
 libraries.
e7fd42
 
e7fd42
+@item --enable-host-pie
e7fd42
+Specify that the @emph{host} executables should be built into
e7fd42
+position-independent executables (with @option{-fPIE} and @option{-pie}),
e7fd42
+yielding a slightly slower compiler (but faster than
e7fd42
+@option{--enable-host-shared}).  Position-independent executables are loaded
e7fd42
+at random addresses each time they are executed, therefore provide additional
e7fd42
+protection against Return Oriented Programming (ROP) attacks.
e7fd42
+
e7fd42
+@option{--enable-host-pie}) may be used with @option{--enable-host-shared}),
e7fd42
+in which case @option{-fPIC} is used when compiling, and @option{-pie} when
e7fd42
+linking.
e7fd42
+
e7fd42
 @item @anchor{with-gnu-as}--with-gnu-as
e7fd42
 Specify that the compiler should assume that the
e7fd42
 assembler it finds is the GNU assembler.  However, this does not modify
e7fd42
diff --git a/libcody/Makefile.in b/libcody/Makefile.in
e7fd42
index 7eaf8ace8ce..0ff1625a39f 100644
e7fd42
--- a/libcody/Makefile.in
e7fd42
+++ b/libcody/Makefile.in
e7fd42
@@ -31,7 +31,7 @@ endif
e7fd42
 CXXOPTS += $(filter-out -DHAVE_CONFIG_H,@DEFS@) -include config.h
e7fd42
 
e7fd42
 # Linker options
e7fd42
-LDFLAGS := @LDFLAGS@
e7fd42
+LDFLAGS := @LDFLAGS@ @LD_PICFLAG@
e7fd42
 LIBS := @LIBS@
e7fd42
 
e7fd42
 # Per-source & per-directory compile flags (warning: recursive)
e7fd42
diff --git a/libcody/configure b/libcody/configure
e7fd42
index da52a5cfca5..0e536c0ccb0 100755
e7fd42
--- a/libcody/configure
e7fd42
+++ b/libcody/configure
e7fd42
@@ -591,7 +591,10 @@ configure_args
e7fd42
 AR
e7fd42
 RANLIB
e7fd42
 EXCEPTIONS
e7fd42
+LD_PICFLAG
e7fd42
 PICFLAG
e7fd42
+enable_host_pie
e7fd42
+enable_host_shared
e7fd42
 OBJEXT
e7fd42
 EXEEXT
e7fd42
 ac_ct_CXX
e7fd42
@@ -653,6 +656,7 @@ enable_maintainer_mode
e7fd42
 with_compiler
e7fd42
 enable_checking
e7fd42
 enable_host_shared
e7fd42
+enable_host_pie
e7fd42
 enable_exceptions
e7fd42
 '
e7fd42
       ac_precious_vars='build_alias
e7fd42
@@ -1286,6 +1290,7 @@ Optional Features:
e7fd42
                           yes,no,all,none,release. Flags are: misc,valgrind or
e7fd42
                           other strings
e7fd42
   --enable-host-shared    build host code as shared libraries
e7fd42
+  --enable-host-pie       build host code as PIE
e7fd42
   --enable-exceptions     enable exceptions & rtti
e7fd42
 
e7fd42
 Optional Packages:
e7fd42
@@ -2635,11 +2640,34 @@ fi
e7fd42
 # Enable --enable-host-shared.
e7fd42
 # Check whether --enable-host-shared was given.
e7fd42
 if test "${enable_host_shared+set}" = set; then :
e7fd42
-  enableval=$enable_host_shared; PICFLAG=-fPIC
e7fd42
+  enableval=$enable_host_shared;
e7fd42
+fi
e7fd42
+
e7fd42
+
e7fd42
+
e7fd42
+# Enable --enable-host-pie.
e7fd42
+# Check whether --enable-host-pie was given.
e7fd42
+if test "${enable_host_pie+set}" = set; then :
e7fd42
+  enableval=$enable_host_pie;
e7fd42
+fi
e7fd42
+
e7fd42
+
e7fd42
+
e7fd42
+if test x$enable_host_shared = xyes; then
e7fd42
+  PICFLAG=-fPIC
e7fd42
+elif test x$enable_host_pie = xyes; then
e7fd42
+  PICFLAG=-fPIE
e7fd42
 else
e7fd42
   PICFLAG=
e7fd42
 fi
e7fd42
 
e7fd42
+if test x$enable_host_pie = xyes; then
e7fd42
+  LD_PICFLAG=-pie
e7fd42
+else
e7fd42
+  LD_PICFLAG=
e7fd42
+fi
e7fd42
+
e7fd42
+
e7fd42
 
e7fd42
 
e7fd42
 # Check whether --enable-exceptions was given.
e7fd42
diff --git a/libcody/configure.ac b/libcody/configure.ac
e7fd42
index 960191ecb72..14e8dd4a226 100644
e7fd42
--- a/libcody/configure.ac
e7fd42
+++ b/libcody/configure.ac
e7fd42
@@ -63,9 +63,31 @@ fi
e7fd42
 # Enable --enable-host-shared.
e7fd42
 AC_ARG_ENABLE(host-shared,
e7fd42
 [AS_HELP_STRING([--enable-host-shared],
e7fd42
-		[build host code as shared libraries])],
e7fd42
-[PICFLAG=-fPIC], [PICFLAG=])
e7fd42
+		[build host code as shared libraries])])
e7fd42
+AC_SUBST(enable_host_shared)
e7fd42
+
e7fd42
+# Enable --enable-host-pie.
e7fd42
+AC_ARG_ENABLE(host-pie,
e7fd42
+[AS_HELP_STRING([--enable-host-pie],
e7fd42
+		[build host code as PIE])])
e7fd42
+AC_SUBST(enable_host_pie)
e7fd42
+
e7fd42
+if test x$enable_host_shared = xyes; then
e7fd42
+  PICFLAG=-fPIC
e7fd42
+elif test x$enable_host_pie = xyes; then
e7fd42
+  PICFLAG=-fPIE
e7fd42
+else
e7fd42
+  PICFLAG=
e7fd42
+fi
e7fd42
+
e7fd42
+if test x$enable_host_pie = xyes; then
e7fd42
+  LD_PICFLAG=-pie
e7fd42
+else
e7fd42
+  LD_PICFLAG=
e7fd42
+fi
e7fd42
+
e7fd42
 AC_SUBST(PICFLAG)
e7fd42
+AC_SUBST(LD_PICFLAG)
e7fd42
 
e7fd42
 NMS_ENABLE_EXCEPTIONS
e7fd42
 
e7fd42
diff --git a/libcpp/configure b/libcpp/configure
e7fd42
index 75145390215..85168273cd1 100755
e7fd42
--- a/libcpp/configure
e7fd42
+++ b/libcpp/configure
e7fd42
@@ -625,6 +625,8 @@ ac_includes_default="\
e7fd42
 ac_subst_vars='LTLIBOBJS
e7fd42
 CET_HOST_FLAGS
e7fd42
 PICFLAG
e7fd42
+enable_host_pie
e7fd42
+enable_host_shared
e7fd42
 MAINT
e7fd42
 USED_CATALOGS
e7fd42
 PACKAGE
e7fd42
@@ -738,6 +740,7 @@ enable_maintainer_mode
e7fd42
 enable_checking
e7fd42
 enable_canonical_system_headers
e7fd42
 enable_host_shared
e7fd42
+enable_host_pie
e7fd42
 enable_cet
e7fd42
 enable_valgrind_annotations
e7fd42
 '
e7fd42
@@ -1379,6 +1382,7 @@ Optional Features:
e7fd42
   --enable-canonical-system-headers
e7fd42
                           enable or disable system headers canonicalization
e7fd42
   --enable-host-shared    build host code as shared libraries
e7fd42
+  --enable-host-pie       build host code as PIE
e7fd42
   --enable-cet            enable Intel CET in host libraries [default=auto]
e7fd42
   --enable-valgrind-annotations
e7fd42
                           enable valgrind runtime interaction
e7fd42
@@ -7605,7 +7609,23 @@ esac
e7fd42
 # Enable --enable-host-shared.
e7fd42
 # Check whether --enable-host-shared was given.
e7fd42
 if test "${enable_host_shared+set}" = set; then :
e7fd42
-  enableval=$enable_host_shared; PICFLAG=-fPIC
e7fd42
+  enableval=$enable_host_shared;
e7fd42
+fi
e7fd42
+
e7fd42
+
e7fd42
+
e7fd42
+# Enable --enable-host-pie.
e7fd42
+# Check whether --enable-host-pie was given.
e7fd42
+if test "${enable_host_pie+set}" = set; then :
e7fd42
+  enableval=$enable_host_pie;
e7fd42
+fi
e7fd42
+
e7fd42
+
e7fd42
+
e7fd42
+if test x$enable_host_shared = xyes; then
e7fd42
+  PICFLAG=-fPIC
e7fd42
+elif test x$enable_host_pie = xyes; then
e7fd42
+  PICFLAG=-fPIE
e7fd42
 else
e7fd42
   PICFLAG=
e7fd42
 fi
e7fd42
diff --git a/libcpp/configure.ac b/libcpp/configure.ac
e7fd42
index 9b6042518e5..d25bf5f414f 100644
e7fd42
--- a/libcpp/configure.ac
e7fd42
+++ b/libcpp/configure.ac
e7fd42
@@ -211,8 +211,23 @@ esac
e7fd42
 # Enable --enable-host-shared.
e7fd42
 AC_ARG_ENABLE(host-shared,
e7fd42
 [AS_HELP_STRING([--enable-host-shared],
e7fd42
-		[build host code as shared libraries])],
e7fd42
-[PICFLAG=-fPIC], [PICFLAG=])
e7fd42
+		[build host code as shared libraries])])
e7fd42
+AC_SUBST(enable_host_shared)
e7fd42
+
e7fd42
+# Enable --enable-host-pie.
e7fd42
+AC_ARG_ENABLE(host-pie,
e7fd42
+[AS_HELP_STRING([--enable-host-pie],
e7fd42
+		[build host code as PIE])])
e7fd42
+AC_SUBST(enable_host_pie)
e7fd42
+
e7fd42
+if test x$enable_host_shared = xyes; then
e7fd42
+  PICFLAG=-fPIC
e7fd42
+elif test x$enable_host_pie = xyes; then
e7fd42
+  PICFLAG=-fPIE
e7fd42
+else
e7fd42
+  PICFLAG=
e7fd42
+fi
e7fd42
+
e7fd42
 AC_SUBST(PICFLAG)
e7fd42
 
e7fd42
 # Enable Intel CET on Intel CET enabled host if jit is enabled.
e7fd42
diff --git a/libdecnumber/configure b/libdecnumber/configure
e7fd42
index da5302f9315..d805fdeab5a 100755
e7fd42
--- a/libdecnumber/configure
e7fd42
+++ b/libdecnumber/configure
e7fd42
@@ -626,6 +626,8 @@ ac_subst_vars='LTLIBOBJS
e7fd42
 LIBOBJS
e7fd42
 CET_HOST_FLAGS
e7fd42
 PICFLAG
e7fd42
+enable_host_pie
e7fd42
+enable_host_shared
e7fd42
 ADDITIONAL_OBJS
e7fd42
 enable_decimal_float
e7fd42
 target_os
e7fd42
@@ -706,6 +708,7 @@ enable_werror_always
e7fd42
 enable_maintainer_mode
e7fd42
 enable_decimal_float
e7fd42
 enable_host_shared
e7fd42
+enable_host_pie
e7fd42
 enable_cet
e7fd42
 '
e7fd42
       ac_precious_vars='build_alias
e7fd42
@@ -1338,6 +1341,7 @@ Optional Features:
e7fd42
 			or 'dpd' choses which decimal floating point format
e7fd42
 			to use
e7fd42
   --enable-host-shared    build host code as shared libraries
e7fd42
+  --enable-host-pie       build host code as PIE
e7fd42
   --enable-cet            enable Intel CET in host libraries [default=auto]
e7fd42
 
e7fd42
 Some influential environment variables:
e7fd42
@@ -5185,7 +5189,23 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
e7fd42
 # Enable --enable-host-shared.
e7fd42
 # Check whether --enable-host-shared was given.
e7fd42
 if test "${enable_host_shared+set}" = set; then :
e7fd42
-  enableval=$enable_host_shared; PICFLAG=-fPIC
e7fd42
+  enableval=$enable_host_shared;
e7fd42
+fi
e7fd42
+
e7fd42
+
e7fd42
+
e7fd42
+# Enable --enable-host-pie.
e7fd42
+# Check whether --enable-host-pie was given.
e7fd42
+if test "${enable_host_pie+set}" = set; then :
e7fd42
+  enableval=$enable_host_pie;
e7fd42
+fi
e7fd42
+
e7fd42
+
e7fd42
+
e7fd42
+if test x$enable_host_shared = xyes; then
e7fd42
+  PICFLAG=-fPIC
e7fd42
+elif test x$enable_host_pie = xyes; then
e7fd42
+  PICFLAG=-fPIE
e7fd42
 else
e7fd42
   PICFLAG=
e7fd42
 fi
e7fd42
diff --git a/libdecnumber/configure.ac b/libdecnumber/configure.ac
e7fd42
index 0794031ec83..14f67f926d1 100644
e7fd42
--- a/libdecnumber/configure.ac
e7fd42
+++ b/libdecnumber/configure.ac
e7fd42
@@ -100,8 +100,23 @@ AC_C_BIGENDIAN
e7fd42
 # Enable --enable-host-shared.
e7fd42
 AC_ARG_ENABLE(host-shared,
e7fd42
 [AS_HELP_STRING([--enable-host-shared],
e7fd42
-		[build host code as shared libraries])],
e7fd42
-[PICFLAG=-fPIC], [PICFLAG=])
e7fd42
+		[build host code as shared libraries])])
e7fd42
+AC_SUBST(enable_host_shared)
e7fd42
+
e7fd42
+# Enable --enable-host-pie.
e7fd42
+AC_ARG_ENABLE(host-pie,
e7fd42
+[AS_HELP_STRING([--enable-host-pie],
e7fd42
+		[build host code as PIE])])
e7fd42
+AC_SUBST(enable_host_pie)
e7fd42
+
e7fd42
+if test x$enable_host_shared = xyes; then
e7fd42
+  PICFLAG=-fPIC
e7fd42
+elif test x$enable_host_pie = xyes; then
e7fd42
+  PICFLAG=-fPIE
e7fd42
+else
e7fd42
+  PICFLAG=
e7fd42
+fi
e7fd42
+
e7fd42
 AC_SUBST(PICFLAG)
e7fd42
 
e7fd42
 # Enable Intel CET on Intel CET enabled host if jit is enabled.
e7fd42
diff --git a/zlib/configure b/zlib/configure
e7fd42
index f489f31bc70..0dfc1982844 100755
e7fd42
--- a/zlib/configure
e7fd42
+++ b/zlib/configure
e7fd42
@@ -635,6 +635,8 @@ am__EXEEXT_TRUE
e7fd42
 LTLIBOBJS
e7fd42
 LIBOBJS
e7fd42
 PICFLAG
e7fd42
+enable_host_pie
e7fd42
+enable_host_shared
e7fd42
 TARGET_LIBRARY_FALSE
e7fd42
 TARGET_LIBRARY_TRUE
e7fd42
 toolexeclibdir
e7fd42
@@ -778,6 +780,7 @@ with_gnu_ld
e7fd42
 enable_libtool_lock
e7fd42
 with_toolexeclibdir
e7fd42
 enable_host_shared
e7fd42
+enable_host_pie
e7fd42
 '
e7fd42
       ac_precious_vars='build_alias
e7fd42
 host_alias
e7fd42
@@ -1420,6 +1423,7 @@ Optional Features:
e7fd42
                           optimize for fast installation [default=yes]
e7fd42
   --disable-libtool-lock  avoid locking (might break parallel builds)
e7fd42
   --enable-host-shared    build host code as shared libraries
e7fd42
+  --enable-host-pie       build host code as PIE
e7fd42
 
e7fd42
 Optional Packages:
e7fd42
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
e7fd42
@@ -4169,7 +4173,7 @@ case "$host" in
e7fd42
     case "$enable_cet" in
e7fd42
       auto)
e7fd42
 	# Check if target supports multi-byte NOPs
e7fd42
-	# and if assembler supports CET insn.
e7fd42
+	# and if compiler and assembler support CET insn.
e7fd42
 	cet_save_CFLAGS="$CFLAGS"
e7fd42
 	CFLAGS="$CFLAGS -fcf-protection"
e7fd42
 	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
e7fd42
@@ -10735,7 +10739,7 @@ else
e7fd42
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
e7fd42
   lt_status=$lt_dlunknown
e7fd42
   cat > conftest.$ac_ext <<_LT_EOF
e7fd42
-#line 10748 "configure"
e7fd42
+#line 10754 "configure"
e7fd42
 #include "confdefs.h"
e7fd42
 
e7fd42
 #if HAVE_DLFCN_H
e7fd42
@@ -10841,7 +10845,7 @@ else
e7fd42
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
e7fd42
   lt_status=$lt_dlunknown
e7fd42
   cat > conftest.$ac_ext <<_LT_EOF
e7fd42
-#line 10854 "configure"
e7fd42
+#line 10860 "configure"
e7fd42
 #include "confdefs.h"
e7fd42
 
e7fd42
 #if HAVE_DLFCN_H
e7fd42
@@ -11524,15 +11528,31 @@ else
e7fd42
   multilib_arg=
e7fd42
 fi
e7fd42
 
e7fd42
+# Enable --enable-host-shared.
e7fd42
 # Check whether --enable-host-shared was given.
e7fd42
 if test "${enable_host_shared+set}" = set; then :
e7fd42
-  enableval=$enable_host_shared; PICFLAG=-fPIC
e7fd42
+  enableval=$enable_host_shared;
e7fd42
+fi
e7fd42
+
e7fd42
+
e7fd42
+
e7fd42
+# Enable --enable-host-pie.
e7fd42
+# Check whether --enable-host-pie was given.
e7fd42
+if test "${enable_host_pie+set}" = set; then :
e7fd42
+  enableval=$enable_host_pie;
e7fd42
+fi
e7fd42
+
e7fd42
+
e7fd42
+
e7fd42
+if test x$enable_host_shared = xyes; then
e7fd42
+  PICFLAG=-fPIC
e7fd42
+elif test x$enable_host_pie = xyes; then
e7fd42
+  PICFLAG=-fPIE
e7fd42
 else
e7fd42
   PICFLAG=
e7fd42
 fi
e7fd42
 
e7fd42
 
e7fd42
-
e7fd42
 ac_config_files="$ac_config_files Makefile"
e7fd42
 
e7fd42
 cat >confcache <<\_ACEOF
e7fd42
diff --git a/zlib/configure.ac b/zlib/configure.ac
e7fd42
index be1cfe29651..adf7aad4e51 100644
e7fd42
--- a/zlib/configure.ac
e7fd42
+++ b/zlib/configure.ac
e7fd42
@@ -122,11 +122,26 @@ else
e7fd42
   multilib_arg=
e7fd42
 fi
e7fd42
 
e7fd42
+# Enable --enable-host-shared.
e7fd42
 AC_ARG_ENABLE(host-shared,
e7fd42
 [AS_HELP_STRING([--enable-host-shared],
e7fd42
-		[build host code as shared libraries])],
e7fd42
-[PICFLAG=-fPIC], [PICFLAG=])
e7fd42
-AC_SUBST(PICFLAG)
e7fd42
+		[build host code as shared libraries])])
e7fd42
+AC_SUBST(enable_host_shared)
e7fd42
+
e7fd42
+# Enable --enable-host-pie.
e7fd42
+AC_ARG_ENABLE(host-pie,
e7fd42
+[AS_HELP_STRING([--enable-host-pie],
e7fd42
+		[build host code as PIE])])
e7fd42
+AC_SUBST(enable_host_pie)
e7fd42
+
e7fd42
+if test x$enable_host_shared = xyes; then
e7fd42
+  PICFLAG=-fPIC
e7fd42
+elif test x$enable_host_pie = xyes; then
e7fd42
+  PICFLAG=-fPIE
e7fd42
+else
e7fd42
+  PICFLAG=
e7fd42
+fi
e7fd42
 
e7fd42
+AC_SUBST(PICFLAG)
e7fd42
 AC_CONFIG_FILES([Makefile])
e7fd42
 AC_OUTPUT
e7fd42
e7fd42
base-commit: ee50b4383a0dca88172c3a821418344bd7391956
e7fd42
-- 
e7fd42
2.34.1
e7fd42