diff --git a/gcc/config/darwin-driver.c b/gcc/config/darwin-driver.c
index db8d72c..f80c9ed 100644
--- a/gcc/config/darwin-driver.c
+++ b/gcc/config/darwin-driver.c
@@ -73,7 +73,8 @@ darwin_find_version_from_kernel (void)
      component.  */
   if (major_vers - 4 <= 4)
     /* On 10.4 and earlier, the old linker is used which does not
-       support three-component system versions.  */
+       support three-component system versions.
+       FIXME: we should not assume this - a newer linker could be used.  */
     asprintf (&new_flag, "10.%d", major_vers - 4);
   else
     asprintf (&new_flag, "10.%d.%s", major_vers - 4, minor_vers);
@@ -294,4 +295,29 @@ darwin_driver_init (unsigned int *decoded_options_count,
 			  &(*decoded_options)[*decoded_options_count - 1]);
 	}
     }
+  /* Create and push the major version for assemblers that need it.  */
+  if (vers_string != NULL)
+    {
+      char *asm_major = NULL;
+      char *first_period = strchr(vers_string, '.');
+      if (first_period != NULL)
+	{
+	  char *second_period = strchr(first_period+1, '.');
+	  if (second_period  != NULL)
+	    asm_major = xstrndup (vers_string, second_period-vers_string);
+	  else
+	    asm_major = xstrdup (vers_string);
+        }
+      /* Else we appear to have a weird macosx version with no major number.
+         Punt on this for now.  */
+      if (asm_major != NULL)
+        {
+	  ++*decoded_options_count;
+	  *decoded_options = XRESIZEVEC (struct cl_decoded_option,
+					 *decoded_options,
+					 *decoded_options_count);
+	  generate_option (OPT_asm_macosx_version_min_, asm_major, 1, CL_DRIVER,
+			  &(*decoded_options)[*decoded_options_count - 1]);
+        }
+    }
 }
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index 79fc506..374034e 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -399,10 +399,27 @@ extern GTY(()) int darwin_ms_struct;
    %:version-compare(>< 10.6 10.8 mmacosx-version-min= -lcrt1.10.6.o)	\
    %{fgnu-tm: -lcrttms.o}"
 
-/* Default Darwin ASM_SPEC, very simple.  */
+#ifdef HAVE_AS_MMACOSX_VERSION_MIN_OPTION
+/* Emit macosx version (but only major).  */
+#define ASM_MMACOSX_VERSION_MIN_SPEC \
+  " %{asm_macosx_version_min=*: -mmacosx-version-min=%*} %<asm_macosx_version_min=*"
+#else
+#define ASM_MMACOSX_VERSION_MIN_SPEC " %<asm_macosx_version_min=*"
+#endif
+
+/* When we detect that we're cctools or llvm as, we need to insert the right
+   additional options.  */
+#if HAVE_GNU_AS
+#define ASM_OPTIONS ""
+#else
+#define ASM_OPTIONS "%{v} %{w:-W} %{I*}"
+#endif
+
+/* Default Darwin ASM_SPEC, very simple. */
 #define ASM_SPEC "-arch %(darwin_arch) \
+  " ASM_OPTIONS " \
   %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \
-  %{static}"
+  %{static}" ASM_MMACOSX_VERSION_MIN_SPEC
 
 /* Default ASM_DEBUG_SPEC.  Darwin's as cannot currently produce dwarf
    debugging data.  */
diff --git a/gcc/config/darwin.opt b/gcc/config/darwin.opt
index 7f2e394..25459e0 100644
--- a/gcc/config/darwin.opt
+++ b/gcc/config/darwin.opt
@@ -37,6 +37,9 @@ Driver RejectNegative Separate
 arch_errors_fatal
 Driver Alias(Zarch_errors_fatal)
 
+asm_macosx_version_min=
+Driver RejectNegative Joined
+
 bind_at_load
 Driver Alias(Zbind_at_load)
 
diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h
index c10ceff..705fdf2 100644
--- a/gcc/config/i386/darwin.h
+++ b/gcc/config/i386/darwin.h
@@ -112,8 +112,9 @@ extern int darwin_emit_branch_islands;
   DARWIN_CC1_SPEC
 
 #undef ASM_SPEC
