On Tue, Sep 7, 2021 at 10:11 PM Iain Sandoe <i...@sandoe.co.uk> wrote:
>
> Hi Folks,
>
> So, looking through the various email threads and the PR, I think that
> what has happened is :
>
> As the PR points out, our existing PCH model does not work if the compiler
> executable is PIE - which manifests on platforms like Darwin (which is PIE
> by default) or Linux when configured —enable-default-pie.
>
> H.J’s original patch forces no-PIE onto the compiler executables, and
> because of shared code on $host also to the driver etc.
>
> However, the patch also forces no-PIE onto executables that run on
> $build (e.g. the generators etc) which is not needed (and breaks bootstrap
> for at least one case, albeit one not often tested).
>
> Marcus, observed that there was no separation in the treatment of $build
> and $host, and a follow-on patch was applied that made the no-PIE change
> to $build distinct.
>
> However, IMHO, the correct change there would really be to remove the
> code applying no-PIE to $build (where it is not required).
>
> The patch below makes this change and thus fixes the bootstrap regression.
>
> Testing - all supported languages :
>
> x86_64, powerpc64le, powerpc64, aarch64 - linux
> x64_64, powerpc, i686 - darwin
> aix (nop, since ASLR is not used)
> solaris, thanks to Rainer (since the machine on the cfarm doesn’t support
> PIE).
>
> All Linux platforms configured —enable-default-pie (without which one
> cannot observe this anyway).
>
> crosses and “canadians” (actually all those here are $target=$host).
>
> $build = x86_64-linux, $host=$target = aarch64-linux
> $build = powerpcle-linux $host=$target = x86_64-linux
> $build= x86_64-darwin, $target = powerpc-darwin
> $build = x86_64-darwin $host=$target=aarch64-darwin20
>
> The seems to be a problem in building the native-crossed libgo, but that
> is not a result of this patch.  Other than this - nothing untoward is observed
> and I’ve manually checked that the $build exes are PIE and the $host ones
> are not...
>
> OK for master, and eventually backports?

OK for trunk, I think it warrants quite some soaking time before considering
backports.

Thanks,
Richard.

