diff --git a/cc/private/toolchain/libtool_check_unique.cc b/cc/private/toolchain/libtool_check_unique.cc
new file mode 100644
index 0000000..b90aa59
--- /dev/null
+++ b/cc/private/toolchain/libtool_check_unique.cc
@@ -0,0 +1,74 @@
+// Copyright 2020 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstdlib>
+#include <fstream>
+#include <iostream>
+#include <regex>  // NOLINT
+#include <unordered_set>
+
+using std::ifstream;
+using std::regex;
+using std::string;
+using std::unordered_set;
+
+string getBasename(const string &path) {
+  // Assumes we're on an OS with "/" as the path separator
+  auto idx = path.find_last_of("/");
+  if (idx == string::npos) {
+    return path;
+  }
+  return path.substr(idx + 1);
+}
+
+// Returns 0 if there are no duplicate basenames in the object files (both via
+// -filelist as well as shell args), 1 otherwise
+int main(int argc, const char *argv[]) {
+  unordered_set<string> basenames;
+  const regex libRegex = regex(".*\\.a$");
+  const regex noArgFlags =
+      regex("-static|-s|-a|-c|-L|-T|-D|-no_warning_for_no_symbols");
+  const regex singleArgFlags = regex("-arch_only|-syslibroot|-o");
+  // Set i to 1 to skip executable path
+  for (int i = 1; argv[i] != nullptr; i++) {
+    const string arg = argv[i];
+    if (arg == "-filelist") {
+      ifstream list(argv[i + 1]);
+      for (string line; getline(list, line);) {
+        const string basename = getBasename(line);
+        const auto pair = basenames.insert(basename);
+        if (!pair.second) {
+          return EXIT_FAILURE;
+        }
+      }
+      list.close();
+      i++;
+    } else if (regex_match(arg, noArgFlags)) {
+    } else if (regex_match(arg, singleArgFlags)) {
+      i++;
+    } else if (arg[0] == '-') {
+      return EXIT_FAILURE;
+      // Unrecognized flag, let the wrapper deal with it
+    } else if (regex_match(arg, libRegex)) {
+      // Archive inputs can remain untouched, as they come from other targets.
+    } else {
+      const string basename = getBasename(arg);
+      const auto pair = basenames.insert(basename);
+      if (!pair.second) {
+        return EXIT_FAILURE;
+      }
+    }
+  }
+  return EXIT_SUCCESS;
+}
diff --git a/cc/private/toolchain/osx_cc_configure.bzl b/cc/private/toolchain/osx_cc_configure.bzl
index 29c95e5..845a1f2 100644
--- a/cc/private/toolchain/osx_cc_configure.bzl
+++ b/cc/private/toolchain/osx_cc_configure.bzl
@@ -49,6 +49,33 @@
     include_dirs.append("/Applications/")
     return include_dirs
 
+def compile_cc_file(repository_ctx, src_name, out_name):
+    xcrun_result = repository_ctx.execute([
+        "env",
+        "-i",
+        "xcrun",
+        "--sdk",
+        "macosx",
+        "clang",
+        "-mmacosx-version-min=10.9",
+        "-std=c++11",
+        "-lc++",
+        "-o",
+        out_name,
+        src_name,
+    ], 30)
+    if (xcrun_result.return_code != 0):
+        error_msg = (
+            "return code {code}, stderr: {err}, stdout: {out}"
+        ).format(
+            code = xcrun_result.return_code,
+            err = xcrun_result.stderr,
+            out = xcrun_result.stdout,
+        )
+        fail(out_name + " failed to generate. Please file an issue at " +
+             "https://github.com/bazelbuild/bazel/issues with the following:\n" +
+             error_msg)
+
 def configure_osx_toolchain(repository_ctx, overriden_tools):
     """Configure C++ toolchain on macOS.
 
@@ -58,6 +85,7 @@
     """
     paths = resolve_labels(repository_ctx, [
         "@rules_cc//cc/private/toolchain:osx_cc_wrapper.sh.tpl",
+        "@rules_cc//cc/private/toolchain:libtool_check_unique.cc",
         "@bazel_tools//tools/objc:libtool.sh",
         "@bazel_tools//tools/objc:make_hashed_objlist.py",
         "@bazel_tools//tools/objc:xcrunwrapper.sh",
@@ -87,11 +115,13 @@
         # into the Objective-C crosstool actions, anyway, so this ensures that
         # the C++ actions behave consistently.
         cc = repository_ctx.path("wrapped_clang")
+
+        cc_path = '"$(/usr/bin/dirname "$0")"/wrapped_clang'
         repository_ctx.template(
             "cc_wrapper.sh",
             paths["@rules_cc//cc/private/toolchain:osx_cc_wrapper.sh.tpl"],
             {
-                "%{cc}": escape_string(str(cc)),
+                "%{cc}": escape_string(cc_path),
                 "%{env}": escape_string(get_env(repository_ctx)),
             },
         )
@@ -111,36 +141,15 @@
             paths["@bazel_tools//tools/osx/crosstool:cc_toolchain_config.bzl"],
             "cc_toolchain_config.bzl",
         )
+        libtool_check_unique_src_path = str(repository_ctx.path(
+            paths["@rules_cc//cc/private/toolchain:libtool_check_unique.cc"],
+        ))
+        compile_cc_file(repository_ctx, libtool_check_unique_src_path, "libtool_check_unique")
         wrapped_clang_src_path = str(repository_ctx.path(
             paths["@bazel_tools//tools/osx/crosstool:wrapped_clang.cc"],
         ))
-        xcrun_result = repository_ctx.execute([
-            "env",
-            "-i",
-            "xcrun",
-            "--sdk",
-            "macosx",
-            "clang",
-            "-mmacosx-version-min=10.9",
-            "-std=c++11",
-            "-lc++",
-            "-o",
-            "wrapped_clang",
-            wrapped_clang_src_path,
-        ], 30)
-        if (xcrun_result.return_code == 0):
-            repository_ctx.symlink("wrapped_clang", "wrapped_clang_pp")
-        else:
-            error_msg = (
-                "return code {code}, stderr: {err}, stdout: {out}"
-            ).format(
-                code = xcrun_result.return_code,
-                err = xcrun_result.stderr,
-                out = xcrun_result.stdout,
-            )
-            fail("wrapped_clang failed to generate. Please file an issue at " +
-                 "https://github.com/bazelbuild/bazel/issues with the following:\n" +
-                 error_msg)
+        compile_cc_file(repository_ctx, wrapped_clang_src_path, "wrapped_clang")
+        repository_ctx.symlink("wrapped_clang", "wrapped_clang_pp")
 
         tool_paths = {}
         gcov_path = repository_ctx.os.environ.get("GCOV")
