From abcb584d0eae7270b35e1b3fed1f9661e26b8be0 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 6 Nov 2017 08:29:48 -0800 Subject: Use newly built crt*.o files to build shared objects [BZ #22362] When multi-lib GCC is used to build glibc, the search order of GCC driver for crt*.o is -B*/`gcc -print-multi-directory`, the installed diretory, -B*/. This patch adds multi-lib support to csu/Makefile so that -B/glibc-build-directory/csu/ will pick up the newly built crt*.o. Tested on x86-64 for i686 and x32. [BZ #22362] * Makerules (make-link-multidir): New. * config.make.in (multidir): New. * configure.ac (libc_cv_multidir): New. AC_SUBST. * configure: Regenerated. * csu/Makefile [$(multidir) != .](multilib-extra-objs): New. [$(multidir) != .](extra-objs): Add $(multilib-extra-objs). [$(multidir) != .]($(addprefix $(objpfx)$(multidir)/, $(install-lib))): New target. --- ChangeLog | 12 ++++++++++++ Makerules | 9 +++++++++ config.make.in | 1 + configure | 6 ++++++ configure.ac | 5 +++++ csu/Makefile | 10 ++++++++++ 6 files changed, 43 insertions(+) diff --git a/ChangeLog b/ChangeLog index acd573cfc3..57c99d6562 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2017-11-06 H.J. Lu + + [BZ #22362] + * Makerules (make-link-multidir): New. + * config.make.in (multidir): New. + * configure.ac (libc_cv_multidir): New. AC_SUBST. + * configure: Regenerated. + * csu/Makefile [$(multidir) != .](multilib-extra-objs): New. + [$(multidir) != .](extra-objs): Add $(multilib-extra-objs). + [$(multidir) != .]($(addprefix $(objpfx)$(multidir)/, $(install-lib))): + New target. + 2017-11-06 Joseph Myers [BZ #22402] diff --git a/Makerules b/Makerules index bbfbefe33f..522de25cfd 100644 --- a/Makerules +++ b/Makerules @@ -1079,6 +1079,11 @@ rm -f $@.new $(SHELL) $(..)scripts/rellns-sh $< $@.new mv -f $@.new $@ endef +define make-link-multidir +$(patsubst %/,cd %,$(objpfx)); \ + $(LN_S) . $(multidir) 2> /dev/null; \ + test -L $(multidir) +endef else # If we have no symbolic links don't bother with rellns-sh. define make-link @@ -1086,6 +1091,10 @@ rm -f $@.new $(LN_S) $< $@.new mv -f $@.new $@ endef +define make-link-multidir +$(make-target-directory) +ln -f $(objpfx)/$(@F) $@ +endef endif ifeq (yes,$(build-shared)) diff --git a/config.make.in b/config.make.in index fd2dbc91d1..bd84a5747d 100644 --- a/config.make.in +++ b/config.make.in @@ -21,6 +21,7 @@ includedir = @includedir@ datarootdir = @datarootdir@ localstatedir = @libc_cv_localstatedir@ localedir = @localedir@ +multidir= @libc_cv_multidir@ # Should we use and build ldconfig? use-ldconfig = @use_ldconfig@ diff --git a/configure b/configure index 6010977c58..c8697d9b1a 100755 --- a/configure +++ b/configure @@ -594,6 +594,7 @@ mach_interface_list DEFINES static_nss profile +libc_cv_multidir libc_cv_pie_default libc_cv_pic_default shared @@ -6698,6 +6699,11 @@ fi $as_echo "$libc_cv_pie_default" >&6; } +# Set the `multidir' variable by grabbing the variable from the compiler. +# We do it once and save the result in a generated makefile. +libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory` + + diff --git a/configure.ac b/configure.ac index 148f7d1682..9f25c9fa0f 100644 --- a/configure.ac +++ b/configure.ac @@ -1783,6 +1783,11 @@ fi rm -f conftest.*]) AC_SUBST(libc_cv_pie_default) +# Set the `multidir' variable by grabbing the variable from the compiler. +# We do it once and save the result in a generated makefile. +libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory` +AC_SUBST(libc_cv_multidir) + AC_SUBST(profile) AC_SUBST(static_nss) diff --git a/csu/Makefile b/csu/Makefile index fd668a5d00..e42a32b3eb 100644 --- a/csu/Makefile +++ b/csu/Makefile @@ -77,6 +77,11 @@ crtstuff = crti crtn install-lib += $(crtstuff:=.o) extra-objs += $(crtstuff:=.o) +ifneq ($(multidir),.) +multilib-extra-objs = $(addprefix $(multidir)/, $(install-lib)) +extra-objs += $(multilib-extra-objs) +endif + extra-objs += abi-note.o init.o asm-CPPFLAGS += -I$(objpfx). @@ -147,3 +152,8 @@ $(objpfx)abi-tag.h: $(..)abi-tags done if test -r $@.new; then mv -f $@.new $@; \ else echo >&2 'This configuration not matched in $<'; exit 1; fi + +ifneq ($(multidir),.) +$(addprefix $(objpfx)$(multidir)/, $(install-lib)): $(addprefix $(objpfx), $(install-lib)) + $(make-link-multidir) +endif -- cgit v1.2.3