mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
b6cb10af12
[ This is my third attempt to add this configure option. The first version was approved but it came too late in the development cycle. The second version was also approved, but I had to revert it: <https://gcc.gnu.org/pipermail/gcc-patches/2022-November/607082.html>. I've fixed the problem (by moving $(PICFLAG) from INTERNAL_CFLAGS to ALL_COMPILERFLAGS). Another change is that since r13-4536 I no longer need to touch Makefile.def, so this patch is simplified. ] 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. With this patch and --enable-host-pie used to configure gcc: $ file gcc/cc1{,plus,obj,gm2} gcc/f951 gcc/lto1 gcc/cpp gcc/go1 gcc/rust1 gcc/gnat1 gcc/cc1: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=98e22cde129d304aa6f33e61b1c39e144aeb135e, for GNU/Linux 3.2.0, with debug_info, not stripped gcc/cc1plus: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=859d1ea37e43dfe50c18fd4e3dd9a34bb1db8f77, for GNU/Linux 3.2.0, with debug_info, not stripped gcc/cc1obj: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=1964f8ecee6163182bc26134e2ac1f324816e434, for GNU/Linux 3.2.0, with debug_info, not stripped gcc/cc1gm2: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=a396672c7ff913d21855829202e7b02ecf42ff4c, for GNU/Linux 3.2.0, with debug_info, not stripped gcc/f951: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=59c523db893186547ac75c7a71f48be0a461c06b, for GNU/Linux 3.2.0, with debug_info, not stripped gcc/lto1: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=084a7b77df7be2d63c2d4c655b5bbc3fcdb6038d, for GNU/Linux 3.2.0, with debug_info, not stripped gcc/cpp: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=3503bf8390d219a10d6653b8560aa21158132168, for GNU/Linux 3.2.0, with debug_info, not stripped gcc/go1: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=988cc673af4fba5dcb482f4b34957b99050a68c5, for GNU/Linux 3.2.0, with debug_info, not stripped gcc/rust1: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=b6a5d3d514446c4dcdee0707f086ab9b274a8a3c, for GNU/Linux 3.2.0, with debug_info, not stripped gcc/gnat1: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=bb11ccdc2c366fe3fe0980476bcd8ca19b67f9dc, for GNU/Linux 3.2.0, with debug_info, not stripped I plan to add an option to link with -Wl,-z,now. Bootstrapped on x86_64-pc-linux-gnu with --with-included-gettext --enable-host-pie as well as without --enable-host-pie. Also tested on a Debian system where the system gcc was configured with --enable-default-pie. Co-Authored by: Iain Sandoe <iain@sandoe.co.uk> ChangeLog: * 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/ada/ChangeLog: * gcc-interface/Make-lang.in (ALL_ADAFLAGS): Remove NO_PIE_CFLAGS. Add PICFLAG. Use PICFLAG when building ada/b_gnat1.o and ada/b_gnatb.o. * gcc-interface/Makefile.in: Use pic/libiberty.a if PICFLAG is set. Remove NO_PIE_FLAG. gcc/m2/ChangeLog: * Make-lang.in: New var, GM2_PICFLAGS. Use it. 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.
265 lines
6.7 KiB
Makefile
265 lines
6.7 KiB
Makefile
# Makefile for directory with message catalog handling library of GNU gettext
|
|
# Copyright (C) 1995-2021 Free Software Foundation, Inc.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU Library General Public License as published
|
|
# by the Free Software Foundation; either version 2, or (at your option)
|
|
# any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Library General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Library General Public
|
|
# License along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
|
|
# USA.
|
|
|
|
# This Makefile has been modified from the original shipped with
|
|
# gettext 0.12.1 to remove the ability to install libintl (which
|
|
# we do not need nor want), the ability to build a shared library
|
|
# (likewise), and a large number of heinous kludges.
|
|
|
|
SHELL = @SHELL@
|
|
|
|
srcdir = @srcdir@
|
|
VPATH = $(srcdir)
|
|
|
|
prefix = @prefix@
|
|
exec_prefix = @exec_prefix@
|
|
transform = @program_transform_name@
|
|
libdir = @libdir@
|
|
includedir = @includedir@
|
|
datarootdir = @datarootdir@
|
|
datadir = @datadir@
|
|
localedir = $(datadir)/locale
|
|
aliaspath = $(localedir)
|
|
|
|
AR = ar
|
|
ACLOCAL = @ACLOCAL@
|
|
AUTOCONF = @AUTOCONF@
|
|
AUTOHEADER = @AUTOHEADER@
|
|
CC = @CC@
|
|
RANLIB = @RANLIB@
|
|
YACC = @INTLBISON@ -y -d
|
|
YFLAGS = --name-prefix=__gettext
|
|
CPPFLAGS = @CPPFLAGS@
|
|
CFLAGS = @CFLAGS@ @PICFLAG@
|
|
LDFLAGS = @LDFLAGS@
|
|
LIBS = @LIBS@
|
|
DEFS = -DHAVE_CONFIG_H
|
|
|
|
CTAGS = @CTAGS@
|
|
ETAGS = @ETAGS@
|
|
MKID = @MKID@
|
|
|
|
COMPILE = $(CC) -c $(CPPFLAGS) $(CFLAGS) @PICFLAG@ $(DEFS) $(DEFS-$@) $(INCLUDES)
|
|
|
|
HEADERS = \
|
|
gmo.h \
|
|
gettextP.h \
|
|
hash-string.h \
|
|
loadinfo.h \
|
|
plural-config.h \
|
|
plural-exp.h \
|
|
eval-plural.h \
|
|
localcharset.h \
|
|
relocatable.h \
|
|
libgnuintl.h
|
|
SOURCES = \
|
|
bindtextdom.c \
|
|
dcgettext.c \
|
|
dgettext.c \
|
|
gettext.c \
|
|
finddomain.c \
|
|
loadmsgcat.c \
|
|
localealias.c \
|
|
textdomain.c \
|
|
l10nflist.c \
|
|
explodename.c \
|
|
dcigettext.c \
|
|
dcngettext.c \
|
|
dngettext.c \
|
|
ngettext.c \
|
|
plural.y \
|
|
plural-exp.c \
|
|
localcharset.c \
|
|
relocatable.c \
|
|
localename.c \
|
|
log.c \
|
|
osdep.c \
|
|
intl-compat.c
|
|
OBJECTS = \
|
|
bindtextdom.o \
|
|
dcgettext.o \
|
|
dgettext.o \
|
|
gettext.o \
|
|
finddomain.o \
|
|
loadmsgcat.o \
|
|
localealias.o \
|
|
textdomain.o \
|
|
l10nflist.o \
|
|
explodename.o \
|
|
dcigettext.o \
|
|
dcngettext.o \
|
|
dngettext.o \
|
|
ngettext.o \
|
|
plural.o \
|
|
plural-exp.o \
|
|
localcharset.o \
|
|
relocatable.o \
|
|
localename.o \
|
|
log.o \
|
|
osdep.o \
|
|
intl-compat.o
|
|
|
|
DEFS-dcigettext.o = -DLOCALEDIR="\"$(localedir)\""
|
|
DEFS-localealias.o = -DLOCALE_ALIAS_PATH="\"$(aliaspath)\""
|
|
DEFS-localcharset.o = -DLIBDIR="\"$(libdir)\""
|
|
DEFS-relocatable.o = -DINSTALLDIR="\"$(libdir)\""
|
|
|
|
all: all-@USE_INCLUDED_LIBINTL@
|
|
all-yes: libintl.a libintl.h config.intl
|
|
all-no: # nothing
|
|
|
|
libintl.a: $(OBJECTS)
|
|
rm -f $@
|
|
$(AR) cru $@ $(OBJECTS)
|
|
$(RANLIB) $@
|
|
|
|
libintl.h: $(srcdir)/libgnuintl.h
|
|
cp $(srcdir)/libgnuintl.h $@
|
|
|
|
.SUFFIXES:
|
|
.SUFFIXES: .c .y .o
|
|
|
|
.c.o:
|
|
$(COMPILE) $<
|
|
|
|
.y.c:
|
|
@BISON3_YES@ echo '#define USE_BISON3' > $(patsubst %.c,%-config.h,$@)
|
|
@BISON3_YES@ sed 's,%pure_parser,,;s,^/\* BISON3 \(.*\) \*/$$,\1,' $< > $@.y
|
|
@BISON3_YES@ $(YACC) $(YFLAGS) --output $@.c $@.y
|
|
@BISON3_YES@ sed 's/\.c\.y"/.y"/' $@.c > $@
|
|
@BISON3_YES@ rm -f $@.c $@.y $@.h
|
|
@BISON3_NO@ echo '/* #define USE_BISON3 */' > $(patsubst %.c,%-config.h,$@)
|
|
@BISON3_NO@ $(YACC) $(YFLAGS) --output $@ $<
|
|
rm -f $*.h
|
|
|
|
INCLUDES = -I. -I$(srcdir)
|
|
|
|
check: all
|
|
|
|
# The installation targets have been disabled.
|
|
install: install-exec install-data
|
|
install-exec: all
|
|
install-data: all
|
|
install-strip: install
|
|
installdirs:
|
|
installcheck:
|
|
uninstall:
|
|
|
|
.PHONY: info dvi ps pdf html
|
|
.PHONY: install-info install-dvi install-ps install-pdf install-html
|
|
|
|
info dvi ps pdf html:
|
|
install-info install-dvi install-ps install-pdf install-html:
|
|
|
|
$(OBJECTS): config.h libintl.h
|
|
bindtextdom.o dcgettext.o dcigettext.o dcngettext.o dgettext.o \
|
|
dngettext.o finddomain.o gettext.o intl-compat.o loadmsgcat.o \
|
|
localealias.o ngettext.o textdomain.o: gettextP.h gmo.h loadinfo.h
|
|
dcigettext.o loadmsgcat.o: hash-string.h
|
|
explodename.o l10nflist.o: loadinfo.h
|
|
dcigettext.o loadmsgcat.o plural.o plural-exp.o: plural-exp.h plural-config.h
|
|
dcigettext.o: eval-plural.h
|
|
localcharset.o: localcharset.h
|
|
localealias.o localcharset.o relocatable.o: relocatable.h
|
|
|
|
tags: TAGS
|
|
TAGS: $(HEADERS) $(SOURCES)
|
|
here=`pwd`; cd $(srcdir) && \
|
|
$(ETAGS) -o $$here/TAGS $(HEADERS) $(SOURCES)
|
|
|
|
ctags: CTAGS
|
|
CTAGS: $(HEADERS) $(SOURCES)
|
|
here=`pwd`; cd $(srcdir) && \
|
|
$(CTAGS) -o $$here/CTAGS $(HEADERS) $(SOURCES)
|
|
|
|
id: ID
|
|
ID: $(HEADERS) $(SOURCES)
|
|
here=`pwd`; cd $(srcdir) && \
|
|
$(MKID) -f$$here/ID $(HEADERS) $(SOURCES)
|
|
|
|
mostlyclean:
|
|
rm -f *.a *.la *.o *.obj *.lo core core.* libintl.h
|
|
|
|
clean: mostlyclean
|
|
|
|
distclean: clean
|
|
rm -f config.status config.cache config.log config.intl config.h
|
|
rm -f Makefile ID TAGS
|
|
|
|
maintainer-clean: distclean
|
|
|
|
# The 'make dist' targets have been disabled; the GNU toolchain handles this
|
|
# with a script maintained separately from the Makefile.
|
|
dist:
|
|
distdir:
|
|
|
|
# Rules to rebuild the configuration
|
|
|
|
Makefile: $(srcdir)/Makefile.in config.status
|
|
$(SHELL) ./config.status Makefile
|
|
|
|
config.intl: $(srcdir)/config.intl.in config.status
|
|
$(SHELL) ./config.status config.intl
|
|
|
|
config.status: $(srcdir)/configure
|
|
$(SHELL) ./config.status --recheck
|
|
|
|
$(srcdir)/configure: @MAINT@ $(srcdir)/aclocal.m4 $(srcdir)/configure.ac
|
|
cd $(srcdir) && $(AUTOCONF)
|
|
|
|
aclocal_deps = \
|
|
$(srcdir)/configure.ac \
|
|
$(srcdir)/../config/codeset.m4 \
|
|
$(srcdir)/../config/gettext.m4 \
|
|
$(srcdir)/../config/glibc21.m4 \
|
|
$(srcdir)/../config/iconv.m4 \
|
|
$(srcdir)/../config/intdiv0.m4 \
|
|
$(srcdir)/../config/inttypes-pri.m4 \
|
|
$(srcdir)/../config/inttypes.m4 \
|
|
$(srcdir)/../config/inttypes_h.m4 \
|
|
$(srcdir)/../config/lcmessage.m4 \
|
|
$(srcdir)/../config/lib-ld.m4 \
|
|
$(srcdir)/../config/lib-link.m4 \
|
|
$(srcdir)/../config/lib-prefix.m4 \
|
|
$(srcdir)/../config/nls.m4 \
|
|
$(srcdir)/../config/po.m4 \
|
|
$(srcdir)/../config/progtest.m4 \
|
|
$(srcdir)/../config/stdint_h.m4 \
|
|
$(srcdir)/../config/uintmax_t.m4 \
|
|
$(srcdir)/../config/ulonglong.m4
|
|
|
|
$(srcdir)/aclocal.m4: @MAINT@ $(aclocal_deps)
|
|
cd $(srcdir) && $(ACLOCAL) -I ../config
|
|
|
|
config.h: stamp-h1
|
|
test -f config.h || (rm -f stamp-h1 && $(MAKE) stamp-h1)
|
|
|
|
plural-config.h: plural.c
|
|
|
|
stamp-h1: $(srcdir)/config.h.in config.status
|
|
-rm -f stamp-h1
|
|
$(SHELL) ./config.status config.h
|
|
|
|
$(srcdir)/config.h.in: @MAINT@ $(srcdir)/aclocal.m4 $(srcdir)/configure.ac
|
|
cd $(srcdir) && $(AUTOHEADER)
|
|
-rm -f stamp-h1
|
|
|
|
# Tell versions [3.59,3.63) of GNU make not to export all variables.
|
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
.NOEXPORT:
|