From da62f81bdd23bb5095cd54c0b34ae6d5a93df69e Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Fri, 13 May 2011 23:31:43 -0400 Subject: [PATCH] Add support for generated PIE link rules --- ChangeLog | 15 ++++++++++ Makeconfig | 6 ++-- Rules | 18 ++++++++++-- elf/Makefile | 90 +++++++--------------------------------------------------- login/Makefile | 4 +-- nscd/Makefile | 10 ++----- 6 files changed, 48 insertions(+), 95 deletions(-) diff --git a/ChangeLog b/ChangeLog index 839ad68..a25ddb2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2011-05-11 Andreas Schwab + + * 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 * libio/tst_putwc.c: Fix error messages. diff --git a/Makeconfig b/Makeconfig index 4d91458..3c51498 100644 --- a/Makeconfig +++ b/Makeconfig @@ -450,9 +450,9 @@ ifndef +link-pie $(addprefix $(csu-objpfx),S$(start-installed-name)) \ $(+preinit) $(+prectorS) \ $(filter-out $(addprefix $(csu-objpfx),start.o \ - S$(start-installed-name))\ - $(+preinit) $(link-extra-libs) \ - $(common-objpfx)libc% $(+postinit),$^) \ + S$(start-installed-name))\ + $(+preinit) $(link-extra-libs) \ + $(common-objpfx)libc% $(+postinit),$^) \ $(link-extra-libs) $(link-libc) $(+postctorS) $(+postinit) endif # Command for statically linking programs with the C library. diff --git a/Rules b/Rules index 5ace24c..00f03df 100644 --- a/Rules +++ b/Rules @@ -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. # This file is part of the GNU C Library. @@ -106,12 +106,19 @@ endif ifeq ($(build-programs),yes) binaries-all = $(others) $(sysdep-others) $(tests) $(xtests) $(test-srcs) 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 binaries-all = $(tests) $(xtests) $(test-srcs) binaries-static = +binaries-pie = endif -binaries-shared = $(filter-out $(binaries-static), $(binaries-all)) +binaries-shared = $(filter-out $(binaries-pie) $(binaries-static), \ + $(binaries-all)) ifneq "$(strip $(binaries-shared))" "" $(addprefix $(objpfx),$(binaries-shared)): %: %.o \ @@ -120,6 +127,13 @@ $(addprefix $(objpfx),$(binaries-shared)): %: %.o \ $(+link) 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))" "" $(addprefix $(objpfx),$(binaries-static)): %: %.o \ $(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \ diff --git a/elf/Makefile b/elf/Makefile index a18c1cd..8d9657d 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -213,9 +213,6 @@ ifeq (x86_64,$(config-machine)) tests += tst-audit3 tst-audit4 tst-audit5 tst-audit6 tst-audit7 endif endif -ifeq (yesyes,$(have-fpie)$(build-shared)) -tests: $(objpfx)tst-pie1.out -endif 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 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 ifeq (yesyes,$(have-fpie)$(build-shared)) modules-names += tst-piemod1 -extra-test-objs += tst-pie1.o -test-extras += tst-pie1 +tests += tst-pie1 +tests-pie += tst-pie1 endif ifeq (x86_64,$(config-machine)) modules-names += tst-auditmod3a tst-auditmod3b \ @@ -306,9 +303,8 @@ test-extras += $(ifunc-test-modules) ifeq (yes,$(have-fpie)) ifunc-pie-tests = ifuncmain1pie ifuncmain1vispie ifuncmain1staticpie \ ifuncmain5pie ifuncmain6pie ifuncmain7pie -tests: $(patsubst %,$(objpfx)%.out, $(ifunc-pie-tests)) -extra-test-objs += $(ifunc-pie-tests:=.o) -test-extras += $(ifunc-pie-tests) +tests += $(ifunc-pie-tests) +tests-pie += $(ifunc-pie-tests) endif modules-names += ifuncmod1 ifuncmod3 ifuncmod5 ifuncmod6 endif @@ -911,19 +907,9 @@ $(objpfx)tst-array5-static.out: $(objpfx)tst-array5-static $(objpfx)tst-array5-static > $@ cmp $@ tst-array5-static.exp > /dev/null -ifeq (yesyes,$(have-fpie)$(build-shared)) CFLAGS-tst-pie1.c += $(pie-ccflag) -$(objpfx)tst-pie1.out: $(objpfx)tst-pie1 - $(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 +$(objpfx)tst-pie1: $(objpfx)tst-piemod1.so check-textrel-CFLAGS = -O -Wall -D_XOPEN_SOURCE=600 -D_BSD_SOURCE $(objpfx)check-textrel: check-textrel.c @@ -1086,7 +1072,6 @@ CFLAGS-ifuncmain7picstatic.c += $(pic-ccflag) LDFLAGS-ifuncmain3 = -Wl,-export-dynamic -ifeq (yesyes,$(have-fpie)$(build-shared)) CFLAGS-ifuncmain1pie.c += $(pie-ccflag) CFLAGS-ifuncmain1vispie.c += $(pie-ccflag) CFLAGS-ifuncmain1staticpie.c += $(pie-ccflag) @@ -1094,66 +1079,11 @@ CFLAGS-ifuncmain5pie.c += $(pie-ccflag) CFLAGS-ifuncmain6pie.c += $(pie-ccflag) CFLAGS-ifuncmain7pie.c += $(pie-ccflag) -$(objpfx)ifuncmain1pie.out: $(objpfx)ifuncmain1pie - $(elf-objpfx)$(rtld-installed-name) \ - --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \ - $< > $@ - -$(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)ifuncmain1pie: $(objpfx)ifuncmod1.so +$(objpfx)ifuncmain1staticpie: $(objpfx)ifuncdep1pic.o +$(objpfx)ifuncmain1vispie: $(objpfx)ifuncmod1.so +$(objpfx)ifuncmain5pie: $(objpfx)ifuncmod5.so +$(objpfx)ifuncmain6pie: $(objpfx)ifuncmod6.so $(objpfx)ifuncmain1: $(addprefix $(objpfx),ifuncmod1.so) $(objpfx)ifuncmain1pic: $(addprefix $(objpfx),ifuncmod1.so) diff --git a/login/Makefile b/login/Makefile index beb2a5c..46bde13 100644 --- a/login/Makefile +++ b/login/Makefile @@ -30,6 +30,7 @@ routines := getutent getutent_r getutid getutline getutid_r getutline_r \ CFLAGS-grantpt.c = -DLIBEXECDIR='"$(libexecdir)"' others = utmpdump pt_chown +others-pie = pt_chown install-others-programs = $(inst_libexecdir)/pt_chown 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) ifeq (yesyes,$(have-fpie)$(build-shared)) LDFLAGS-pt_chown = -Wl,-z,now - -$(objpfx)pt_chown: $(objpfx)pt_chown.o - $(+link-pie) endif # pt_chown needs to be setuid root. diff --git a/nscd/Makefile b/nscd/Makefile index 4abae8c..097e6f0 100644 --- a/nscd/Makefile +++ b/nscd/Makefile @@ -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. # 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) -ifneq (yesyes,$(have-fpie)$(build-shared)) others += nscd -endif +others-pie += nscd install-sbin := nscd extra-objs := $(nscd-modules:=.o) @@ -124,10 +123,7 @@ CFLAGS-getsrvbypt_r.c += $(nscd-cflags) CFLAGS-res_hconf.c += $(nscd-cflags) ifeq (yesyes,$(have-fpie)$(build-shared)) -relro-LDFLAGS += -Wl,-z,now - -$(objpfx)nscd: $(addprefix $(objpfx),$(nscd-modules:=.o)) - $(+link-pie) +LDFLAGS-nscd = -Wl,-z,now endif # This makes sure -DNOT_IN_libc is passed for all these modules. -- 2.7.4