On 23/10/15 13:34, H.J. Lu wrote: > On Fri, Oct 23, 2015 at 4:54 AM, Marcus Shawcroft > <marcus.shawcr...@gmail.com> wrote: >> Hi, >> >> This patch breaks the distinction between build and host. For example >> consider a configure along these lines: >> >> ./configure --host=aarch64-none-linux-gnu >> --target=aarch64-none-linux-gnu --build=x86_64-pc-linux-gnu >> >> Will result in: >> >> CXX_FOR_BUILD='g++' >> CXX='aarch64-none-linux-gnu-g++' >> >> the gcc/configure fragment: >> >> +# Check if -no-pie works. >> +AC_CACHE_CHECK([for -no-pie option], >> + [gcc_cv_no_pie], >> + [saved_LDFLAGS="$LDFLAGS" >> + LDFLAGS="$LDFLAGS -no-pie" >> + AC_LINK_IFELSE([int main(void) {return 0;}], >> + [gcc_cv_no_pie=yes], >> + [gcc_cv_no_pie=no]) >> + LDFLAGS="$saved_LDFLAGS"]) >> +if test "$gcc_cv_no_pie" = "yes"; then >> + NO_PIE_FLAG="-no-pie" >> +fi >> +AC_SUBST([NO_PIE_FLAG]) >> >> will check if CXX supports -no-pic and set NO_PIE_FLAG accordingly. >> The gcc/Makefile.in fragment: >> >> @@ -761,6 +769,7 @@ BUILD_LINKERFLAGS = $(BUILD_CXXFLAGS) >> >> # Native linker and preprocessor flags. For x-fragment overrides. >> BUILD_LDFLAGS=@BUILD_LDFLAGS@ >> +BUILD_LDFLAGS += @NO_PIE_FLAG@ >> >> constructs the flags which will ultimately be used to compile the >> build machines gen* programs. That compilation uses CXX_FOR_BUILD >> with the NO_PIE_FLAG that was originally probed for CXX. This is >> incorrect if CXX_FOR_BUILD != CXX >> >> HJ, could you take a look into this issue? >> > > Try this. >
Where's the ChangeLog? R. > > pie.patch > > > diff --git a/gcc/Makefile.in b/gcc/Makefile.in > index b91b8dc..d9d2de9 100644 > --- a/gcc/Makefile.in > +++ b/gcc/Makefile.in > @@ -258,11 +258,14 @@ LINKER = $(CC) > LINKER_FLAGS = $(CFLAGS) > endif > > +NO_PIE_CFLAG = @NO_PIE_CFLAGS@ > +NO_PIE_FLAG = @NO_PIE_FLAG@ > + > # We don't want to compile the compilers with -fPIE, it make PCH fail. > -COMPILER += @NO_PIE_CFLAGS@ > +COMPILER += $(NO_PIE_CFLAG) > > # Link with -no-pie since we compile the compiler with -fno-PIE. > -LINKER += @NO_PIE_FLAG@ > +LINKER += $(NO_PIE_FLAG) > > # Like LINKER, but use a mutex for serializing front end links. > ifeq (@DO_LINK_MUTEX@,true) > @@ -755,10 +758,13 @@ 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@ -DGENERATOR_FILE > BUILD_CXXFLAGS = @BUILD_CXXFLAGS@ -DGENERATOR_FILE > -BUILD_CFLAGS += @NO_PIE_CFLAGS@ > -BUILD_CXXFLAGS += @NO_PIE_CFLAGS@ > +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) > @@ -770,7 +776,8 @@ BUILD_LINKERFLAGS = $(BUILD_CXXFLAGS) > > # Native linker and preprocessor flags. For x-fragment overrides. > BUILD_LDFLAGS=@BUILD_LDFLAGS@ > -BUILD_LDFLAGS += @NO_PIE_FLAG@ > +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 3122499..92bda6c 100755 > --- a/gcc/configure > +++ b/gcc/configure > @@ -707,6 +707,10 @@ 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 > @@ -7096,7 +7100,8 @@ if test x$ac_checking != x ; then > > $as_echo "#define ENABLE_CHECKING 1" >>confdefs.h > > - $as_echo "#define CHECKING_P 1" >>confdefs.h > + > +$as_echo "#define CHECKING_P 1" >>confdefs.h > > nocommon_flag=-fno-common > else > @@ -12253,14 +12258,24 @@ 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_FOR_BUILD)' > BUILD_CXXFLAGS='$(INTERNAL_CFLAGS) $(T_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= > @@ -18390,7 +18405,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 18393 "configure" > +#line 18408 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > @@ -18496,7 +18511,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 18499 "configure" > +#line 18514 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > diff --git a/gcc/configure.ac b/gcc/configure.ac > index a30bb3b..7e22267 100644 > --- a/gcc/configure.ac > +++ b/gcc/configure.ac > @@ -2041,13 +2041,23 @@ 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_FOR_BUILD)' > BUILD_CXXFLAGS='$(INTERNAL_CFLAGS) $(T_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. >