Add support for generated PIE link rules

This commit is contained in:
Andreas Schwab 2011-05-13 23:31:43 -04:00 committed by Ulrich Drepper
parent 20030ae6d7
commit da62f81bdd
6 changed files with 48 additions and 95 deletions

View File

@ -1,3 +1,18 @@
2011-05-11 Andreas Schwab <schwab@redhat.com>
* Makeconfig (+link-pie): Indent.
* Rules (binaries-pie): Define if $(have-fpie) and
$(build-shared).
(binaries-shared): Also filter out $(binaries-pie).
($(addprefix $(objpfx),$(binaries-pie))): New rule.
* nscd/Makefile (others-pie): Add nscd.
(LDFLAGS-nscd): Set this instead of relro-LDFLAGS.
($(objpfx)nscd): Remove command override.
* login/Makefile (others-pie): Add pt_chown.
($(objpfx)pt_chown): Remove command override.
* elf/Makefile: Add PIE tests to tests and tests-pie variables and
remove command overrides.
2011-05-13 Ulrich Drepper <drepper@gmail.com> 2011-05-13 Ulrich Drepper <drepper@gmail.com>
* libio/tst_putwc.c: Fix error messages. * libio/tst_putwc.c: Fix error messages.

View File

@ -450,9 +450,9 @@ ifndef +link-pie
$(addprefix $(csu-objpfx),S$(start-installed-name)) \ $(addprefix $(csu-objpfx),S$(start-installed-name)) \
$(+preinit) $(+prectorS) \ $(+preinit) $(+prectorS) \
$(filter-out $(addprefix $(csu-objpfx),start.o \ $(filter-out $(addprefix $(csu-objpfx),start.o \
S$(start-installed-name))\ S$(start-installed-name))\
$(+preinit) $(link-extra-libs) \ $(+preinit) $(link-extra-libs) \
$(common-objpfx)libc% $(+postinit),$^) \ $(common-objpfx)libc% $(+postinit),$^) \
$(link-extra-libs) $(link-libc) $(+postctorS) $(+postinit) $(link-extra-libs) $(link-libc) $(+postctorS) $(+postinit)
endif endif
# Command for statically linking programs with the C library. # Command for statically linking programs with the C library.

18
Rules
View File

