
This patch implements the --enable-host-pie configure option which makes the compiler executables PIE. This can be used to enhance protection against ROP attacks, and can be viewed as part of a wider trend to harden binaries. It is similar to the option --enable-host-shared, except that --e-h-s won't add -shared to the linker flags whereas --e-h-p will add -pie. It is different from --enable-default-pie because that option just adds an implicit -fPIE/-pie when the compiler is invoked, but the compiler itself isn't PIE. Since r12-5768-gfe7c3ecf, PCH works well with PIE, so there are no PCH regressions. When building the compiler, the build process may use various in-tree libraries; these need to be built with -fPIE so that it's possible to use them when building a PIE. For instance, when --with-included-gettext is in effect, intl object files must be compiled with -fPIE. Similarly, when building in-tree gmp, isl, mpfr and mpc, they must be compiled with -fPIE. I plan to add an option to link with -Wl,-z,now. ChangeLog: * Makefile.def: Pass $(PICFLAG) to AM_CFLAGS for gmp, mpfr, mpc, and isl. * Makefile.in: Regenerate. * Makefile.tpl: Set PICFLAG. * configure.ac (--enable-host-pie): New check. Set PICFLAG after this check. * configure: Regenerate. c++tools/ChangeLog: * Makefile.in: Rename PIEFLAG to PICFLAG. Set LD_PICFLAG. Use it. Use pic/libiberty.a if PICFLAG is set. * configure.ac (--enable-default-pie): Set PICFLAG instead of PIEFLAG. (--enable-host-pie): New check. * configure: Regenerate. fixincludes/ChangeLog: * Makefile.in: Set and use PICFLAG and LD_PICFLAG. Use the "pic" build of libiberty if PICFLAG is set. * configure.ac: * configure: Regenerate. gcc/ChangeLog: * Makefile.in: Set LD_PICFLAG. Use it. Set enable_host_pie. Remove NO_PIE_CFLAGS and NO_PIE_FLAG. Pass LD_PICFLAG to ALL_LINKERFLAGS. Use the "pic" build of libiberty if --enable-host-pie. * configure.ac (--enable-host-shared): Don't set PICFLAG here. (--enable-host-pie): New check. Set PICFLAG and LD_PICFLAG after this check. * configure: Regenerate. * doc/install.texi: Document --enable-host-pie. gcc/d/ChangeLog: * Make-lang.in: Remove NO_PIE_CFLAGS. intl/ChangeLog: * Makefile.in: Use @PICFLAG@ in COMPILE as well. * configure.ac (--enable-host-shared): Don't set PICFLAG here. (--enable-host-pie): New check. Set PICFLAG after this check. * configure: Regenerate. libcody/ChangeLog: * Makefile.in: Pass LD_PICFLAG to LDFLAGS. * configure.ac (--enable-host-shared): Don't set PICFLAG here. (--enable-host-pie): New check. Set PICFLAG and LD_PICFLAG after this check. * configure: Regenerate. libcpp/ChangeLog: * configure.ac (--enable-host-shared): Don't set PICFLAG here. (--enable-host-pie): New check. Set PICFLAG after this check. * configure: Regenerate. libdecnumber/ChangeLog: * configure.ac (--enable-host-shared): Don't set PICFLAG here. (--enable-host-pie): New check. Set PICFLAG after this check. * configure: Regenerate. libiberty/ChangeLog: * configure.ac: Also set shared when enable_host_pie. * configure: Regenerate. zlib/ChangeLog: * configure.ac (--enable-host-shared): Don't set PICFLAG here. (--enable-host-pie): New check. Set PICFLAG after this check. * configure: Regenerate.
149 lines
3.2 KiB
Makefile
149 lines
3.2 KiB
Makefile
# Nathan's generic Makefile -*- mode:Makefile -*-
|
|
# Copyright (C) 2019-2020 Nathan Sidwell, nathan@acm.org
|
|
# License: Apache v2.0
|
|
|
|
srcdir := @srcdir@
|
|
prefix := @prefix@
|
|
exec_prefix := @exec_prefix@
|
|
bindir := @bindir@
|
|
libdir := @libdir@
|
|
includedir := @includedir@
|
|
# Linker options
|
|
LDFLAGS := @LDFLAGS@
|
|
LIBS := @LIBS@
|
|
|
|
# We have to place the -I paths last, so that building will see -I paths to us
|
|
CXX := $(filter-out -I%,@CXX@)
|
|
AR := @AR@
|
|
RANLIB := @RANLIB@
|
|
INSTALL := $(srcdir)/build-aux/install-sh
|
|
|
|
# C++ compiler options
|
|
CXXFLAGS := @CXXFLAGS@
|
|
CXXINC := $(filter -I%,@CXX@)
|
|
CXXOPTS := $(CXXFLAGS) @PICFLAG@
|
|
|
|
ifneq (@EXCEPTIONS@,yes)
|
|
CXXOPTS += -fno-exceptions -fno-rtti
|
|
endif
|
|
|
|
# Config
|
|
CXXOPTS += $(filter-out -DHAVE_CONFIG_H,@DEFS@) -include config.h
|
|
|
|
# Linker options
|
|
LDFLAGS := @LDFLAGS@ @LD_PICFLAG@
|
|
LIBS := @LIBS@
|
|
|
|
# Per-source & per-directory compile flags (warning: recursive)
|
|
SRC_CXXFLAGS = $(CXXFLAGS$(patsubst $(srcdir)%,%,$1)) \
|
|
$(if $(filter-out $(srcdir)/,$1),\
|
|
$(call $0,$(dir $(patsubst %/,%,$1))))
|
|
|
|
ifneq ($(MAINTAINER),)
|
|
override MAINTAINER += $1
|
|
endif
|
|
ifeq (@MAINTAINER@,yes)
|
|
MAINTAINER = $2
|
|
else
|
|
MAINTAINER = \# --enable-maintainer-mode to rebuild $1, or make MAINTAINER=touch
|
|
endif
|
|
|
|
vpath %.in $(srcdir)
|
|
vpath %.cc $(srcdir)
|
|
|
|
.SUFFIXES: .o .cc
|
|
|
|
%.o: %.cc
|
|
@mkdir -p $(dir $@)
|
|
$(CXX) $(strip $(CXXOPTS) $(call SRC_CXXFLAGS,$<) $(CXXINC)) \
|
|
-MMD -MP -MF ${@:.o=.d} -c -o $@ $<
|
|
|
|
all:: Makefile
|
|
|
|
mostlyclean::
|
|
|
|
clean:: Makefile
|
|
|
|
# FIXME: Delete
|
|
revision.stamp: $(srcdir)/.
|
|
@revision=`git -C $(srcdir) rev-parse HEAD 2>/dev/null` ;\
|
|
if test -n "$$revision" ;\
|
|
then revision=git-$$revision ;\
|
|
if git -C $(srcdir) status --porcelain 2>/dev/null | grep -vq '^ ' ;\
|
|
then revision=$${revision}M ;\
|
|
fi ;\
|
|
else revision=unknown ;\
|
|
fi ;\
|
|
echo $$revision > $@
|
|
|
|
revision: revision.stamp
|
|
@cmp -s $< $@ || cp -f $< $@
|
|
|
|
mostlyclean::
|
|
|
|
clean:: mostlyclean
|
|
rm -f revision.stamp revision
|
|
|
|
distclean:: clean
|
|
rm -f config.log config.status
|
|
|
|
$(srcdir)/configure: $(srcdir)/configure.ac $(srcdir)/config.m4
|
|
$(call MAINTAINER,$@,cd $(@D) && autoconf -W all,error)
|
|
|
|
$(srcdir)/config.h.in: $(srcdir)/configure.ac $(srcdir)/config.m4
|
|
$(call MAINTAINER,$@,cd $(@D) && autoheader -f -W all,error)
|
|
|
|
config.h: config.status config.h.in
|
|
./$< --header=$@
|
|
touch $@
|
|
|
|
ifeq ($(filter %clean,$(MAKECMDGOALS)),)
|
|
Makefile: config.status Makefile.in
|
|
./$< --file=$@
|
|
touch $@
|
|
endif
|
|
|
|
config.status: $(srcdir)/configure $(srcdir)/config.h.in
|
|
if test -x $@; then ./$@ -recheck; else $< @configure_args@; fi
|
|
|
|
mostlyclean::
|
|
|
|
clean:: mostlyclean
|
|
rm -f $(shell find $(srcdir) -name '*~')
|
|
|
|
distclean:: clean
|
|
rm -f config.h
|
|
|
|
maintainer-clean:: distclean
|
|
rm -f $(srcdir)/config.h.in
|
|
|
|
.PHONY: all check clean distclean maintainer-clean mostlyclean
|
|
|
|
CXXFLAGS/ := -I$(srcdir)
|
|
LIBCODY.O := buffer.o client.o fatal.o netclient.o netserver.o \
|
|
resolver.o packet.o server.o
|
|
|
|
all:: libcody.a
|
|
|
|
libcody.a: $(LIBCODY.O)
|
|
$(AR) -cr $@ $^
|
|
$(RANLIB) $@
|
|
|
|
mostlyclean::
|
|
|
|
clean:: mostlyclean
|
|
rm -f $(LIBCODY.O) $(LIBCODY.O:.o=.d)
|
|
rm -f libcody.a
|
|
|
|
CXXFLAGS/fatal.cc = -DSRCDIR='"$(srcdir)"'
|
|
|
|
fatal.o: Makefile revision
|
|
|
|
install::
|
|
$(INSTALL) -d $(libdir) $(includedir)
|
|
$(INSTALL) libcody.a $(libdir)
|
|
$(INSTALL) $(srcdir)/cody.hh $(includedir)
|
|
|
|
ifeq ($(filter clean%,$(MAKECMDGOALS)),)
|
|
-include $(LIBCODY.O:.o=.d)
|
|
endif
|