PATCH: bootstrap/17684: /usr/ccs/bin/ld: Can't create libgcc_s.sl

H. J. Lu hjl@lucon.org
Mon Sep 27 18:23:00 GMT 2004


We should create a temporary file first and rename it later. But I am
not 100% sure if this patch is parallel build safe.


H.J.
-----
2004-09-27  H.J. Lu  <hongjiu.lu@intel.com>

	PR bootstrap/17684
	* config/t-libunwind-elf (SHLIBUNWIND_LINK): Use a temporary
	file for the shared library to be created.
	* config/t-slibgcc-darwin (SHLIB_LINK): Likewise.
	* config/t-slibgcc-elf-ver (SHLIB_LINK): Likewise.
	* config/t-slibgcc-sld  (SHLIB_LINK): Likewise.

--- gcc/config/t-libunwind-elf.busy	2004-09-08 08:16:15.000000000 -0700
+++ gcc/config/t-libunwind-elf	2004-09-27 08:47:50.000000000 -0700
@@ -10,9 +10,10 @@ SHLIBUNWIND_NAME = @shlib_dir@@shlib_so_
 
 SHLIBUNWIND_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared \
 	-nodefaultlibs -Wl,-h,$(SHLIBUNWIND_SONAME) \
-	-Wl,-z,text -Wl,-z,defs \
-	-o $(SHLIBUNWIND_NAME) @multilib_flags@ $(SHLIB_OBJS) -lc && \
-	rm -f $(SHLIB_SOLINK) && \
+	-Wl,-z,text -Wl,-z,defs -o $(SHLIBUNWIND_NAME).tmp \
+	@multilib_flags@ $(SHLIB_OBJS) -lc && \
+	rm -f $(SHLIB_SOLINK) $(SHLIBUNWIND_NAME) && \
+	mv $(SHLIBUNWIND_NAME).tmp $(SHLIBUNWIND_NAME) && \
 	$(LN_S) $(SHLIBUNWIND_NAME) $(SHLIB_SOLINK)
 
 # $(slibdir) double quoted to protect it from expansion while building
--- gcc/config/t-slibgcc-darwin.busy	2004-02-23 13:24:33.000000000 -0800
+++ gcc/config/t-slibgcc-darwin	2004-09-27 08:48:21.000000000 -0700
@@ -12,10 +12,11 @@ SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual
 
 SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -dynamiclib -nodefaultlibs \
 	-Wl,-install_name,$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME) \
-	-Wl,-flat_namespace -o $(SHLIB_NAME) \
+	-Wl,-flat_namespace -o $(SHLIB_NAME).tmp \
 	$(SHLIB_VERSTRING) \
 	@multilib_flags@ $(SHLIB_OBJS) -lc && \
-	rm -f $(SHLIB_SOLINK) && \
+	rm -f $(SHLIB_SOLINK) $(SHLIB_NAME).tmp && \
+	mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \
 	$(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK)
 # $(slibdir) double quoted to protect it from expansion while building
 # libgcc.mk.  We want this delayed until actual install time.
--- gcc/config/t-slibgcc-elf-ver.busy	2004-02-23 13:24:33.000000000 -0800
+++ gcc/config/t-slibgcc-elf-ver	2004-09-27 08:48:59.000000000 -0700
@@ -14,8 +14,9 @@ SHLIB_LC = -lc
 SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
 	-Wl,--soname=$(SHLIB_SONAME) \
 	-Wl,--version-script=$(SHLIB_MAP) \
-	-o $(SHLIB_NAME) @multilib_flags@ $(SHLIB_OBJS) $(SHLIB_LC) && \
-	rm -f $(SHLIB_SOLINK) && \
+	-o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) $(SHLIB_LC) && \
+	rm -f $(SHLIB_SOLINK) $(SHLIB_NAME) && \
+	mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \
 	$(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK)
 # $(slibdir) double quoted to protect it from expansion while building
 # libgcc.mk.  We want this delayed until actual install time.
--- gcc/config/t-slibgcc-sld.busy	2004-02-23 13:24:33.000000000 -0800
+++ gcc/config/t-slibgcc-sld	2004-09-27 08:49:20.000000000 -0700
@@ -10,9 +10,10 @@ SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual
 
 SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
 	-Wl,-h,$(SHLIB_SONAME) -Wl,-z,text -Wl,-z,defs \
-	-Wl,-M,$(SHLIB_MAP) -o $(SHLIB_NAME) \
+	-Wl,-M,$(SHLIB_MAP) -o $(SHLIB_NAME).tmp \
 	@multilib_flags@ $(SHLIB_OBJS) -lc && \