-#define ASM_SPEC "-arch %(darwin_arch) -force_cpusubtype_ALL \
-  %{static}"
+#define ASM_SPEC "-arch %(darwin_arch) \
+  " ASM_OPTIONS " -force_cpusubtype_ALL \
+  %{static}" ASM_MMACOSX_VERSION_MIN_SPEC
 
 #define DARWIN_ARCH_SPEC "%{m64:x86_64;:i386}"
 #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 1783a39..63b556a 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -3692,6 +3692,20 @@ AC_DEFINE_UNQUOTED(HAVE_LTO_PLUGIN, $gcc_cv_lto_plugin,
   [Define to the level of your linker's plugin support.])
 AC_MSG_RESULT($gcc_cv_lto_plugin)
 
+# Target OS-specific assembler checks.
+
+case "$target_os" in
+  darwin*)
+    gcc_GAS_CHECK_FEATURE([-mmacosx-version-min option],
+      gcc_cv_as_mmacosx_version_min,,
+      [-mmacosx-version-min=10.1], [.text],,
+      [AC_DEFINE(HAVE_AS_MMACOSX_VERSION_MIN_OPTION, 1,
+	[Define if your Mac OS X assembler supports the -mmacos-version-min option.])])
+    ;;
+esac
+
+# Target CPU-specific assembler checks.
+
 case "$target" in
   aarch64*-*-*)
     gcc_GAS_CHECK_FEATURE([-mabi option], gcc_cv_as_aarch64_mabi,,
diff --git a/gcc/testsuite/gcc.dg/darwin-minversion-1.c b/gcc/testsuite/gcc.dg/darwin-minversion-1.c
index 6221d61..ee6493a 100644
--- a/gcc/testsuite/gcc.dg/darwin-minversion-1.c
+++ b/gcc/testsuite/gcc.dg/darwin-minversion-1.c
@@ -1,11 +1,11 @@
 /* Basic test for -mmacosx-version-min switch on Darwin.  */
-/* { dg-options "-mmacosx-version-min=10.1" } */
+/* { dg-options "-mmacosx-version-min=10.5" } */
 /* { dg-do run { target *-*-darwin* } } */
 
 int
 main ()
 {
-#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1010
+#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1050
   fail me;
 #endif
   return 0;
diff --git a/gcc/testsuite/gcc.dg/darwin-minversion-2.c b/gcc/testsuite/gcc.dg/darwin-minversion-2.c
index 8e18d52..46fab67 100644
--- a/gcc/testsuite/gcc.dg/darwin-minversion-2.c
+++ b/gcc/testsuite/gcc.dg/darwin-minversion-2.c
@@ -1,11 +1,11 @@
 /* Basic test for -mmacosx-version-min switch on Darwin.  */
-/* { dg-options "-mmacosx-version-min=10.1 -mmacosx-version-min=10.3" } */
+/* { dg-options "-mmacosx-version-min=10.1 -mmacosx-version-min=10.5" } */
 /* { dg-do run { target *-*-darwin* } } */
 
 int
 main ()
 {
-#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1030
+#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1050
   fail me;
 #endif
   return 0;
diff --git a/gcc/testsuite/gcc.dg/darwin-minversion-3.c b/gcc/testsuite/gcc.dg/darwin-minversion-3.c
index d1795e7..a2be54f 100644
--- a/gcc/testsuite/gcc.dg/darwin-minversion-3.c
+++ b/gcc/testsuite/gcc.dg/darwin-minversion-3.c
@@ -1,11 +1,11 @@
 /* Test that most minor versions less than 10 work.  */
-/* { dg-options "-mmacosx-version-min=10.4.1" } */
+/* { dg-options "-mmacosx-version-min=10.5.8" } */
 /* { dg-do compile { target *-*-darwin* } } */
 
 int
 main ()
 {
-#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1041
+#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1058
   fail me;
 #endif
   return 0;
diff --git a/libgcc/config/t-darwin b/libgcc/config/t-darwin
index a69169f..13ca6ed 100644
--- a/libgcc/config/t-darwin
+++ b/libgcc/config/t-darwin
@@ -1,3 +1,7 @@
+# Set this as a minimum (unless overriden by arch t-files) since it's a
+# reasonable lowest common denominator that works for all our archs.
+HOST_LIBGCC2_CFLAGS += -mmacosx-version-min=10.5
+
 crt3.o: $(srcdir)/config/darwin-crt3.c
 	$(crt_compile) $(DARWIN_EXTRA_CRT_BUILD_CFLAGS) -c $<
 
