This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

-mmacosx-version-min and libgcc


When using a shared libgcc, GCC links with '-lgcc_s -lgcc', with the
intention of having those symbols in the system's libgcc used from the
shared library, but backfilling from the static library if those
symbols are not available.

This works fine when the system's libgcc is actually the one found by
'-lgcc_s'.  On Darwin, though, you can target a previous system
version through the use of the -mmacosx-version-min flag; but -lgcc_s
will refer to the current system's libgcc, which might have more
symbols (never less!).

So, we need to have separate libgcc versions to link against for each
OS version (at least, each OS version that actually has a different
libgcc).  It doesn't matter if the versions have too few symbols, so
you can anticipate future OS releases and at worst you'll produce
slightly less optimal linking.  That is what this patch does.

Most of the actual size of the patch is in creating LIPO_FOR_TARGET
and STRIP_FOR_TARGET variables so the 'stub' (no code) libraries can
be created and have the right exported symbol list and I didn't have
to just write 'strip' and hope it was the right strip.  I wouldn't be
surprised to find I missed a place where these should have been added
to some list, there were an awful lot of such places.

When I tried to bootstrap this way, I got a nasty surprise.
STAGEMOVESTUFF contains '*.[0-9][0-9].*', which matches
'libgcc_s.10.4.dylib'.  That would have been fine, except that later
on all the stage*-start scripts do 'rm -f
stage1/libgcc_s*$(SHLIB_EXT)', deleting the dylibs that just got moved
there!  So, some rearrangement was necessary.

Don't like the name of the stub libraries?  Remember, these are just
for linking, so you can change it to be whatever you want so long as
you update REAL_LIBGCC_SPEC to match (in every affected compiler).  I
debated with myself for a long time as to the relative merits of '.'
and '_' and '-' in the names.  They go in $(slibdir) rather than in
$(libsubdir) because they're based on the contents of the actual
systems, not any one compiler version.

Bootstrapped & tested on powerpc-darwin8 with 64-bit multilib enabled.

-- 
- Geoffrey Keating <geoffk@apple.com>

===File ~/patches/gcc-darwin-minversionlibgcc.patch=========
Index: ChangeLog
2005-09-28  Geoffrey Keating  <geoffk@apple.com>

	* Makefile.tpl (BASE_TARGET_EXPORTS): Add LIPO, STRIP.
	(LIPO_FOR_TARGET): New.
	(CONFIGURED_LIPO_FOR_TARGET): New.
	(USUAL_LIPO_FOR_TARGET): New.
	(STRIP_FOR_TARGET): New.
	(CONFIGURED_STRIP_FOR_TARGET): New.
	(USUAL_STRIP_FOR_TARGET): New.
	* Makefile.def (flags_to_pass): Add LIPO_FOR_TARGET and
	STRIP_FOR_TARGET.
	* configure.in: Set LIPO_FOR_TARGET, STRIP_FOR_TARGET,
	CONFIGURED_LIPO_FOR_TARGET, CONFIGURED_STRIP_FOR_TARGET.
	* Makefile.in: Regenerate.
	* configure.in: Regenerate.
	
Index: gcc/ChangeLog
2005-09-28  Geoffrey Keating  <geoffk@apple.com>

	* Makefile.in: Export LIPO_FOR_TARGET, STRIP_FOR_TARGET.
	(stage1-start): Delete old libgcc and libunwind before moving
	anything into the stage directory.
	(stage2-start): Likewise.
	(stage3-start): Likewise.
	(stage4-start): Likewise.
	(stageprofile-start): Likewise.
	(stagefeedback-start): Likewise.
	* config.gcc (*-*-darwin*): Automatically use CPU-specific darwin.h
	header in tm_file and CPU-specific t-darwin in tmake_file.
	(i[34567]86-*-darwin*): Don't change tm_file.
	(powerpc-*-darwin*): Don't change tm_file or tmake_file.
	* config/darwin.h (REAL_LIBGCC_SPEC): Rewrite to use proper libgcc
	shared library stub for target OS version.
	* config/t-slibgcc-darwin (SHLIB_SOLINK): Delete.
	(SHLIB_LINK): Don't make SHLIB_SOLINK.
	(SHLIB_INSTALL): Don't install SHLIB_SOLINK.
	(libgcc_s.%.dylib): New.
	(LIBGCC): Define.
	(install-darwin-libgcc-stubs): New.
	(INSTALL_LIBGCC): New append.
	* config/i386/darwin-libgcc.10.4.ver: New.
	* config/i386/darwin-libgcc.10.5.ver: New.
	* config/i386/t-darwin: New.
	* config/rs6000/darwin-libgcc.10.4.ver: New.
	* config/rs6000/darwin-libgcc.10.5.ver: New.
	* config/rs6000/darwin.h (REAL_LIBGCC_SPEC): Delete.
	* config/rs6000/t-darwin (SHLIB_VERPFX): Define.