-	rm -f $(SHLIB_SOLINK) && \
+	rm -f $(SHLIB_SOLINK) $(SHLIB_NAME) && \
+	mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \
 	$(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK)
 # $(slibdir) double quoted to protect it from expansion while building
 # libgcc.mk.  We want this delayed until actual install time.
-------------- next part --------------
2004-09-23  H.J. Lu  <hongjiu.lu@intel.com>

	* Makefile.tpl (REALLY_SET_LIB_PATH): Add @SET_GCC_LIB_PATH@.
	(HOST_EXPORTS]): Add @SET_GCC_LIB_PATH@. Set and export
	SET_GCC_LIB_PATH_CMD.
	(BASE_TARGET_EXPORTS): Likewise.
	* Makefile.in: Regenerated.

	* configure.in (SET_GCC_LIB_PATH): Set and substitute.
	* configure: Regenerated.

config/

2004-09-23  H.J. Lu  <hongjiu.lu@intel.com>

	* gcc-lib-path.m4: New file.

gcc/

2004-09-23  H.J. Lu  <hongjiu.lu@intel.com>

	* Makefile.in (@set_gcc_lib_path@): Added.

	* configure.ac: Include ../config/gcc-lib-path.m4. Use
	TL_AC_GNU_MAKE_GCC_LIB_PATH.
	* configure: Regenerated.

--- gcc/Makefile.tpl.ld-path	2004-09-13 12:41:58.000000000 -0700
+++ gcc/Makefile.tpl	2004-09-23 15:20:28.000000000 -0700
@@ -104,6 +104,7 @@ SET_LIB_PATH = @SET_LIB_PATH@
 # Some platforms don't like blank entries, so we remove duplicate,
 # leading and trailing colons.
 REALLY_SET_LIB_PATH = \