@ -1,4 +1,4 @@
# Copyright (C) 1991-2000,2002,2003,2004,2005,2006 # Copyright (C) 1991-2000,2002,2003,2004,2005,2006,2011
# Free Software Foundation, Inc. # Free Software Foundation, Inc.
# This file is part of the GNU C Library. # This file is part of the GNU C Library.
@ -106,12 +106,19 @@ endif
ifeq ($(build-programs),yes) ifeq ($(build-programs),yes)
binaries-all = $(others) $(sysdep-others) $(tests) $(xtests) $(test-srcs) binaries-all = $(others) $(sysdep-others) $(tests) $(xtests) $(test-srcs)
binaries-static = $(others-static) $(tests-static) $(xtests-static) binaries-static = $(others-static) $(tests-static) $(xtests-static)
ifeq (yesyes,$(have-fpie)$(build-shared))
binaries-pie = $(others-pie) $(tests-pie) $(xtests-pie)
else
binaries-pie =
endif
else else
binaries-all = $(tests) $(xtests) $(test-srcs) binaries-all = $(tests) $(xtests) $(test-srcs)
binaries-static = binaries-static =
binaries-pie =
endif endif
binaries-shared = $(filter-out $(binaries-static), $(binaries-all)) binaries-shared = $(filter-out $(binaries-pie) $(binaries-static), \
$(binaries-all))
ifneq "$(strip $(binaries-shared))" "" ifneq "$(strip $(binaries-shared))" ""
$(addprefix $(objpfx),$(binaries-shared)): %: %.o \ $(addprefix $(objpfx),$(binaries-shared)): %: %.o \
@ -120,6 +127,13 @@ $(addprefix $(objpfx),$(binaries-shared)): %: %.o \
$(+link) $(+link)
endif endif
ifneq "$(strip $(binaries-pie))" ""
$(addprefix $(objpfx),$(binaries-pie)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
$(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
$(+link-pie)
endif
ifneq "$(strip $(binaries-static))" "" ifneq "$(strip $(binaries-static))" ""
$(addprefix $(objpfx),$(binaries-static)): %: %.o \ $(addprefix $(objpfx),$(binaries-static)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \ $(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \

View File

@ -213,9 +213,6 @@ ifeq (x86_64,$(config-machine))
tests += tst-audit3 tst-audit4 tst-audit5 tst-audit6 tst-audit7 tests += tst-audit3 tst-audit4 tst-audit5 tst-audit6 tst-audit7
endif endif
endif endif
ifeq (yesyes,$(have-fpie)$(build-shared))
tests: $(objpfx)tst-pie1.out
endif
tests: $(objpfx)tst-leaks1-mem $(objpfx)noload-mem tests: $(objpfx)tst-leaks1-mem $(objpfx)noload-mem
tlsmod17a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 tlsmod17a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
tlsmod18a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 tlsmod18a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
@ -268,8 +265,8 @@ modules-names += tst-array2dep tst-array5dep
endif endif
ifeq (yesyes,$(have-fpie)$(build-shared)) ifeq (yesyes,$(have-fpie)$(build-shared))
modules-names += tst-piemod1 modules-names += tst-piemod1
extra-test-objs += tst-pie1.o tests += tst-pie1
test-extras += tst-pie1 tests-pie += tst-pie1
endif endif
ifeq (x86_64,$(config-machine)) ifeq (x86_64,$(config-machine))
modules-names += tst-auditmod3a tst-auditmod3b \ modules-names += tst-auditmod3a tst-auditmod3b \
@ -306,9 +303,8 @@ test-extras += $(ifunc-test-modules)
ifeq (yes,$(have-fpie)) ifeq (yes,$(have-fpie))
ifunc-pie-tests = ifuncmain1pie ifuncmain1vispie ifuncmain1staticpie \ ifunc-pie-tests = ifuncmain1pie ifuncmain1vispie ifuncmain1staticpie \
ifuncmain5pie ifuncmain6pie ifuncmain7pie ifuncmain5pie ifuncmain6pie ifuncmain7pie
tests: $(patsubst %,$(objpfx)%.out, $(ifunc-pie-tests)) tests += $(ifunc-pie-tests)
extra-test-objs += $(ifunc-pie-tests:=.o) tests-pie += $(ifunc-pie-tests)
test-extras += $(ifunc-pie-tests)
endif endif
modules-names += ifuncmod1 ifuncmod3 ifuncmod5 ifuncmod6 modules-names += ifuncmod1 ifuncmod3 ifuncmod5 ifuncmod6
endif endif
@ -911,19 +907,9 @@ $(objpfx)tst-array5-static.out: $(objpfx)tst-array5-static
$(objpfx)tst-array5-static > $@ $(objpfx)tst-array5-static > $@
cmp $@ tst-array5-static.exp > /dev/null cmp $@ tst-array5-static.exp > /dev/null
ifeq (yesyes,$(have-fpie)$(build-shared))
CFLAGS-tst-pie1.c += $(pie-ccflag) CFLAGS-tst-pie1.c += $(pie-ccflag)
$(objpfx)tst-pie1.out: $(objpfx)tst-pie1 $(objpfx)tst-pie1: $(objpfx)tst-piemod1.so
$(elf-objpfx)$(rtld-installed-name) \
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
$< > $@
$(objpfx)tst-pie1: $(objpfx)tst-pie1.o $(objpfx)tst-piemod1.so
$(+link-pie)
generated += tst-pie1 tst-pie1.out tst-pie1.o
endif
check-textrel-CFLAGS = -O -Wall -D_XOPEN_SOURCE=600 -D_BSD_SOURCE check-textrel-CFLAGS = -O -Wall -D_XOPEN_SOURCE=600 -D_BSD_SOURCE
$(objpfx)check-textrel: check-textrel.c $(objpfx)check-textrel: check-textrel.c
@ -1086,7 +1072,6 @@ CFLAGS-ifuncmain7picstatic.c += $(pic-ccflag)
LDFLAGS-ifuncmain3 = -Wl,-export-dynamic LDFLAGS-ifuncmain3 = -Wl,-export-dynamic
ifeq (yesyes,$(have-fpie)$(build-shared))
CFLAGS-ifuncmain1pie.c += $(pie-ccflag) CFLAGS-ifuncmain1pie.c += $(pie-ccflag)
CFLAGS-ifuncmain1vispie.c += $(pie-ccflag) CFLAGS-ifuncmain1vispie.c += $(pie-ccflag)
CFLAGS-ifuncmain1staticpie.c += $(pie-ccflag) CFLAGS-ifuncmain1staticpie.c += $(pie-ccflag)
@ -1094,66 +1079,11 @@ CFLAGS-ifuncmain5pie.c += $(pie-ccflag)
CFLAGS-ifuncmain6pie.c += $(pie-ccflag) CFLAGS-ifuncmain6pie.c += $(pie-ccflag)
CFLAGS-ifuncmain7pie.c += $(pie-ccflag) CFLAGS-ifuncmain7pie.c += $(pie-ccflag)
$(objpfx)ifuncmain1pie.out: $(objpfx)ifuncmain1pie $(objpfx)ifuncmain1pie: $(objpfx)ifuncmod1.so
$(elf-objpfx)$(rtld-installed-name) \ $(objpfx)ifuncmain1staticpie: $(objpfx)ifuncdep1pic.o
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \ $(objpfx)ifuncmain1vispie: $(objpfx)ifuncmod1.so
$< > $@ $(objpfx)ifuncmain5pie: $(objpfx)ifuncmod5.so
$(objpfx)ifuncmain6pie: $(objpfx)ifuncmod6.so
$(objpfx)ifuncmain1pie: $(objpfx)ifuncmain1pie.o $(objpfx)ifuncmod1.so
$(+link-pie)
generated += ifuncmain1pie ifuncmain1pie.out
$(objpfx)ifuncmain1staticpie.out: $(objpfx)ifuncmain1staticpie
$(elf-objpfx)$(rtld-installed-name) \
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
$< > $@
$(objpfx)ifuncmain1staticpie: $(objpfx)ifuncmain1staticpie.o $(objpfx)ifuncdep1pic.o
$(+link-pie)
generated += ifuncmain1staticpie ifuncmain1staticpie.out
$(objpfx)ifuncmain1vispie.out: $(objpfx)ifuncmain1vispie
$(elf-objpfx)$(rtld-installed-name) \
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
$< > $@
$(objpfx)ifuncmain1vispie: $(objpfx)ifuncmain1vispie.o $(objpfx)ifuncmod1.so
$(+link-pie)
generated += ifuncmain1vispie ifuncmain1vispie.out
$(objpfx)ifuncmain5pie.out: $(objpfx)ifuncmain5pie
$(elf-objpfx)$(rtld-installed-name) \
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
$< > $@
$(objpfx)ifuncmain5pie: $(objpfx)ifuncmain5pie.o $(objpfx)ifuncmod5.so
$(+link-pie)
generated += ifuncmain5pie ifuncmain5pie.out
$(objpfx)ifuncmain6pie.out: $(objpfx)ifuncmain6pie
$(elf-objpfx)$(rtld-installed-name) \
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
$< > $@
$(objpfx)ifuncmain6pie: $(objpfx)ifuncmain6pie.o $(objpfx)ifuncmod6.so
$(+link-pie)
generated += ifuncmain6pie ifuncmain6pie.out
$(objpfx)ifuncmain7pie.out: $(objpfx)ifuncmain7pie
$(elf-objpfx)$(rtld-installed-name) \
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
$< > $@
$(objpfx)ifuncmain7pie: $(objpfx)ifuncmain7pie.o
$(+link-pie)
generated += ifuncmain7pie ifuncmain7pie.out
endif
$(objpfx)ifuncmain1: $(addprefix $(objpfx),ifuncmod1.so) $(objpfx)ifuncmain1: $(addprefix $(objpfx),ifuncmod1.so)
$(objpfx)ifuncmain1pic: $(addprefix $(objpfx),ifuncmod1.so) $(objpfx)ifuncmain1pic: $(addprefix $(objpfx),ifuncmod1.so)

View File

@ -30,6 +30,7 @@ routines := getutent getutent_r getutid getutline getutid_r getutline_r \
CFLAGS-grantpt.c = -DLIBEXECDIR='"$(libexecdir)"' CFLAGS-grantpt.c = -DLIBEXECDIR='"$(libexecdir)"'
others = utmpdump pt_chown others = utmpdump pt_chown
others-pie = pt_chown
install-others-programs = $(inst_libexecdir)/pt_chown install-others-programs = $(inst_libexecdir)/pt_chown
distribute := utmp-private.h utmp-equal.h pty-private.h distribute := utmp-private.h utmp-equal.h pty-private.h
@ -67,9 +68,6 @@ CFLAGS-pt_chown.c = $(pt_chown-cflags)
LDLIBS-pt_chown = $(libcap) LDLIBS-pt_chown = $(libcap)
ifeq (yesyes,$(have-fpie)$(build-shared)) ifeq (yesyes,$(have-fpie)$(build-shared))
LDFLAGS-pt_chown = -Wl,-z,now LDFLAGS-pt_chown = -Wl,-z,now
$(objpfx)pt_chown: $(objpfx)pt_chown.o
$(+link-pie)
endif endif
# pt_chown needs to be setuid root. # pt_chown needs to be setuid root.

View File

@ -1,4 +1,4 @@
# Copyright (C) 1998,2000,2002-2009 Free Software Foundation, Inc. # Copyright (C) 1998,2000,2002-2009,2011 Free Software Foundation, Inc.
# This file is part of the GNU C Library. # This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or # The GNU C Library is free software; you can redistribute it and/or
@ -38,9 +38,8 @@ nscd-modules := nscd connections pwdcache getpwnam_r getpwuid_r grpcache \
ifeq ($(have-thread-library),yes) ifeq ($(have-thread-library),yes)
ifneq (yesyes,$(have-fpie)$(build-shared))
others += nscd others += nscd
endif others-pie += nscd
install-sbin := nscd install-sbin := nscd
extra-objs := $(nscd-modules:=.o) extra-objs := $(nscd-modules:=.o)
@ -124,10 +123,7 @@ CFLAGS-getsrvbypt_r.c += $(nscd-cflags)
CFLAGS-res_hconf.c += $(nscd-cflags) CFLAGS-res_hconf.c += $(nscd-cflags)
ifeq (yesyes,$(have-fpie)$(build-shared)) ifeq (yesyes,$(have-fpie)$(build-shared))
relro-LDFLAGS += -Wl,-z,now LDFLAGS-nscd = -Wl,-z,now
$(objpfx)nscd: $(addprefix $(objpfx),$(nscd-modules:=.o))
$(+link-pie)
endif endif
# This makes sure -DNOT_IN_libc is passed for all these modules. # This makes sure -DNOT_IN_libc is passed for all these modules.