Message ID | CAMe9rOqw7eOFdQVn2-rk=_jWC8AveSTNKV7Oxeqq3T2vSE187w@mail.gmail.com |
---|---|
State | New |
Headers | show |
On 23 October 2015 at 13:34, H.J. Lu <hjl.tools@gmail.com> wrote: > On Fri, Oct 23, 2015 at 4:54 AM, Marcus Shawcroft > <marcus.shawcroft@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 >> HJ, could you take a look into this issue? >> > > Try this. Thanks HJ. This solves the issue I was seeing. Cheers /Marcus
On 23 October 2015 at 13:34, H.J. Lu <hjl.tools@gmail.com> wrote: > On Fri, Oct 23, 2015 at 4:54 AM, Marcus Shawcroft > <marcus.shawcroft@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 >> HJ, could you take a look into this issue? >> > > Try this. Hi, Can we get a review from one of the build machinery maintainers for this patch? Cheers /Marcus
On 23/10/15 13:34, H.J. Lu wrote: > On Fri, Oct 23, 2015 at 4:54 AM, Marcus Shawcroft > <marcus.shawcroft@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. >
On Thu, Oct 29, 2015 at 4:00 AM, Richard Earnshaw <Richard.Earnshaw@foss.arm.com> wrote: > On 23/10/15 13:34, H.J. Lu wrote: >> On Fri, Oct 23, 2015 at 4:54 AM, Marcus Shawcroft >> <marcus.shawcroft@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? > You can follow up here: https://gcc.gnu.org/ml/gcc-patches/2015-10/msg02468.html
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.