+  @SET_GCC_LIB_PATH@ \
   $(RPATH_ENVVAR)=`echo "$(HOST_LIB_PATH):$(TARGET_LIB_PATH):$$$(RPATH_ENVVAR)" | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; export $(RPATH_ENVVAR);
 
 # This is the list of directories to be built for the build system.
@@ -173,7 +174,9 @@ HOST_EXPORTS = \
 	OBJDUMP="$(OBJDUMP)"; export OBJDUMP; \
 	TOPLEVEL_CONFIGURE_ARGUMENTS="$(TOPLEVEL_CONFIGURE_ARGUMENTS)"; export TOPLEVEL_CONFIGURE_ARGUMENTS; \
 	GMPLIBS="$(HOST_GMPLIBS)"; export GMPLIBS; \
-	GMPINC="$(HOST_GMPINC)"; export GMPINC;
+	GMPINC="$(HOST_GMPINC)"; export GMPINC; \
+	SET_GCC_LIB_PATH_CMD="@SET_GCC_LIB_PATH@"; export SET_GCC_LIB_PATH_CMD; \
+	@SET_GCC_LIB_PATH@
 
 # Similar, for later GCC stages.
 STAGE_HOST_EXPORTS = \
@@ -207,7 +210,9 @@ BASE_TARGET_EXPORTS = \
 	LDFLAGS="$(LDFLAGS_FOR_TARGET)"; export LDFLAGS; \
 	NM="$(NM_FOR_TARGET)"; export NM; \
 	RANLIB="$(RANLIB_FOR_TARGET)"; export RANLIB; \
-	WINDRES="$(WINDRES_FOR_TARGET)"; export WINDRES;
+	WINDRES="$(WINDRES_FOR_TARGET)"; export WINDRES; \
+	SET_GCC_LIB_PATH_CMD="@SET_GCC_LIB_PATH@"; export SET_GCC_LIB_PATH_CMD; \
+	@SET_GCC_LIB_PATH@
 
 RAW_CXX_TARGET_EXPORTS = \
 	$(BASE_TARGET_EXPORTS) \
--- gcc/config/gcc-lib-path.m4.ld-path	2004-09-23 15:18:51.000000000 -0700
+++ gcc/config/gcc-lib-path.m4	2004-09-23 15:18:51.000000000 -0700
@@ -0,0 +1,15 @@
+AC_DEFUN([TL_AC_GNU_MAKE_GCC_LIB_PATH],
+[
+if test x"$SET_GCC_LIB_PATH_CMD" != x; then
+  # SET_GCC_LIB_PATH_CMD is "XXX=path; export XXX;". It is expanded to
+  #
+  #	eval "set_gcc_lib_path=XXX=path; export XXX;"
+  #
+  eval "set_gcc_lib_path=$SET_GCC_LIB_PATH_CMD"
+  # It will set set_gcc_lib_path to "export XXX=path" for GNU make.
+  set_gcc_lib_path="export $set_gcc_lib_path"
+else
+  set_gcc_lib_path=
+fi
+AC_SUBST(set_gcc_lib_path)
+])dnl
--- gcc/configure.in.ld-path	2004-09-21 08:47:27.000000000 -0700
+++ gcc/configure.in	2004-09-23 15:18:51.000000000 -0700
@@ -2297,4 +2297,24 @@ case ${enable_werror} in
 esac
 AC_SUBST(stage2_werror_flag)
 
+# If gcc is built natively with shared library enabled, set
+# $RPATH_ENVVAR to make sure the newly built gcc shared librares are
+# used.
+SET_GCC_LIB_PATH=
+if test -d ${srcdir}/gcc && test x${is_cross_compiler} = xno; then
+  case "${enable_shared}" in
+    no | "") ;;
+    *)
+      eval "d=\$$RPATH_ENVVAR"
+      if test x"$d" != x; then
+	d="$pwd/gcc:$d"
+      else
+	d="$pwd/gcc"
+    fi
+    SET_GCC_LIB_PATH="\$(RPATH_ENVVAR)=$d; export \$(RPATH_ENVVAR);"
+    ;;
+  esac
+fi
+AC_SUBST(SET_GCC_LIB_PATH)
+
 AC_OUTPUT(Makefile)
--- gcc/gcc/Makefile.in.ld-path	2004-09-23 09:16:12.000000000 -0700
+++ gcc/gcc/Makefile.in	2004-09-23 15:18:51.000000000 -0700
@@ -1001,6 +1001,9 @@ LIB2_DIVMOD_FUNCS = _divdi3 _moddi3 _udi
 # language hooks, generated by configure
 @language_hooks@
 
+# Set up library path if needed.
+@set_gcc_lib_path@
+
 # per-language makefile fragments
 ifneq ($(LANG_MAKEFRAGS),)
 include $(LANG_MAKEFRAGS)
--- gcc/gcc/configure.ac.ld-path	2004-09-23 15:18:50.000000000 -0700
+++ gcc/gcc/configure.ac	2004-09-23 15:18:51.000000000 -0700
@@ -3274,6 +3274,9 @@ AC_SUBST(target_cpu_default)
 
 AC_SUBST_FILE(language_hooks)
 
+sinclude(../config/gcc-lib-path.m4)
+TL_AC_GNU_MAKE_GCC_LIB_PATH
+
 # Echo link setup.
 if test x${build} = x${host} ; then
   if test x${host} = x${target} ; then
-------------- next part --------------
2004-09-23  H.J. Lu  <hongjiu.lu@intel.com>

	* Makefile.tpl (REALLY_SET_LIB_PATH): Add @SET_GCC_LIB_PATH@.
	(configure-target-[+module+]): Add @SET_GCC_LIB_PATH@. Set and
	export SET_GCC_LIB_PATH_CMD.
	(configure-gcc): Likewise.
	* Makefile.in: Regenerated.

	* configure.in (SET_GCC_LIB_PATH): Set and substitute.
	* configure: Regenerated.

config/

2004-09-23  H.J. Lu  <hongjiu.lu@intel.com>

	* gcc-lib-path.m4: New file.

gcc/

2004-09-23  H.J. Lu  <hongjiu.lu@intel.com>

	* Makefile.in (@set_gcc_lib_path@): Added.

	* configure.ac: Include ../config/gcc-lib-path.m4. Use
	TL_AC_GNU_MAKE_GCC_LIB_PATH.
	* configure: Regenerated.

--- gcc/Makefile.tpl.ld-path	2004-07-08 16:43:28.000000000 -0700
+++ gcc/Makefile.tpl	2004-09-23 15:09:49.000000000 -0700
@@ -103,6 +103,7 @@ SET_LIB_PATH = @SET_LIB_PATH@
 # Some platforms don't like blank entries, so we remove duplicate,
 # leading and trailing colons.
 REALLY_SET_LIB_PATH = \
+  @SET_GCC_LIB_PATH@ \
   $(RPATH_ENVVAR)=`echo "$(HOST_LIB_PATH):$(TARGET_LIB_PATH):$$$(RPATH_ENVVAR)" | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; export $(RPATH_ENVVAR);
 
 # This is the list of directories to be built for the build system.
@@ -973,6 +974,8 @@ ENDIF raw_cxx +]
 	NM="$(NM_FOR_TARGET)"; export NM; \
 	RANLIB="$(RANLIB_FOR_TARGET)"; export RANLIB; \
 	WINDRES="$(WINDRES_FOR_TARGET)"; export WINDRES; \
