On Wed, Aug 25, 2021 at 10:51 AM H.J. Lu <hjl.to...@gmail.com> wrote: > > On Wed, Aug 25, 2021 at 10:42 AM Iain Sandoe <idsan...@googlemail.com> wrote: > > > > Hi, > > > > > On 20 Aug 2021, at 11:29, Richard Sandiford <richard.sandif...@arm.com> > > > wrote: > > > > > >>> Maybe it would be easier to have the makefile fragments determine > > >>> something like CODE_MODEL_CFLAGS, which can be "-fPIC", > > >>> "-mdynamic-no-pic", > > >>> etc., and use: > > >>> > > >>> COMPILER += $(NO_PIE_CFLAGS) $(CODE_MODEL_CFLAGS) > > >> > > >> OK. I have misgivings about this - the problem is that: > > >> > > >> -fPIC -fno-PIE != -fno-PIE -fPIC, which is not obvious to many folks - > > >> who expect that > > >> the “last edition of a flag will be the one in force”. > > >> > > >> So the PIE-ness and the PIC-ness are decoupled in the configury but they > > >> need to be > > >> ordered specifically for targets that want PIC code by default (FWIW, I > > >> don’t think Darwin > > >> is the only default-PIC case here, from discussions on irc). > > > > > > Yeah, that's what the above was supposed to achieve. In other words, > > > if you force non-PIE, you also need to follow that by > > > $(CODE_MODEL_CFLAGS), > > > which restates whatever the base code model is. > > > > > > If it's the decoupling you're worried about, then an alternative would > > > be to have: > > > > > > NO_PIE_CFLAGS="-fno-PIE \$(CODE_MODEL_CFLAGS)” > > > > I’d like to ask a couple of questions (of HJ who introduced the no-PIE > > logic) before implementing this. > > > > A. We use no-PIE for cc1* because that is needed to handle the PCH > > implementation (which relies on the executables being loaded at the same > > addresses each time). > > > > B. It’s certainly not obvious to me why we need to build code to run on > > $build to be no-PIE - I don’t see any such dependencies in the generators > > etc. > > > > - So Question1 - HJ what was the motivation for making the XXX_BUILD_XXX > > adopt no-PIE? > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71934 > > > —— > > > > Independently of this we seem to be building the objects for $host thus: > > > > $(CXX) (NO_PIE_CFLAGS) -c $(ALL_CXXFLAGS) etc. > > > > but we build for $build thus: > > > > $(CXX) -c $(ALL_CXXFLAGS) $(GENERATOR_CFLAGS) -DGENERATOR_FILE > > $(BUILD_NO_PIE_CFLAGS) $(BUILD_CPPFLAGS) > > > > which means that code model flags in $ALL_CXXFLAGS are overridden for > > $build, but active for $host > > ^^ this is actually what causes the Darwin build fail - since on Darwin we > > cannot build static linked code for user-space processes. > > > > in any event that’s inconsistent (unless there’s a reason that it should be > > different). > > > > ---- > > > > below are extracts from gcc/Makefile *on linux* which demonstrates the > > different ordering. > > > > AFAICT, > > NO_PIE_CFLAGS_FOR_BUILD, NO_PIE_FLAG_FOR_BUILD are dead variables? > > > > Question 2 : HJ, what was your intention for how a configuration would > > request PIC code (for example) for things to run on $build?
We need to fix https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71934 first. H.J. > > thanks > > Iain > > > > ------- > > > > > > ALL_CXXFLAGS = $(T_CFLAGS) $(CFLAGS-$@) $(CXXFLAGS) $(INTERNAL_CFLAGS) \ > > $(COVERAGE_FLAGS) $(ALIASING_FLAGS) $(NOEXCEPTION_FLAGS) \ > > > > -- > > # Native compiler for the build machine and its switches. > > CC_FOR_BUILD = $(CC) > > CXX_FOR_BUILD = $(CXX) > > NO_PIE_CFLAGS_FOR_BUILD = > > NO_PIE_FLAG_FOR_BUILD = > > BUILD_CFLAGS= $(ALL_CFLAGS) $(GENERATOR_CFLAGS) -DGENERATOR_FILE > > BUILD_CXXFLAGS = $(ALL_CXXFLAGS) $(GENERATOR_CFLAGS) -DGENERATOR_FILE > > BUILD_NO_PIE_CFLAGS = $(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) > > BUILD_COMPILERFLAGS = $(BUILD_CXXFLAGS) > > > > # Native linker that we use. > > LINKER_FOR_BUILD = $(CXX_FOR_BUILD) > > BUILD_LINKERFLAGS = $(BUILD_CXXFLAGS) > > > > # Native linker and preprocessor flags. For x-fragment overrides. > > BUILD_LDFLAGS=$(LDFLAGS) > > BUILD_NO_PIE_FLAG = $(NO_PIE_FLAG) > > BUILD_LDFLAGS += $(BUILD_NO_PIE_FLAG) > > BUILD_CPPFLAGS= -I. -I$(@D) -I$(srcdir) -I$(srcdir)/$(@D) \ > > -I$(srcdir)/../include $(CPPINC) $(CPPFLAGS) > > -- > > # This is the variable actually used when we compile. If you change this, > > # you probably want to update BUILD_CFLAGS in configure.ac > > ALL_CFLAGS = $(T_CFLAGS) $(CFLAGS-$@) \ > > > > build/%.o : # dependencies provided by explicit rule later > > $(COMPILER_FOR_BUILD) -c $(BUILD_COMPILERFLAGS) $(BUILD_CPPFLAGS) \ > > -o $@ $< > > > > ^^^^ this has > > $(CXX) -c $(ALL_CXXFLAGS) $(GENERATOR_CFLAGS) -DGENERATOR_FILE > > $(BUILD_NO_PIE_CFLAGS) $(BUILD_CPPFLAGS) > > NO_PIE_CFLAGS_FOR_BUILD is apparently ignored > > > > # Rule for the generator programs: > > $(genprog:%=build/gen%$(build_exeext)): build/gen%$(build_exeext): > > build/gen%.o $(BUILD_LIBDEPS) > > +$(LINKER_FOR_BUILD) $(BUILD_LINKERFLAGS) $(BUILD_LDFLAGS) -o $@ \ > > $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS) > > > > -- > > build/genversion$(build_exeext): build/genversion.o > > +$(LINKER_FOR_BUILD) $(BUILD_LINKERFLAGS) $(BUILD_LDFLAGS) \ > > build/genversion.o -o $@ > > ========= > > > > # The name of the compiler to use. > > COMPILER = $(CXX) > > COMPILER_FLAGS = $(CXXFLAGS) > > # If HOST_LIBS is set, then the user is controlling the libraries to > > -- > > CET_HOST_FLAGS = -fcf-protection > > COMPILER += $(CET_HOST_FLAGS) > > > > -- > > # We don't want to compile the compilers with -fPIE, it make PCH fail. > > COMPILER += $(NO_PIE_CFLAGS) > > > > -- > > # A list of all the language-specific executables. > > COMPILERS = gnat1$(exeext) cc1$(exeext) cc1plus$(exeext) d21$(exeext) > > f951$(exeext) go1$(exeext) lto1$(exeext) cc1obj$(exeext) > > cc1objplus$(exeext) > > > > -- > > # Native compiler that we use. This may be C++ some day. > > COMPILER_FOR_BUILD = $(CXX_FOR_BUILD) > > BUILD_COMPILERFLAGS = $(BUILD_CXXFLAGS) > > > > -- > > > > # This is the variable to use when using $(COMPILER). > > ALL_COMPILERFLAGS = $(ALL_CXXFLAGS) > > > > -- > > > > COMPILE.base = $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) -o $@ > > > > This is : > > $(CXX) (NO_PIE_CFLAGS) -c $(ALL_CXXFLAGS) etc. > > > > COMPILE = $(COMPILE.base) -MT $@ -MMD -MP -MF $(@D)/$(DEPDIR)/$(*F).TPo > > POSTCOMPILE = @mv $(@D)/$(DEPDIR)/$(*F).TPo $(@D)/$(DEPDIR)/$(*F).Po > > > > .cc.o .c.o: > > $(COMPILE) $< > > $(POSTCOMPILE) > > > > > -- > H.J. -- H.J.