Index: Makefile.def
===================================================================
RCS file: /cvs/gcc/gcc/Makefile.def,v
retrieving revision 1.57
diff -u -p -u -p -r1.57 Makefile.def
--- Makefile.def	20 Aug 2005 13:43:17 -0000	1.57
+++ Makefile.def	28 Sep 2005 23:29:15 -0000
@@ -223,11 +223,13 @@ flags_to_pass = { flag= DLLTOOL_FOR_TARG
 flags_to_pass = { flag= GCJ_FOR_TARGET ; };
 flags_to_pass = { flag= GFORTRAN_FOR_TARGET ; };
 flags_to_pass = { flag= LD_FOR_TARGET ; };
+flags_to_pass = { flag= LIPO_FOR_TARGET ; };
 flags_to_pass = { flag= LDFLAGS_FOR_TARGET ; };
 flags_to_pass = { flag= LIBCFLAGS_FOR_TARGET ; };
 flags_to_pass = { flag= LIBCXXFLAGS_FOR_TARGET ; };
 flags_to_pass = { flag= NM_FOR_TARGET ; };
 flags_to_pass = { flag= RANLIB_FOR_TARGET ; };
+flags_to_pass = { flag= STRIP_FOR_TARGET ; };
 flags_to_pass = { flag= WINDRES_FOR_TARGET ; };
 
 // Inter-module dependencies
Index: Makefile.tpl
===================================================================
RCS file: /cvs/gcc/gcc/Makefile.tpl,v
retrieving revision 1.141
diff -u -p -u -p -r1.141 Makefile.tpl
--- Makefile.tpl	17 Aug 2005 15:59:28 -0000	1.141
+++ Makefile.tpl	28 Sep 2005 23:29:17 -0000
@@ -195,8 +195,10 @@ BASE_TARGET_EXPORTS = \
 	DLLTOOL="$(DLLTOOL_FOR_TARGET)"; export DLLTOOL; \
 	LD="$(LD_FOR_TARGET)"; export LD; \
 	LDFLAGS="$(LDFLAGS_FOR_TARGET)"; export LDFLAGS; \
+	LIPO="$(LIPO_FOR_TARGET)"; export LIPO; \
 	NM="$(NM_FOR_TARGET)"; export NM; \
 	RANLIB="$(RANLIB_FOR_TARGET)"; export RANLIB; \
+	STRIP="$(STRIP_FOR_TARGET)"; export STRIP; \
 	WINDRES="$(WINDRES_FOR_TARGET)"; export WINDRES; \
 	$(RPATH_ENVVAR)=`echo "$(HOST_LIB_PATH)$(TARGET_LIB_PATH)$$$(RPATH_ENVVAR)" | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; export $(RPATH_ENVVAR);
 
@@ -481,6 +483,19 @@ USUAL_LD_FOR_TARGET = ` \
 
 LDFLAGS_FOR_TARGET = 
 
+LIPO_FOR_TARGET=@LIPO_FOR_TARGET@
+CONFIGURED_LIPO_FOR_TARGET=@CONFIGURED_LIPO_FOR_TARGET@
+USUAL_LIPO_FOR_TARGET = ` \
+  if [ '$(host)' = '$(target)' ] ; then \
+    if [ x'$(LIPO)' != x ]; then \
+       echo $(LIPO); \
+    else \
+       echo lipo; \
+    fi; \
+  else \
+    echo $(CONFIGURED_LIPO_FOR_TARGET) ; \
+  fi`
+
 NM_FOR_TARGET=@NM_FOR_TARGET@
 CONFIGURED_NM_FOR_TARGET=@CONFIGURED_NM_FOR_TARGET@
 USUAL_NM_FOR_TARGET = ` \
@@ -513,6 +528,23 @@ USUAL_RANLIB_FOR_TARGET = ` \
     fi; \
   fi`
 
+STRIP_FOR_TARGET=@STRIP_FOR_TARGET@
+CONFIGURED_STRIP_FOR_TARGET=@CONFIGURED_STRIP_FOR_TARGET@
+USUAL_STRIP_FOR_TARGET = ` \
+  if [ -f $$r/$(HOST_SUBDIR)/binutils/strip ] ; then \
+    echo $$r/$(HOST_SUBDIR)/binutils/strip ; \
+  else \
+    if [ '$(host)' = '$(target)' ] ; then \
+      if [ x'$(STRIP)' != x ]; then \
+         echo $(STRIP); \
+      else \
+         echo strip; \
+      fi; \
+    else \
+      echo $(CONFIGURED_STRIP_FOR_TARGET) ; \
+    fi; \
+  fi`
+
 WINDRES_FOR_TARGET=@WINDRES_FOR_TARGET@
 CONFIGURED_WINDRES_FOR_TARGET=@CONFIGURED_WINDRES_FOR_TARGET@
 USUAL_WINDRES_FOR_TARGET = ` \
Index: configure.in
===================================================================
RCS file: /cvs/gcc/gcc/configure.in,v
retrieving revision 1.366
diff -u -p -u -p -r1.366 configure.in
--- configure.in	20 Sep 2005 01:24:46 -0000	1.366
+++ configure.in	28 Sep 2005 23:29:17 -0000
@@ -2116,8 +2116,10 @@ NCN_STRICT_CHECK_TARGET_TOOLS(GCC_FOR_TA
 NCN_STRICT_CHECK_TARGET_TOOLS(GCJ_FOR_TARGET, gcj)
 NCN_STRICT_CHECK_TARGET_TOOLS(GFORTRAN_FOR_TARGET, gfortran)
 NCN_STRICT_CHECK_TARGET_TOOLS(LD_FOR_TARGET, ld)
+NCN_STRICT_CHECK_TARGET_TOOLS(LIPO_FOR_TARGET, lipo)
 NCN_STRICT_CHECK_TARGET_TOOLS(NM_FOR_TARGET, nm)
 NCN_STRICT_CHECK_TARGET_TOOLS(RANLIB_FOR_TARGET, ranlib, :)
+NCN_STRICT_CHECK_TARGET_TOOLS(STRIP_FOR_TARGET, strip)
 NCN_STRICT_CHECK_TARGET_TOOLS(WINDRES_FOR_TARGET, windres)
 
 CONFIGURED_AR_FOR_TARGET="$AR_FOR_TARGET"
@@ -2129,8 +2131,10 @@ CONFIGURED_GCC_FOR_TARGET="$GCC_FOR_TARG
 CONFIGURED_GCJ_FOR_TARGET="$GCJ_FOR_TARGET"
 CONFIGURED_GFORTRAN_FOR_TARGET="$GFORTRAN_FOR_TARGET"
 CONFIGURED_LD_FOR_TARGET="$LD_FOR_TARGET"
+CONFIGURED_LIPO_FOR_TARGET="$LIPO_FOR_TARGET"
 CONFIGURED_NM_FOR_TARGET="$NM_FOR_TARGET"
 CONFIGURED_RANLIB_FOR_TARGET="$RANLIB_FOR_TARGET"
+CONFIGURED_STRIP_FOR_TARGET="$STRIP_FOR_TARGET"
 CONFIGURED_WINDRES_FOR_TARGET="$WINDRES_FOR_TARGET"
 
 AC_SUBST(CONFIGURED_AR_FOR_TARGET)dnl
@@ -2142,8 +2146,10 @@ AC_SUBST(CONFIGURED_GCC_FOR_TARGET)dnl
 AC_SUBST(CONFIGURED_GCJ_FOR_TARGET)dnl
 AC_SUBST(CONFIGURED_GFORTRAN_FOR_TARGET)dnl
 AC_SUBST(CONFIGURED_LD_FOR_TARGET)dnl
+AC_SUBST(CONFIGURED_LIPO_FOR_TARGET)dnl
 AC_SUBST(CONFIGURED_NM_FOR_TARGET)dnl
 AC_SUBST(CONFIGURED_RANLIB_FOR_TARGET)dnl
+AC_SUBST(CONFIGURED_STRIP_FOR_TARGET)dnl
 AC_SUBST(CONFIGURED_WINDRES_FOR_TARGET)dnl
 AC_SUBST(FLAGS_FOR_TARGET)
 
@@ -2165,8 +2171,10 @@ if test "x${build}" = "x${host}" ; then
   GCJ_FOR_TARGET="\$(USUAL_GCJ_FOR_TARGET)"
   GFORTRAN_FOR_TARGET="\$(USUAL_GFORTRAN_FOR_TARGET)"
   LD_FOR_TARGET="\$(USUAL_LD_FOR_TARGET)"
+  LIPO_FOR_TARGET="\$(USUAL_LIPO_FOR_TARGET)"
   NM_FOR_TARGET="\$(USUAL_NM_FOR_TARGET)"
   RANLIB_FOR_TARGET="\$(USUAL_RANLIB_FOR_TARGET)"
+  STRIP_FOR_TARGET="\$(USUAL_STRIP_FOR_TARGET)"
   WINDRES_FOR_TARGET="\$(USUAL_WINDRES_FOR_TARGET)"
 else
   # Just use the ones we found.
@@ -2180,8 +2188,10 @@ else
   GCJ_FOR_TARGET="\$(CONFIGURED_GCJ_FOR_TARGET)"
   GFORTRAN_FOR_TARGET="\$(CONFIGURED_GFORTRAN_FOR_TARGET)"
   LD_FOR_TARGET="\$(CONFIGURED_LD_FOR_TARGET)"
+  LIPO_FOR_TARGET="\$(CONFIGURED_LIPO_FOR_TARGET)"
   NM_FOR_TARGET="\$(CONFIGURED_NM_FOR_TARGET)"
   RANLIB_FOR_TARGET="\$(CONFIGURED_RANLIB_FOR_TARGET)"
+  STRIP_FOR_TARGET="\$(CONFIGURED_STRIP_FOR_TARGET)"
   WINDRES_FOR_TARGET="\$(CONFIGURED_WINDRES_FOR_TARGET)"  
 fi
 
Index: gcc/Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Makefile.in,v
retrieving revision 1.1542
diff -u -p -u -p -r1.1542 Makefile.in
--- gcc/Makefile.in	26 Sep 2005 18:44:16 -0000	1.1542
+++ gcc/Makefile.in	28 Sep 2005 23:29:18 -0000
@@ -863,8 +863,10 @@ export INCLUDES
 export INSTALL_DATA
 export LIB1ASMSRC
 export LIBGCC2_CFLAGS
+export LIPO_FOR_TARGET
 export MACHMODE_H
 export NM_FOR_TARGET
+export STRIP_FOR_TARGET
 export RANLIB_FOR_TARGET
 export libsubdir
 export slibdir
@@ -4283,6 +4285,9 @@ stage1-start:
 	 do \
 	   if [ -d stage1/$$dir ] ; then true ; else mkdir stage1/$$dir ; fi ; \
 	 done
+	-rm -f stage1/libgcc.a stage1/libgcc_eh.a stage1/libgcov.a
+	-rm -f stage1/libgcc_s*$(SHLIB_EXT)
+	-rm -f stage1/libunwind.a stage1/libunwind*$(SHLIB_EXT)
 # If SPECS is overridden, make sure it is `installed' as specs.
 	-mv $(SPECS) stage1/specs
 	-mv $(STAGEMOVESTUFF) stage1
@@ -4293,9 +4298,6 @@ stage1-start:
 	-if [ -f as$(exeext) ] ; then (cd stage1 && $(LN_S) ../as$(exeext) .) ; else true ; fi
 	-if [ -f ld$(exeext) ] ; then (cd stage1 && $(LN_S) ../ld$(exeext) .) ; else true ; fi
 	-if [ -f collect-ld$(exeext) ] ; then (cd stage1 && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
-	-rm -f stage1/libgcc.a stage1/libgcc_eh.a stage1/libgcov.a
-	-rm -f stage1/libgcc_s*$(SHLIB_EXT)
-	-rm -f stage1/libunwind.a stage1/libunwind*$(SHLIB_EXT)
 	-cp libgcc.a stage1
 	-$(RANLIB_FOR_TARGET) stage1/libgcc.a
 	-cp libgcov.a stage1
@@ -4322,6 +4324,9 @@ stage2-start:
 	 do \
 	   if [ -d stage2/$$dir ] ; then true ; else mkdir stage2/$$dir ; fi ; \
 	 done
+	-rm -f stage2/libgcc.a stage2/libgcov.a stage2/libgcc_eh.a
+	-rm -f stage2/libgcc_s*$(SHLIB_EXT)
+	-rm -f stage2/libunwind.a stage2/libunwind*$(SHLIB_EXT)
 # If SPECS is overridden, make sure it is `installed' as specs.
 	-mv $(SPECS) stage2/specs
 	-mv $(STAGEMOVESTUFF) stage2
@@ -4332,9 +4337,6 @@ stage2-start:
 	-if [ -f as$(exeext) ] ; then (cd stage2 && $(LN_S) ../as$(exeext) .) ; else true ; fi
 	-if [ -f ld$(exeext) ] ; then (cd stage2 && $(LN_S) ../ld$(exeext) .) ; else true ; fi
 	-if [ -f collect-ld$(exeext) ] ; then (cd stage2 && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
-	-rm -f stage2/libgcc.a stage2/libgcov.a stage2/libgcc_eh.a
-	-rm -f stage2/libgcc_s*$(SHLIB_EXT)
-	-rm -f stage2/libunwind.a stage2/libunwind*$(SHLIB_EXT)
 	-cp libgcc.a stage2
 	-$(RANLIB_FOR_TARGET) stage2/libgcc.a
 	-cp libgcov.a stage2
@@ -4357,6 +4359,9 @@ stage3-start:
 	 do \
 	   if [ -d stage3/$$dir ] ; then true ; else mkdir stage3/$$dir ; fi ; \
 	 done
+	-rm -f stage3/libgcc.a stage3/libgcov.a stage3/libgcc_eh.a
+	-rm -f stage3/libgcc_s*$(SHLIB_EXT)
+	-rm -f stage3/libunwind.a stage3/libunwind*$(SHLIB_EXT)
 # If SPECS is overridden, make sure it is `installed' as specs.
 	-mv $(SPECS) stage3/specs
 	-mv $(STAGEMOVESTUFF) stage3
@@ -4367,9 +4372,6 @@ stage3-start:
 	-if [ -f as$(exeext) ] ; then (cd stage3 && $(LN_S) ../as$(exeext) .) ; else true ; fi
 	-if [ -f ld$(exeext) ] ; then (cd stage3 && $(LN_S) ../ld$(exeext) .) ; else true ; fi
 	-if [ -f collect-ld$(exeext) ] ; then (cd stage3 && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
-	-rm -f stage3/libgcc.a stage3/libgcov.a stage3/libgcc_eh.a
-	-rm -f stage3/libgcc_s*$(SHLIB_EXT)
-	-rm -f stage3/libunwind.a stage3/libunwind*$(SHLIB_EXT)
 	-cp libgcc.a stage3
 	-$(RANLIB_FOR_TARGET) stage3/libgcc.a
 	-cp libgcov.a stage3
@@ -4392,6 +4394,9 @@ stage4-start:
 	 do \
 	   if [ -d stage4/$$dir ] ; then true ; else mkdir stage4/$$dir ; fi ; \
 	 done
+	-rm -f stage4/libgcc.a stage4/libgcov.a stage4/libgcc_eh.a
+	-rm -f stage4/libgcc_s*$(SHLIB_EXT)
+	-rm -f stage4/libunwind.a stage4/libunwind*$(SHLIB_EXT)
 # If SPECS is overridden, make sure it is `installed' as specs.
 	-mv $(SPECS) stage4/specs
 	-mv $(STAGEMOVESTUFF) stage4
@@ -4402,9 +4407,6 @@ stage4-start:
 	-if [ -f as$(exeext) ] ; then (cd stage4 && $(LN_S) ../as$(exeext) .) ; else true ; fi
 	-if [ -f ld$(exeext) ] ; then (cd stage4 && $(LN_S) ../ld$(exeext) .) ; else true ; fi
 	-if [ -f collect-ld$(exeext) ] ; then (cd stage4 && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
-	-rm -f stage4/libgcc.a stage4/libgcov.a stage4/libgcc_eh.a
-	-rm -f stage4/libgcc_s*$(SHLIB_EXT)
-	-rm -f stage4/libunwind.a stage4/libunwind*$(SHLIB_EXT)
 	-cp libgcc.a stage4
 	-$(RANLIB_FOR_TARGET) stage4/libgcc.a
 	-cp libgcov.a stage4
@@ -4427,6 +4429,9 @@ stageprofile-start:
 	 do \
 	   if [ -d stageprofile/$$dir ] ; then true ; else mkdir stageprofile/$$dir ; fi ; \
 	 done
+	-rm -f stageprofile/libgcc.a stageprofile/libgcov.a stageprofile/libgcc_eh.a
+	-rm -f stageprofile/libgcc_s*$(SHLIB_EXT)
+	-rm -f stageprofile/libunwind.a stageprofile/libunwind*$(SHLIB_EXT)
 	-mv $(STAGEMOVESTUFF) stageprofile
 	-mv build/* stageprofile/build
 	-cp -p $(STAGECOPYSTUFF) stageprofile
@@ -4435,9 +4440,6 @@ stageprofile-start:
 	-if [ -f as$(exeext) ] ; then (cd stageprofile && $(LN_S) ../as$(exeext) .) ; else true ; fi
 	-if [ -f ld$(exeext) ] ; then (cd stageprofile && $(LN_S) ../ld$(exeext) .) ; else true ; fi
 	-if [ -f collect-ld$(exeext) ] ; then (cd stageprofile && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
-	-rm -f stageprofile/libgcc.a stageprofile/libgcov.a stageprofile/libgcc_eh.a
-	-rm -f stageprofile/libgcc_s*$(SHLIB_EXT)
-	-rm -f stageprofile/libunwind.a stageprofile/libunwind*$(SHLIB_EXT)
 	-cp libgcc.a stageprofile
 	-$(RANLIB_FOR_TARGET) stageprofile/libgcc.a
 	-cp libgcov.a stageprofile
@@ -4460,6 +4462,10 @@ stagefeedback-start:
 	 do \
 	   if [ -d stagefeedback/$$dir ] ; then true ; else mkdir stagefeedback/$$dir ; fi ; \
 	 done
+	-rm -f stagefeedback/libgcc.a stagefeedback/libgcov.a stagefeedback/libgcc_eh.a
+	-rm -f stagefeedback/libgcc_s*$(SHLIB_EXT)
+	-rm -f stagefeedback/libunwind.a stagefeedback/libunwind*$(SHLIB_EXT)
+	-rm -f *.da
 	-mv $(STAGEMOVESTUFF) stagefeedback
 	-mv build/* stagefeedback/build
 	-cp -p $(STAGECOPYSTUFF) stagefeedback
@@ -4468,10 +4474,6 @@ stagefeedback-start:
 	-if [ -f as$(exeext) ] ; then (cd stagefeedback && $(LN_S) ../as$(exeext) .) ; else true ; fi
 	-if [ -f ld$(exeext) ] ; then (cd stagefeedback && $(LN_S) ../ld$(exeext) .) ; else true ; fi
 	-if [ -f collect-ld$(exeext) ] ; then (cd stagefeedback && $(LN_S) ../collect-ld$(exeext) .) ; else true ; fi
-	-rm -f stagefeedback/libgcc.a stagefeedback/libgcov.a stagefeedback/libgcc_eh.a
-	-rm -f stagefeedback/libgcc_s*$(SHLIB_EXT)
-	-rm -f stagefeedback/libunwind.a stagefeedback/libunwind*$(SHLIB_EXT)
-	-rm -f *.da
 	-for dir in fixinc po testsuite $(SUBDIRS); \
 	 do \
 	   rm -f $$dir/*.da ; \
Index: gcc/config.gcc
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config.gcc,v
retrieving revision 1.565
diff -u -p -u -p -r1.565 config.gcc
--- gcc/config.gcc	1 Sep 2005 17:44:37 -0000	1.565
+++ gcc/config.gcc	28 Sep 2005 23:29:18 -0000
@@ -356,9 +356,9 @@ esac
 # Common parts for widely ported systems.
 case ${target} in
 *-*-darwin*)
-  tm_file="${tm_file} darwin.h"
+  tm_file="${tm_file} darwin.h ${cpu_type}/darwin.h"
   tm_p_file="${tm_p_file} darwin-protos.h"
-  tmake_file="t-darwin t-slibgcc-darwin"
+  tmake_file="t-darwin ${cpu_type}/t-darwin t-slibgcc-darwin"
   target_gtfiles="\$(srcdir)/config/darwin.c"
   extra_options="${extra_options} darwin.opt"
   c_target_objs="darwin-c.o"
@@ -949,7 +949,7 @@ hppa[12]*-*-hpux11*)
 	use_collect2=yes
 	;;
 i[34567]86-*-darwin*)
-	tm_file="${tm_file} i386/darwin.h"
+	# All the configuration is presently done generically.
 	;;
 i[34567]86-*-elf*)
 	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h i386/i386elf.h"
@@ -1611,8 +1611,6 @@ powerpc-*-beos*)
 	use_fixproto=yes
 	;;
 powerpc-*-darwin*)
-	tm_file="${tm_file} rs6000/darwin.h"
-	tmake_file="${tmake_file} rs6000/t-darwin"
 	extra_options="${extra_options} rs6000/darwin.opt"
 	case ${target} in
 	  *-darwin1[0-9]* | *-darwin[8-9]*)
Index: gcc/config/darwin.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/darwin.h,v
retrieving revision 1.128
diff -u -p -u -p -r1.128 darwin.h
--- gcc/config/darwin.h	31 Aug 2005 21:43:05 -0000	1.128
+++ gcc/config/darwin.h	28 Sep 2005 23:29:18 -0000
@@ -302,12 +302,17 @@ Boston, MA 02110-1301, USA.  */
 
 #define LIB_SPEC "%{!static:-lSystem}"
 
-/* -dynamiclib implies -shared-libgcc just like -shared would on linux.  */
-#define REAL_LIBGCC_SPEC \
-   "%{static|static-libgcc:-lgcc -lgcc_eh}\
-    %{!static:%{!static-libgcc:\
-      %{!Zdynamiclib:%{!shared-libgcc:-lgcc -lgcc_eh}\
-      %{shared-libgcc:-lgcc_s -lgcc}} %{Zdynamiclib:-lgcc_s -lgcc}}}"
+/* -dynamiclib implies -shared-libgcc just like -shared would on linux.  
+   Support -mmacosx-version-min by supplying different (stub) libgcc_s.dylib
+   libraries to link against.  */
+#undef REAL_LIBGCC_SPEC
+#define REAL_LIBGCC_SPEC						\
+   "%{static|static-libgcc:-lgcc -lgcc_eh;				\
+      :%{shared-libgcc|Zdynamiclib					\
+         :%:version-compare(!> 10.5 mmacosx-version-min= -lgcc_s.10.4)	\
+          %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_s.10.5)	\
+          -lgcc;							\
+         :-lgcc -lgcc_eh}}"
 
 /* We specify crt0.o as -lcrt0.o so that ld will search the library path.  */
 /* We don't want anything to do with crt2.o in the 64-bit case;
Index: gcc/config/t-slibgcc-darwin
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/t-slibgcc-darwin,v
retrieving revision 1.11
diff -u -p -u -p -r1.11 t-slibgcc-darwin
--- gcc/config/t-slibgcc-darwin	16 Jun 2005 22:04:22 -0000	1.11
+++ gcc/config/t-slibgcc-darwin	28 Sep 2005 23:29:18 -0000
@@ -3,7 +3,6 @@ SHLIB_SOVERSION = 1
 SHLIB_VERSTRING = -compatibility_version $(SHLIB_SOVERSION) -current_version $(SHLIB_SOVERSION).0
 SHLIB_EXT = .dylib
 SHLIB_SUFFIX = `if test @multilib_dir@ != . ; then echo _@multilib_dir@ ; fi`
-SHLIB_SOLINK = @shlib_base_name@$(SHLIB_SUFFIX)$(SHLIB_EXT)
 SHLIB_SONAME = @shlib_base_name@$(SHLIB_SUFFIX).$(SHLIB_SOVERSION)$(SHLIB_EXT)
 SHLIB_MAP = @shlib_map_file@
 SHLIB_OBJS = @shlib_objs@
@@ -11,34 +10,62 @@ SHLIB_DIR = @multilib_dir@
 
 # Darwin only searches in /usr/lib for shared libraries, not in subdirectories,
 # so the libgcc variants have different names not different locations.
-
+# Note that this version is used for the loader, not the linker; the linker
+# uses the stub versions named by $(LIBGCC).
 SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -dynamiclib -nodefaultlibs \
 	-Wl,-install_name,$(slibdir)/$(SHLIB_SONAME) \
 	-Wl,-flat_namespace -o $(SHLIB_SONAME).tmp \
 	-Wl,-exported_symbols_list,$(SHLIB_MAP) \
 	$(SHLIB_VERSTRING) \
 	@multilib_flags@ $(SHLIB_OBJS) -lc && \
-	rm -f $(SHLIB_SOLINK) $(SHLIB_DIR)/$(SHLIB_SOLINK) && \
 	if [ -f $(SHLIB_SONAME) ]; then \
 	  mv -f $(SHLIB_SONAME) $(SHLIB_SONAME).backup; \
 	else true; fi && \
-	mv $(SHLIB_SONAME).tmp $(SHLIB_SONAME) && \
-	$(LN_S) $(SHLIB_SONAME) $(SHLIB_SOLINK) && \
-	if [ $(SHLIB_DIR) != . ] ; then \
-	  $(LN_S) `pwd`/$(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK) ; \
-	else true; fi
+	mv $(SHLIB_SONAME).tmp $(SHLIB_SONAME)
+
 # $(slibdir) double quoted to protect it from expansion while building
 # libgcc.mk.  We want this delayed until actual install time.
 SHLIB_INSTALL = \
 	$$(mkinstalldirs) $$(DESTDIR)$$(slibdir); \
 	$(INSTALL_DATA) $(SHLIB_SONAME) \
-	  $$(DESTDIR)$$(slibdir)/$(SHLIB_SONAME); \
-	rm -f $$(DESTDIR)$$(slibdir)/$(SHLIB_SOLINK); \
-	$(LN_S) $(SHLIB_SONAME) \
-	  $$(DESTDIR)$$(slibdir)/$(SHLIB_SOLINK)
+	  $$(DESTDIR)$$(slibdir)/$(SHLIB_SONAME)
+
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
 SHLIB_MKMAP_OPTS = -v leading_underscore=1
 SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
 
 # Must use a different directive for hidden visibility in assembly sources.
 ASM_HIDDEN_OP = .private_extern
+
+# In order to support -mmacosx-version-min, you need to have multiple
+# different libgcc_s libraries that actually get linked against, one for
+# each system version supported.  They are 'stub' libraries that
+# contain no code, just a list of exported symbols.
+# The actual use of the libraries is controlled by REAL_LIBGCC_SPEC.
+# 
+# This assumes only one level of multilibs.  It also assumes each multilib
+# corresponds to a different architecture.
+libgcc_s.%.dylib : $(SHLIB_VERPFX).%.ver libgcc.a
+	for mlib in '' $(MULTILIB_DIRNAMES:%=_%) ; do \
+	  $(STRIP_FOR_TARGET) -o $(@)_T$${mlib} \
+	    -s $(SHLIB_VERPFX).$(*).ver -c -u \
+	    libgcc_s$${mlib}.$(SHLIB_SOVERSION)$(SHLIB_EXT) || exit 1 ; \
+	done
+	$(LIPO_FOR_TARGET) -output $@ -create $(@)_T*
+	# When builting multilibbed target libraries, all the required
+	# libraries are expected to exist in the multilib directory.
+	for mlib in $(MULTILIB_DIRNAMES) ; do \
+	  ln -s ../$@ $${mlib}/$@ || exit 1 ; \
+	done
+	rm $(@)_T*
+
+# From the point-of-view of the Makefiles, libgcc is built by the 'strip'
+# and 'lipo' commands above.
+LIBGCC=libgcc_s.10.4.dylib libgcc_s.10.5.dylib
+
+install-darwin-libgcc-stubs : $(LIBGCC) installdirs
+	for d in $(LIBGCC) ; do \
+	  $(INSTALL_DATA) $$d $(DESTDIR)$(slibdir)/$$d || exit 1 ; \
+	done
+
+INSTALL_LIBGCC += install-darwin-libgcc-stubs
Index: gcc/config/i386/darwin-libgcc.10.4.ver
===================================================================
RCS file: gcc/config/i386/darwin-libgcc.10.4.ver
diff -N gcc/config/i386/darwin-libgcc.10.4.ver
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gcc/config/i386/darwin-libgcc.10.4.ver	28 Sep 2005 23:29:18 -0000
@@ -0,0 +1,81 @@
+__Unwind_Backtrace
+__Unwind_DeleteException
+__Unwind_FindEnclosingFunction
+__Unwind_Find_FDE
+__Unwind_ForcedUnwind
+__Unwind_GetCFA
+__Unwind_GetDataRelBase
+__Unwind_GetGR
+__Unwind_GetIP
+__Unwind_GetLanguageSpecificData
+__Unwind_GetRegionStart
+__Unwind_GetTextRelBase
+__Unwind_RaiseException
+__Unwind_Resume
+__Unwind_Resume_or_Rethrow
+__Unwind_SetGR
+__Unwind_SetIP
+___absvdi2
+___absvsi2
+___addvdi3
+___addvsi3
+___ashldi3
+___ashrdi3
+___clear_cache
+___clzdi2
+___clzsi2
+___cmpdi2
+___ctzdi2
+___ctzsi2
+___deregister_frame
+___deregister_frame_info
+___deregister_frame_info_bases
+___divdc3
+___divdi3
+___divsc3
+___divxc3
+___enable_execute_stack
+___ffsdi2
+___fixdfdi
+___fixsfdi
+___fixunsdfdi
+___fixunsdfsi
+___fixunssfdi
+___fixunssfsi
+___fixunsxfdi
+___fixunsxfsi
+___fixxfdi
+___floatdidf
+___floatdisf
+___floatdixf
+___gcc_personality_v0
+___lshrdi3
+___moddi3
+___muldc3
+___muldi3
+___mulsc3
+___mulvdi3
+___mulvsi3
+___mulxc3
+___negdi2
+___negvdi2
+___negvsi2
+___paritydi2
+___paritysi2
+___popcountdi2
+___popcountsi2
+___powidf2
+___powisf2
+___powixf2
+___register_frame
+___register_frame_info
+___register_frame_info_bases
+___register_frame_info_table
+___register_frame_info_table_bases
+___register_frame_table
+___subvdi3
+___subvsi3
+___ucmpdi2
+___udivdi3
+___udivmoddi4
+___umoddi3
Index: gcc/config/i386/darwin-libgcc.10.5.ver
===================================================================
RCS file: gcc/config/i386/darwin-libgcc.10.5.ver
diff -N gcc/config/i386/darwin-libgcc.10.5.ver
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gcc/config/i386/darwin-libgcc.10.5.ver	28 Sep 2005 23:29:18 -0000
@@ -0,0 +1,81 @@
+__Unwind_Backtrace
+__Unwind_DeleteException
+__Unwind_FindEnclosingFunction
+__Unwind_Find_FDE
+__Unwind_ForcedUnwind
+__Unwind_GetCFA
+__Unwind_GetDataRelBase
+__Unwind_GetGR
+__Unwind_GetIP
+__Unwind_GetLanguageSpecificData
+__Unwind_GetRegionStart
+__Unwind_GetTextRelBase
+__Unwind_RaiseException
+__Unwind_Resume
+__Unwind_Resume_or_Rethrow
+__Unwind_SetGR
+__Unwind_SetIP
+___absvdi2
+___absvsi2
+___addvdi3
+___addvsi3
+___ashldi3
+___ashrdi3
+___clear_cache
+___clzdi2
+___clzsi2
+___cmpdi2
+___ctzdi2
+___ctzsi2
+___deregister_frame
+___deregister_frame_info
+___deregister_frame_info_bases
+___divdc3
+___divdi3
+___divsc3
+___divxc3
+___enable_execute_stack
+___ffsdi2
+___fixdfdi
+___fixsfdi
+___fixunsdfdi
+___fixunsdfsi
+___fixunssfdi
+___fixunssfsi
+___fixunsxfdi
+___fixunsxfsi
+___fixxfdi
+___floatdidf
+___floatdisf
+___floatdixf
+___gcc_personality_v0
+___lshrdi3
+___moddi3
+___muldc3
+___muldi3
+___mulsc3
+___mulvdi3
+___mulvsi3
+___mulxc3
+___negdi2
+___negvdi2
+___negvsi2
+___paritydi2
+___paritysi2
+___popcountdi2
+___popcountsi2
+___powidf2
+___powisf2
+___powixf2
+___register_frame
+___register_frame_info
+___register_frame_info_bases
+___register_frame_info_table
+___register_frame_info_table_bases
+___register_frame_table
+___subvdi3
+___subvsi3
+___ucmpdi2
+___udivdi3
+___udivmoddi4
+___umoddi3
Index: gcc/config/i386/t-darwin
===================================================================
RCS file: gcc/config/i386/t-darwin
diff -N gcc/config/i386/t-darwin
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gcc/config/i386/t-darwin	28 Sep 2005 23:29:18 -0000
@@ -0,0 +1 @@
+SHLIB_VERPFX = $(srcdir)/config/rs6000/darwin-libgcc
Index: gcc/config/rs6000/darwin-libgcc.10.4.ver
===================================================================
RCS file: gcc/config/rs6000/darwin-libgcc.10.4.ver
diff -N gcc/config/rs6000/darwin-libgcc.10.4.ver
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gcc/config/rs6000/darwin-libgcc.10.4.ver	28 Sep 2005 23:29:18 -0000
@@ -0,0 +1,76 @@
+__Unwind_Backtrace
+__Unwind_DeleteException
+__Unwind_FindEnclosingFunction
+__Unwind_Find_FDE
+__Unwind_ForcedUnwind
+__Unwind_GetCFA
+__Unwind_GetDataRelBase
+__Unwind_GetGR
+__Unwind_GetIP
+__Unwind_GetLanguageSpecificData
+__Unwind_GetRegionStart
+__Unwind_GetTextRelBase
+__Unwind_RaiseException
+__Unwind_Resume
+__Unwind_Resume_or_Rethrow
+__Unwind_SetGR
+__Unwind_SetIP
+___absvdi2
+___absvsi2
+___addvdi3
+___addvsi3
+___ashldi3
+___ashrdi3
+___clear_cache
+___clzdi2
+___clzsi2
+___cmpdi2
+___ctzdi2
+___ctzsi2
+___deregister_frame
+___deregister_frame_info
+___deregister_frame_info_bases
+___divdi3
+___enable_execute_stack
+___ffsdi2
+___fixdfdi
+___fixsfdi
+___fixtfdi
+___fixunsdfdi
+___fixunsdfsi
+___fixunssfdi
+___fixunssfsi
+___fixunstfdi
+___floatdidf
+___floatdisf
+___floatditf
+___gcc_personality_v0
+___gcc_qadd
+___gcc_qdiv
+___gcc_qmul
+___gcc_qsub
+___lshrdi3
+___moddi3
+___muldi3
+___mulvdi3
+___mulvsi3
+___negdi2
+___negvdi2
+___negvsi2
+___paritydi2
+___paritysi2
+___popcountdi2
+___popcountsi2
+___register_frame
+___register_frame_info
+___register_frame_info_bases
+___register_frame_info_table
+___register_frame_info_table_bases
+___register_frame_table
+___subvdi3
+___subvsi3
+___trampoline_setup
+___ucmpdi2
+___udivdi3
+___udivmoddi4
+___umoddi3
Index: gcc/config/rs6000/darwin-libgcc.10.5.ver
===================================================================
RCS file: gcc/config/rs6000/darwin-libgcc.10.5.ver
diff -N gcc/config/rs6000/darwin-libgcc.10.5.ver
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gcc/config/rs6000/darwin-libgcc.10.5.ver	28 Sep 2005 23:29:18 -0000
@@ -0,0 +1,85 @@
+__Unwind_Backtrace
+__Unwind_DeleteException
+__Unwind_FindEnclosingFunction
+__Unwind_Find_FDE
+__Unwind_ForcedUnwind
+__Unwind_GetCFA
+__Unwind_GetDataRelBase
+__Unwind_GetGR
+__Unwind_GetIP
+__Unwind_GetLanguageSpecificData
+__Unwind_GetRegionStart
+__Unwind_GetTextRelBase
+__Unwind_RaiseException
+__Unwind_Resume
+__Unwind_Resume_or_Rethrow
+__Unwind_SetGR
+__Unwind_SetIP
+___absvdi2
+___absvsi2
+___addvdi3
+___addvsi3
+___ashldi3
+___ashrdi3
+___clear_cache
+___clzdi2
+___clzsi2
+___cmpdi2
+___ctzdi2
+___ctzsi2
+___deregister_frame
+___deregister_frame_info
+___deregister_frame_info_bases
+___divdc3
+___divdi3
+___divsc3
+___divtc3
+___enable_execute_stack
+___ffsdi2
+___fixdfdi
+___fixsfdi
+___fixtfdi
+___fixunsdfdi
+___fixunsdfsi
+___fixunssfdi
+___fixunssfsi
+___fixunstfdi
+___floatdidf
+___floatdisf
+___floatditf
+___gcc_personality_v0
+___gcc_qadd
+___gcc_qdiv
+___gcc_qmul
+___gcc_qsub
+___lshrdi3
+___moddi3
+___muldc3
+___muldi3
+___mulsc3
+___multc3
+___mulvdi3
+___mulvsi3
+___negdi2
+___negvdi2
+___negvsi2
+___paritydi2
+___paritysi2
+___popcountdi2
+___popcountsi2
+___powidf2
+___powisf2
+___powitf2
+___register_frame
+___register_frame_info
+___register_frame_info_bases
+___register_frame_info_table
+___register_frame_info_table_bases
+___register_frame_table
+___subvdi3
+___subvsi3
+___trampoline_setup
+___ucmpdi2
+___udivdi3
+___udivmoddi4
+___umoddi3
Index: gcc/config/rs6000/darwin.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/darwin.h,v
retrieving revision 1.92
diff -u -p -u -p -r1.92 darwin.h
--- gcc/config/rs6000/darwin.h	24 Aug 2005 18:22:11 -0000	1.92
+++ gcc/config/rs6000/darwin.h	28 Sep 2005 23:29:18 -0000
@@ -392,14 +392,6 @@ do {									\
     } \
   while (0)
 
-/* Just like config/darwin.h's REAL_LIBGCC_SPEC, but use -lgcc_s_ppc64 for
-   -m64.  */
-#undef REAL_LIBGCC_SPEC
-#define REAL_LIBGCC_SPEC						\
-   "%{static|static-libgcc:-lgcc -lgcc_eh;				\
-      :%{shared-libgcc|Zdynamiclib:%{m64:-lgcc_s_ppc64;:-lgcc_s} -lgcc;	\
-         :-lgcc -lgcc_eh}}"
-
 #ifdef IN_LIBGCC2
 #include <stdbool.h>
 #endif
Index: gcc/config/rs6000/t-darwin
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/t-darwin,v
retrieving revision 1.18
diff -u -p -u -p -r1.18 t-darwin
--- gcc/config/rs6000/t-darwin	2 Apr 2005 09:48:31 -0000	1.18
+++ gcc/config/rs6000/t-darwin	28 Sep 2005 23:29:19 -0000
@@ -19,6 +19,8 @@ TARGET_LIBGCC2_CFLAGS = -Wa,-force_cpusu
 # Export the _xlq* symbols from darwin-ldouble.c.
 SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-ppc64.ver
 
+SHLIB_VERPFX = $(srcdir)/config/rs6000/darwin-libgcc
+
 LIB2ADDEH += $(srcdir)/config/rs6000/darwin-fallback.c
 
 darwin-fpsave.o:	$(srcdir)/config/rs6000/darwin-asm.h
============================================================


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]