> Iain
>
>
> [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71934
> [2] https://gcc.gnu.org/pipermail/gcc-patches/2015-October/432180.html
> [3] https://gcc.gnu.org/pipermail/gcc-patches/2021-August/578169.html
>
> —— commit log
>
> The executables for GCC's c-family compilers must be built with no-PIE
> because they use PCH and the current model for this requires that the
> exe is always lauched at the same address.  Since the other language
> compilers share code with the c-family this constraint is also applied
> to them.
>
> However, the executables that run on $build (generators, and parsers
> for md and def files) need not have any such constraint; they do not
> consume PCH files.
>
> This change simplifies the configuration and Makefile content by
> removing the code enforcing no-PIE on these exes.  This also fixes a
> bootstrap issue with some Darwin versions and clang as the bootstrap
> compiler,  where -no-PIE causes the correct relocation model to be
> switched off leading to invalid user-space code.
>
> Signed-off-by: Iain Sandoe <i...@sandoe.co.uk>
>
> gcc/ChangeLog:
>
>         * Makefile.in: Remove variables related to applying no-PIE
>         to the exes on $build.
>         * configure: Regenerate.
>         * configure.ac: Remove configuration related to applying
>         no-PIE to the exes on $build.
> ---
>  gcc/Makefile.in  |  7 -------
>  gcc/configure    | 18 ++----------------
>  gcc/configure.ac | 10 ----------
>  3 files changed, 2 insertions(+), 33 deletions(-)
>
> diff --git a/gcc/Makefile.in b/gcc/Makefile.in
> index f0c560fe45b..d0c5ca214c9 100644
> --- a/gcc/Makefile.in
> +++ b/gcc/Makefile.in
> @@ -799,13 +799,8 @@ DIR = ../gcc
>  # Native compiler for the build machine and its switches.
>  CC_FOR_BUILD = @CC_FOR_BUILD@
>  CXX_FOR_BUILD = @CXX_FOR_BUILD@
> -NO_PIE_CFLAGS_FOR_BUILD = @NO_PIE_CFLAGS_FOR_BUILD@
> -NO_PIE_FLAG_FOR_BUILD = @NO_PIE_FLAG_FOR_BUILD@
>  BUILD_CFLAGS= @BUILD_CFLAGS@ $(GENERATOR_CFLAGS) -DGENERATOR_FILE
>  BUILD_CXXFLAGS = @BUILD_CXXFLAGS@ $(GENERATOR_CFLAGS) -DGENERATOR_FILE
> -BUILD_NO_PIE_CFLAGS = @BUILD_NO_PIE_CFLAGS@
> -BUILD_CFLAGS += $(BUILD_NO_PIE_CFLAGS)
> -BUILD_CXXFLAGS += $(BUILD_NO_PIE_CFLAGS)
>
>  # Native compiler that we use.  This may be C++ some day.
>  COMPILER_FOR_BUILD = $(CXX_FOR_BUILD)
> @@ -817,8 +812,6 @@ BUILD_LINKERFLAGS = $(BUILD_CXXFLAGS)
>
>  # Native linker and preprocessor flags.  For x-fragment overrides.
>  BUILD_LDFLAGS=@BUILD_LDFLAGS@
> -BUILD_NO_PIE_FLAG = @BUILD_NO_PIE_FLAG@
> -BUILD_LDFLAGS += $(BUILD_NO_PIE_FLAG)
>  BUILD_CPPFLAGS= -I. -I$(@D) -I$(srcdir) -I$(srcdir)/$(@D) \
>                 -I$(srcdir)/../include @INCINTL@ $(CPPINC) $(CPPFLAGS)
>
> diff --git a/gcc/configure b/gcc/configure
> index 500e3f68215..87d7b9c435b 100755
> --- a/gcc/configure
> +++ b/gcc/configure
> @@ -753,10 +753,6 @@ FGREP
>  SED
>  LIBTOOL
>  collect2
> -NO_PIE_FLAG_FOR_BUILD
> -NO_PIE_CFLAGS_FOR_BUILD
> -BUILD_NO_PIE_FLAG
> -BUILD_NO_PIE_CFLAGS
>  STMP_FIXINC
>  BUILD_LDFLAGS
>  BUILD_CXXFLAGS
> @@ -13336,24 +13332,14 @@ BUILD_CXXFLAGS='$(ALL_CXXFLAGS)'
>  BUILD_LDFLAGS='$(LDFLAGS)'
>  STMP_FIXINC=stmp-fixinc
>
> -BUILD_NO_PIE_CFLAGS='$(NO_PIE_CFLAGS)'
> -BUILD_NO_PIE_FLAG='$(NO_PIE_FLAG)'
> -
>  # And these apply if build != host, or we are generating coverage data
>  if test x$build != x$host || test "x$coverage_flags" != x
>  then
>      BUILD_CFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS-$@) 
> $(CFLAGS_FOR_BUILD)'
>      BUILD_CXXFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS-$@) 
> $(CXXFLAGS_FOR_BUILD)'
>      BUILD_LDFLAGS='$(LDFLAGS_FOR_BUILD)'
> -
> -    NO_PIE_CFLAGS_FOR_BUILD=${NO_PIE_CFLAGS_FOR_BUILD-${NO_PIE_CFLAGS}}
> -    NO_PIE_FLAG_FOR_BUILD=${NO_PIE_FLAG_FOR_BUILD-${NO_PIE_FLAG}}
> -    BUILD_NO_PIE_CFLAGS='$(NO_PIE_CFLAGS_FOR_BUILD)'
> -    BUILD_NO_PIE_FLAG='$(NO_PIE_FLAG_FOR_BUILD)'
>  fi
>
> -
> -
>  # Expand extra_headers to include complete path.
>  # This substitutes for lots of t-* files.
>  extra_headers_list=
> @@ -19480,7 +19466,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 19483 "configure"
> +#line 19469 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> @@ -19586,7 +19572,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 19589 "configure"
> +#line 19575 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> diff --git a/gcc/configure.ac b/gcc/configure.ac
> index 6f768e02aa4..3ba78aa9dee 100644
> --- a/gcc/configure.ac
> +++ b/gcc/configure.ac
> @@ -2473,23 +2473,13 @@ BUILD_CXXFLAGS='$(ALL_CXXFLAGS)' 
> AC_SUBST(BUILD_CXXFLAGS)
>  BUILD_LDFLAGS='$(LDFLAGS)'     AC_SUBST(BUILD_LDFLAGS)
>  STMP_FIXINC=stmp-fixinc                AC_SUBST(STMP_FIXINC)
>
> -BUILD_NO_PIE_CFLAGS='$(NO_PIE_CFLAGS)' AC_SUBST(BUILD_NO_PIE_CFLAGS)
> -BUILD_NO_PIE_FLAG='$(NO_PIE_FLAG)' AC_SUBST(BUILD_NO_PIE_FLAG)
> -
>  # And these apply if build != host, or we are generating coverage data
>  if test x$build != x$host || test "x$coverage_flags" != x
>  then
>      BUILD_CFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS-$@) 
> $(CFLAGS_FOR_BUILD)'
>      BUILD_CXXFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS-$@) 
> $(CXXFLAGS_FOR_BUILD)'
>      BUILD_LDFLAGS='$(LDFLAGS_FOR_BUILD)'
> -
> -    NO_PIE_CFLAGS_FOR_BUILD=${NO_PIE_CFLAGS_FOR_BUILD-${NO_PIE_CFLAGS}}
> -    NO_PIE_FLAG_FOR_BUILD=${NO_PIE_FLAG_FOR_BUILD-${NO_PIE_FLAG}}
> -    BUILD_NO_PIE_CFLAGS='$(NO_PIE_CFLAGS_FOR_BUILD)'
> -    BUILD_NO_PIE_FLAG='$(NO_PIE_FLAG_FOR_BUILD)'
>  fi
> -AC_SUBST(NO_PIE_CFLAGS_FOR_BUILD)
> -AC_SUBST(NO_PIE_FLAG_FOR_BUILD)
>
>  # Expand extra_headers to include complete path.
>  # This substitutes for lots of t-* files.
> --
>

Reply via email to