diff --git a/gcc/testsuite/lib/obj-c++.exp b/gcc/testsuite/lib/obj-c++.exp
index 397b70cb96a..854dc264f9d 100644
--- a/gcc/testsuite/lib/obj-c++.exp
+++ b/gcc/testsuite/lib/obj-c++.exp
@@ -110,34 +110,43 @@ proc obj-c++_link_flags { paths } {
     set shlib_ext [get_shlib_extension]
     verbose "shared lib extension: $shlib_ext"
 
+    # We need to add options to locate libobjc/libobjc-gnu and libstdc++
+    # Usually '-L' options are added to point to the relevant directories for
+    # the uninstalled libraries.
+
+    # In cases where libraries are available as both shared and convenience
+    # some additional checks are made.
+
+    # For some targets -static-xxxx options are handled by specs substitution
+    # and need a '-B' option rather than '-L'.  For Darwin, when embedded
+    # runpaths are in use (the default for all versions after macOS 10.11),
+    # '-B' is also needed to provide the runpath.
+    # When '-B' is used, this results in a '-L' for each path that exists (so
+    # that appending a '-L' as well is a needless duplicate).  There are also
+    # cases where tools warn for duplicates, leading to spurious fails.
+    # Therefore the objective of the code below is to add just one '-L' or
+    # '-B' for each of the libraries.
+
+    set target_wants_B_option 0
+    if { [istarget *-*-darwin9* ] || [istarget *-*-darwin\[12\]* ] } {
+      set target_wants_B_option 1
+    }
+
     if { $gccpath != "" } {
-      if [file exists "${gccpath}/lib/libstdc++.a"] {
-          append ld_library_path ":${gccpath}/lib"
-      }
-      if [file exists "${gccpath}/libg++/libg++.a"] {
-          append flags " -L${gccpath}/libg++ "
-          append ld_library_path ":${gccpath}/libg++"
-      }
-      if [file exists "${gccpath}/libstdc++/libstdc++.a"] {
-          append flags " -L${gccpath}/libstdc++ "
-          append ld_library_path ":${gccpath}/libstdc++"
-      }
-      if [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.a"] {
-          # Allow for %s spec substitutions
-          append flags " -B${gccpath}/libstdc++-v3/src/.libs "
-          append flags " -L${gccpath}/libstdc++-v3/src/.libs "
-          append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
-      }
-      # Look for libstdc++.${shlib_ext}.
-      if [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.${shlib_ext}"] {
-	  # Allow for %s spec substitutions
-	  append flags " -B${gccpath}/libstdc++-v3/src/.libs "
-	  append flags " -L${gccpath}/libstdc++-v3/src/.libs "
-	  append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
+      if { [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.a"] ||
+	  [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.${shlib_ext}"] } {
+		if { $target_wants_B_option } {
+		    append flags "-B${gccpath}/libstdc++-v3/src/.libs "
+		} else {
+		    append flags "-L${gccpath}/libstdc++-v3/src/.libs "
+		}
+		append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
       }
+
       if [file exists "${gccpath}/libiberty/libiberty.a"] {
           append flags " -L${gccpath}/libiberty "
       }
+
       if [file exists "${gccpath}/librx/librx.a"] {
           append flags " -L${gccpath}/librx "
       }
@@ -159,9 +168,11 @@ proc obj-c++_link_flags { paths } {
 
       if { $libobjc_dir != "" } {
 	  set libobjc_dir [file dirname ${libobjc_dir}]
-	  # Allow for %s spec substitutions
-	  append flags " -B${libobjc_dir} "
-	  append flags " -L${libobjc_dir} "
+	  if { $target_wants_B_option } {
+	    append flags "-B${libobjc_dir} "
+	  } else {
+	    append flags "-L${libobjc_dir} "
+	  }
 	  append ld_library_path ":${libobjc_dir}"
       }
       append ld_library_path \
@@ -176,7 +187,11 @@ proc obj-c++_link_flags { paths } {
       }
       set libstdcpp [lookfor_file ${tool_root_dir} libstdc++];
       if { $libstdcpp != "" } {
-          append flags "-L${libstdcpp} ";
+	  if { $target_wants_B_option } {
+	    append flags "-B${libstdcpp} "
+	  } else {
+	    append flags "-L${libstdcpp} "
+	  }
           append ld_library_path ":${libstdcpp}"
       }
       set libiberty [lookfor_file ${tool_root_dir} libiberty];