+	SET_GCC_LIB_PATH_CMD="@SET_GCC_LIB_PATH@"; export SET_GCC_LIB_PATH_CMD; \
+	@SET_GCC_LIB_PATH@ \
 	echo Configuring in $(TARGET_SUBDIR)/[+module+]; \
 	cd "$(TARGET_SUBDIR)/[+module+]" || exit 1; \
 	case $(srcdir) in \
@@ -1095,6 +1098,8 @@ configure-gcc:
 	WINDRES="$(WINDRES)"; export WINDRES; \
 	OBJCOPY="$(OBJCOPY)"; export OBJCOPY; \
 	OBJDUMP="$(OBJDUMP)"; export OBJDUMP; \
+	SET_GCC_LIB_PATH_CMD="@SET_GCC_LIB_PATH@"; export SET_GCC_LIB_PATH_CMD; \
+	@SET_GCC_LIB_PATH@ \
 	echo Configuring in gcc; \
 	cd gcc || exit 1; \
 	case $(srcdir) in \
--- gcc/config/gcc-lib-path.m4.ld-path	2004-09-23 15:09:49.000000000 -0700
+++ gcc/config/gcc-lib-path.m4	2004-09-23 15:11:51.000000000 -0700
@@ -0,0 +1,15 @@
+AC_DEFUN([TL_AC_GNU_MAKE_GCC_LIB_PATH],
+[
+if test x"$SET_GCC_LIB_PATH_CMD" != x; then
+  # SET_GCC_LIB_PATH_CMD is "XXX=path; export XXX;". It is expanded to
+  #
+  #	eval "set_gcc_lib_path=XXX=path; export XXX;"
+  #
+  eval "set_gcc_lib_path=$SET_GCC_LIB_PATH_CMD"
+  # It will set set_gcc_lib_path to "export XXX=path" for GNU make.
+  set_gcc_lib_path="export $set_gcc_lib_path"
+else
+  set_gcc_lib_path=
+fi
+AC_SUBST(set_gcc_lib_path)
+])dnl
--- gcc/configure.in.ld-path	2004-06-26 21:31:19.000000000 -0700
+++ gcc/configure.in	2004-09-23 15:09:49.000000000 -0700
@@ -2145,4 +2145,24 @@ fi	
 MAINT=$MAINTAINER_MODE_TRUE
 AC_SUBST(MAINT)dnl
 
+# If gcc is built natively with shared library enabled, set
+# $RPATH_ENVVAR to make sure the newly built gcc shared librares are
+# used.
+SET_GCC_LIB_PATH=
+if test -d ${srcdir}/gcc && test x${is_cross_compiler} = xno; then
+  case "${enable_shared}" in
+    no | "") ;;
+    *)
+      eval "d=\$$RPATH_ENVVAR"
+      if test x"$d" != x; then
+	d="$pwd/gcc:$d"
+      else
+	d="$pwd/gcc"
+    fi
+    SET_GCC_LIB_PATH="\$(RPATH_ENVVAR)=$d; export \$(RPATH_ENVVAR);"
+    ;;
+  esac
+fi
+AC_SUBST(SET_GCC_LIB_PATH)
+
 AC_OUTPUT(Makefile)
--- gcc/gcc/Makefile.in.ld-path	2004-09-23 15:09:49.000000000 -0700
+++ gcc/gcc/Makefile.in	2004-09-23 15:09:49.000000000 -0700
@@ -951,6 +951,9 @@ LIB2_DIVMOD_FUNCS = _divdi3 _moddi3 _udi
 # language hooks, generated by configure
 @language_hooks@
 
+# Set up library path if needed.
+@set_gcc_lib_path@
+
 # per-language makefile fragments
 ifneq ($(LANG_MAKEFRAGS),)
 include $(LANG_MAKEFRAGS)
--- gcc/gcc/configure.ac.ld-path	2004-09-23 15:09:49.000000000 -0700
+++ gcc/gcc/configure.ac	2004-09-23 15:09:49.000000000 -0700
@@ -3139,6 +3139,9 @@ AC_SUBST(target_cpu_default)
 
 AC_SUBST_FILE(language_hooks)
 
+sinclude(../config/gcc-lib-path.m4)
+TL_AC_GNU_MAKE_GCC_LIB_PATH
+
 # If it doesn't already exist, create document directory
 echo "checking for the document directory." 1>&2
 if test -d doc ; then


More information about the Gcc-patches mailing list