diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index ad6bba3..4a5b1e6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -50,7 +50,6 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
-import com.google.devtools.build.lib.rules.cpp.LinkerInputs.SolibLibraryToLink;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.FileTypeSet;
@@ -326,52 +325,6 @@
       ccLinkingOutputs = linkingHelper.link(ccCompilationOutputs);
     }
 
-    /*
-     * Add the libraries from srcs, if any. For static/mostly static
-     * linking we setup the dynamic libraries if there are no static libraries
-     * to choose from. Path to the libraries will be mangled to avoid using
-     * absolute path names on the -rpath, but library filenames will be
-     * preserved (since some libraries might have SONAME tag) - symlink will
-     * be created to the parent directory instead.
-     *
-     * For compatibility with existing BUILD files, any ".a" or ".lo" files listed in
-     * srcs are assumed to be position-independent code, or at least suitable for
-     * inclusion in shared libraries, unless they end with ".nopic.a" or ".nopic.lo".
-     *
-     * Note that some target platforms do not require shared library code to be PIC.
-     */
-    ImmutableList<LinkerInputs.LibraryToLink> precompiledStaticLibraries =
-        ImmutableList.<LinkerInputs.LibraryToLink>builder()
-            .addAll(
-                LinkerInputs.opaqueLibrariesToLink(
-                    ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getStaticLibraries()))
-            .addAll(
-                LinkerInputs.opaqueLibrariesToLink(
-                    ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY,
-                    precompiledFiles.getAlwayslinkStaticLibraries()))
-            .build();
-
-    ImmutableList<LinkerInputs.LibraryToLink> precompiledPicStaticLibraries =
-        ImmutableList.<LinkerInputs.LibraryToLink>builder()
-            .addAll(
-                LinkerInputs.opaqueLibrariesToLink(
-                    ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getPicStaticLibraries()))
-            .addAll(
-                LinkerInputs.opaqueLibrariesToLink(
-                    ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY,
-                    precompiledFiles.getPicAlwayslinkLibraries()))
-            .build();
-
-    List<LinkerInputs.LibraryToLink> dynamicLibraries =
-        ImmutableList.copyOf(
-            Iterables.transform(
-                precompiledFiles.getSharedLibraries(),
-                library ->
-                    LinkerInputs.solibLibraryToLink(
-                        common.getDynamicLibrarySymlink(library, true),
-                        library,
-                        CcLinkingOutputs.libraryIdentifierOf(library))));
-
     ImmutableSortedMap.Builder<String, NestedSet<Artifact>> outputGroups =
         ImmutableSortedMap.naturalOrder();
     if (!ccLinkingOutputs.isEmpty()) {
@@ -385,10 +338,7 @@
     }
     List<LibraryToLink> precompiledLibraries =
         convertPrecompiledLibrariesToLibraryToLink(
-            ruleContext.getFragment(CppConfiguration.class).forcePic(),
-            precompiledStaticLibraries,
-            precompiledPicStaticLibraries,
-            dynamicLibraries);
+            common, ruleContext.getFragment(CppConfiguration.class).forcePic(), precompiledFiles);
 
     if (!ccCompilationOutputs.isEmpty()) {
       checkIfLinkOutputsCollidingWithPrecompiledFiles(
@@ -708,94 +658,112 @@
     return ccCompilationOutputsIsEmpty && !ccLinkingOutputsIsEmpty;
   }
 
+  private static Map<String, Artifact> buildMapIdentifierToArtifact(Iterable<Artifact> artifacts) {
+    ImmutableMap.Builder<String, Artifact> libraries = ImmutableMap.builder();
+    for (Artifact artifact : artifacts) {
+      libraries.put(CcLinkingOutputs.libraryIdentifierOf(artifact), artifact);
+    }
+    return libraries.build();
+  }
+
+  /*
+   * Add the libraries from srcs, if any. For static/mostly static
+   * linking we setup the dynamic libraries if there are no static libraries
+   * to choose from. Path to the libraries will be mangled to avoid using
+   * absolute path names on the -rpath, but library filenames will be
+   * preserved (since some libraries might have SONAME tag) - symlink will
+   * be created to the parent directory instead.
+   *
+   * For compatibility with existing BUILD files, any ".a" or ".lo" files listed in
+   * srcs are assumed to be position-independent code, or at least suitable for
+   * inclusion in shared libraries, unless they end with ".nopic.a" or ".nopic.lo".
+   *
+   * Note that some target platforms do not require shared library code to be PIC.
+   */
   private static List<LibraryToLink> convertPrecompiledLibrariesToLibraryToLink(
-      boolean forcePic,
-      List<LinkerInputs.LibraryToLink> staticLibraries,
-      List<LinkerInputs.LibraryToLink> picStaticLibraries,
-      List<LinkerInputs.LibraryToLink> dynamicLibrariesForRuntime) {
+      CcCommon common, boolean forcePic, PrecompiledFiles precompiledFiles) {
     ImmutableList.Builder<LibraryToLink> librariesToLink = ImmutableList.builder();
 
+    Map<String, Artifact> staticLibraries =
+        buildMapIdentifierToArtifact(precompiledFiles.getStaticLibraries());
+    Map<String, Artifact> picStaticLibraries =
+        buildMapIdentifierToArtifact(precompiledFiles.getPicStaticLibraries());
+    Map<String, Artifact> alwayslinkStaticLibraries =
+        buildMapIdentifierToArtifact(precompiledFiles.getAlwayslinkStaticLibraries());
+    Map<String, Artifact> alwayslinkPicStaticLibraries =
+        buildMapIdentifierToArtifact(precompiledFiles.getPicAlwayslinkLibraries());
+    Map<String, Artifact> dynamicLibraries =
+        buildMapIdentifierToArtifact(precompiledFiles.getSharedLibraries());
+
     Set<String> identifiersUsed = new HashSet<>();
-    // Here we hae an O(n^2) algorithm, the size of the inputs is never big though, we only work
-    // here with the local libraries, none of the libraries of the transitive closure.
-    for (LinkerInputs.LibraryToLink staticLibrary : staticLibraries) {
+    for (Map.Entry<String, Artifact> staticLibraryEntry :
+        Iterables.concat(staticLibraries.entrySet(), alwayslinkStaticLibraries.entrySet())) {
       LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
-      String identifier = staticLibrary.getLibraryIdentifier();
+      String identifier = staticLibraryEntry.getKey();
       libraryToLinkBuilder.setLibraryIdentifier(identifier);
-      List<LinkerInputs.LibraryToLink> sameIdentifierPicStaticLibraries =
-          picStaticLibraries.stream()
-              .filter(x -> x.getLibraryIdentifier().equals(identifier))
-              .collect(ImmutableList.toImmutableList());
-      boolean hadPic = false;
-      if (!sameIdentifierPicStaticLibraries.isEmpty()) {
-        hadPic = true;
-        libraryToLinkBuilder.setPicStaticLibrary(
-            sameIdentifierPicStaticLibraries.get(0).getArtifact());
-      }
-      if (!forcePic || !hadPic) {
-        libraryToLinkBuilder.setStaticLibrary(staticLibrary.getArtifact());
-      }
-      List<LinkerInputs.LibraryToLink> sameIdentifierDynamicLibraries =
-          dynamicLibrariesForRuntime.stream()
-              .filter(x -> x.getLibraryIdentifier().equals(identifier))
-              .collect(ImmutableList.toImmutableList());
-      if (!sameIdentifierDynamicLibraries.isEmpty()) {
-        LinkerInputs.LibraryToLink dynamicLibrary = sameIdentifierDynamicLibraries.get(0);
-        libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
-        if (dynamicLibrary instanceof SolibLibraryToLink) {
-          libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
-              dynamicLibrary.getOriginalLibraryArtifact());
+      boolean hasPic = picStaticLibraries.containsKey(identifier);
+      boolean hasAlwaysPic = alwayslinkPicStaticLibraries.containsKey(identifier);
+      if (hasPic || hasAlwaysPic) {
+        Artifact picStaticLibrary = null;
+        if (hasPic) {
+          picStaticLibrary = picStaticLibraries.get(identifier);
+        } else {
+          picStaticLibrary = alwayslinkPicStaticLibraries.get(identifier);
         }
+        libraryToLinkBuilder.setPicStaticLibrary(picStaticLibrary);
       }
-      libraryToLinkBuilder.setAlwayslink(
-          staticLibrary.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY);
+      if (!forcePic || !(hasPic || hasAlwaysPic)) {
+        libraryToLinkBuilder.setStaticLibrary(staticLibraryEntry.getValue());
+      }
+      if (dynamicLibraries.containsKey(identifier)) {
+        Artifact library = dynamicLibraries.get(identifier);
+        Artifact symlink = common.getDynamicLibrarySymlink(library, true);
+        libraryToLinkBuilder.setDynamicLibrary(symlink);
+        libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(library);
+      }
+      libraryToLinkBuilder.setAlwayslink(alwayslinkStaticLibraries.containsKey(identifier));
       identifiersUsed.add(identifier);
       librariesToLink.add(libraryToLinkBuilder.build());
     }
 
-    for (LinkerInputs.LibraryToLink picStaticLibrary : picStaticLibraries) {
-      String identifier = picStaticLibrary.getLibraryIdentifier();
+    for (Map.Entry<String, Artifact> picStaticLibraryEntry :
+        Iterables.concat(picStaticLibraries.entrySet(), alwayslinkPicStaticLibraries.entrySet())) {
+      String identifier = picStaticLibraryEntry.getKey();
       if (identifiersUsed.contains(identifier)) {
         continue;
       }
       LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
-      libraryToLinkBuilder.setPicStaticLibrary(picStaticLibrary.getArtifact());
       libraryToLinkBuilder.setLibraryIdentifier(identifier);
-      List<LinkerInputs.LibraryToLink> sameIdentifierDynamicLibraries =
-          dynamicLibrariesForRuntime.stream()
-              .filter(x -> x.getLibraryIdentifier().equals(identifier))
-              .collect(ImmutableList.toImmutableList());
-      if (!sameIdentifierDynamicLibraries.isEmpty()) {
-        LinkerInputs.LibraryToLink dynamicLibrary = sameIdentifierDynamicLibraries.get(0);
-        libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
-        if (dynamicLibrary instanceof SolibLibraryToLink) {
-          libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
-              dynamicLibrary.getOriginalLibraryArtifact());
-        }
+      libraryToLinkBuilder.setPicStaticLibrary(picStaticLibraryEntry.getValue());
+      if (dynamicLibraries.containsKey(identifier)) {
+        Artifact library = dynamicLibraries.get(identifier);
+        Artifact symlink = common.getDynamicLibrarySymlink(library, true);
+        libraryToLinkBuilder.setDynamicLibrary(symlink);
+        libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(library);
       }
-      libraryToLinkBuilder.setAlwayslink(
-          picStaticLibrary.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY);
+      libraryToLinkBuilder.setAlwayslink(alwayslinkPicStaticLibraries.containsKey(identifier));
       identifiersUsed.add(identifier);
       librariesToLink.add(libraryToLinkBuilder.build());
     }
 
-    for (LinkerInputs.LibraryToLink dynamicLibrary : dynamicLibrariesForRuntime) {
-      String identifier = dynamicLibrary.getLibraryIdentifier();
+    for (Map.Entry<String, Artifact> dynamicLibraryEntry : dynamicLibraries.entrySet()) {
+      String identifier = dynamicLibraryEntry.getKey();
       if (identifiersUsed.contains(identifier)) {
         continue;
       }
       LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
-      libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
       libraryToLinkBuilder.setLibraryIdentifier(identifier);
-      if (dynamicLibrary instanceof SolibLibraryToLink) {
-        libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
-            dynamicLibrary.getOriginalLibraryArtifact());
-      }
+      Artifact library = dynamicLibraryEntry.getValue();
+      Artifact symlink = common.getDynamicLibrarySymlink(library, true);
+      libraryToLinkBuilder.setDynamicLibrary(symlink);
+      libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(library);
       librariesToLink.add(libraryToLinkBuilder.build());
     }
     return librariesToLink.build();
   }
 
+
+
   private static void checkIfLinkOutputsCollidingWithPrecompiledFiles(
       RuleContext ruleContext,
       CcLinkingOutputs ccLinkingOutputs,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index 47086bd..67db9ed 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -29,6 +29,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
@@ -668,7 +669,7 @@
     if (shouldLinkTransitively) {
       CcLinkingContext ccLinkingContext = CcLinkingContext.merge(ccLinkingContexts);
       List<LinkerInputs.LibraryToLink> libraries =
-          LibraryToLink.convertLibraryToLinkListToLibraryToLinkList(
+          convertLibraryToLinkListToLinkerInputList(
               ccLinkingContext.getLibraries(),
               linkingMode != LinkingMode.DYNAMIC,
               dynamicLinkType.isDynamicLibrary());
@@ -820,4 +821,65 @@
 
     return result;
   }
+
+  private static List<LinkerInputs.LibraryToLink> convertLibraryToLinkListToLinkerInputList(
+      NestedSet<LibraryToLink> librariesToLink, boolean staticMode, boolean forDynamicLibrary) {
+    ImmutableList.Builder<LinkerInputs.LibraryToLink> librariesToLinkBuilder =
+        ImmutableList.builder();
+    for (LibraryToLink libraryToLink : librariesToLink) {
+      LinkerInputs.LibraryToLink staticLibraryToLink =
+          libraryToLink.getStaticLibrary() == null ? null : libraryToLink.getStaticLibraryToLink();
+      LinkerInputs.LibraryToLink picStaticLibraryToLink =
+          libraryToLink.getPicStaticLibrary() == null
+              ? null
+              : libraryToLink.getPicStaticLibraryToLink();
+      LinkerInputs.LibraryToLink libraryToLinkToUse = null;
+      if (staticMode) {
+        if (forDynamicLibrary) {
+          if (picStaticLibraryToLink != null) {
+            libraryToLinkToUse = picStaticLibraryToLink;
+          } else if (staticLibraryToLink != null) {
+            libraryToLinkToUse = staticLibraryToLink;
+          }
+        } else {
+          if (staticLibraryToLink != null) {
+            libraryToLinkToUse = staticLibraryToLink;
+          } else if (picStaticLibraryToLink != null) {
+            libraryToLinkToUse = picStaticLibraryToLink;
+          }
+        }
+        if (libraryToLinkToUse == null) {
+          if (libraryToLink.getInterfaceLibrary() != null) {
+            libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
+          } else if (libraryToLink.getDynamicLibrary() != null) {
+            libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
+          }
+        }
+      } else {
+        if (libraryToLink.getInterfaceLibrary() != null) {
+          libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
+        } else if (libraryToLink.getDynamicLibrary() != null) {
+          libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
+        }
+        if (libraryToLinkToUse == null) {
+          if (forDynamicLibrary) {
+            if (picStaticLibraryToLink != null) {
+              libraryToLinkToUse = picStaticLibraryToLink;
+            } else if (staticLibraryToLink != null) {
+              libraryToLinkToUse = staticLibraryToLink;
+            }
+          } else {
+            if (staticLibraryToLink != null) {
+              libraryToLinkToUse = staticLibraryToLink;
+            } else if (picStaticLibraryToLink != null) {
+              libraryToLinkToUse = picStaticLibraryToLink;
+            }
+          }
+        }
+      }
+      Preconditions.checkNotNull(libraryToLinkToUse);
+      librariesToLinkBuilder.add(libraryToLinkToUse);
+    }
+    return librariesToLinkBuilder.build();
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
index fba355e..5811cd9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
@@ -29,16 +29,13 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.rules.cpp.LinkerInputs.SolibLibraryToLink;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingContextApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.LibraryToLinkApi;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.util.Fingerprint;
-import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
-import java.util.ListIterator;
 import javax.annotation.Nullable;
 
 /**
@@ -52,67 +49,6 @@
 @AutoValue
 public abstract class LibraryToLink implements LibraryToLinkApi<Artifact> {
 
-  public static List<LinkerInputs.LibraryToLink> convertLibraryToLinkListToLibraryToLinkList(
-      NestedSet<LibraryToLink> librariesToLink, boolean staticMode, boolean forDynamicLibrary) {
-    ImmutableList.Builder<LinkerInputs.LibraryToLink> librariesToLinkBuilder =
-        ImmutableList.builder();
-    for (LibraryToLink libraryToLink : librariesToLink) {
-      LinkerInputs.LibraryToLink staticLibraryToLink =
-          libraryToLink.getStaticLibrary() == null ? null : libraryToLink.getStaticLibraryToLink();
-      LinkerInputs.LibraryToLink picStaticLibraryToLink =
-          libraryToLink.getPicStaticLibrary() == null
-              ? null
-              : libraryToLink.getPicStaticLibraryToLink();
-      LinkerInputs.LibraryToLink libraryToLinkToUse = null;
-      if (staticMode) {
-        if (forDynamicLibrary) {
-          if (picStaticLibraryToLink != null) {
-            libraryToLinkToUse = picStaticLibraryToLink;
-          } else if (staticLibraryToLink != null) {
-            libraryToLinkToUse = staticLibraryToLink;
-          }
-        } else {
-          if (staticLibraryToLink != null) {
-            libraryToLinkToUse = staticLibraryToLink;
-          } else if (picStaticLibraryToLink != null) {
-            libraryToLinkToUse = picStaticLibraryToLink;
-          }
-        }
-        if (libraryToLinkToUse == null) {
-          if (libraryToLink.getInterfaceLibrary() != null) {
-            libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
-          } else if (libraryToLink.getDynamicLibrary() != null) {
-            libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
-          }
-        }
-      } else {
-        if (libraryToLink.getInterfaceLibrary() != null) {
-          libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
-        } else if (libraryToLink.getDynamicLibrary() != null) {
-          libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
-        }
-        if (libraryToLinkToUse == null) {
-          if (forDynamicLibrary) {
-            if (picStaticLibraryToLink != null) {
-              libraryToLinkToUse = picStaticLibraryToLink;
-            } else if (staticLibraryToLink != null) {
-              libraryToLinkToUse = staticLibraryToLink;
-            }
-          } else {
-            if (staticLibraryToLink != null) {
-              libraryToLinkToUse = staticLibraryToLink;
-            } else if (picStaticLibraryToLink != null) {
-              libraryToLinkToUse = picStaticLibraryToLink;
-            }
-          }
-        }
-      }
-      Preconditions.checkNotNull(libraryToLinkToUse);
-      librariesToLinkBuilder.add(libraryToLinkToUse);
-    }
-    return librariesToLinkBuilder.build();
-  }
-
   public Artifact getDynamicLibraryForRuntimeOrNull(boolean linkingStatically) {
     if (getDynamicLibrary() == null) {
       return null;
@@ -522,100 +458,6 @@
     return new AutoValue_LibraryToLink.Builder().setMustKeepDebug(false).setAlwayslink(false);
   }
 
-  @Nullable
-  @SuppressWarnings("ReferenceEquality")
-  static String setDynamicArtifactsAndReturnIdentifier(
-      LibraryToLink.Builder libraryToLinkBuilder,
-      LinkerInputs.LibraryToLink dynamicModeParamsForExecutableEntry,
-      LinkerInputs.LibraryToLink dynamicModeParamsForDynamicLibraryEntry,
-      ListIterator<Artifact> runtimeLibraryIterator) {
-    Preconditions.checkNotNull(runtimeLibraryIterator);
-    Artifact artifact = dynamicModeParamsForExecutableEntry.getArtifact();
-    String libraryIdentifier = null;
-    Artifact runtimeArtifact = null;
-    if (dynamicModeParamsForExecutableEntry.getArtifactCategory()
-            == ArtifactCategory.DYNAMIC_LIBRARY
-        || dynamicModeParamsForExecutableEntry.getArtifactCategory()
-            == ArtifactCategory.INTERFACE_LIBRARY) {
-      Preconditions.checkState(
-          dynamicModeParamsForExecutableEntry == dynamicModeParamsForDynamicLibraryEntry);
-      libraryIdentifier = dynamicModeParamsForExecutableEntry.getLibraryIdentifier();
-
-      // Not every library to link has a corresponding runtime artifact, for example this is the
-      // case when it is provided by the system. Here we check if the next runtime artifact has the
-      // same basename as the current library to link, if it is, then we match them together. If
-      // isn't, then we must rewind the iterator since every call to next() advances it.
-      if (runtimeLibraryIterator.hasNext()) {
-        runtimeArtifact = runtimeLibraryIterator.next();
-        if (!doArtifactsHaveSameBasename(artifact, runtimeArtifact)) {
-          runtimeArtifact = null;
-          runtimeLibraryIterator.previous();
-        }
-      }
-    }
-
-    if (dynamicModeParamsForExecutableEntry.getArtifactCategory()
-        == ArtifactCategory.DYNAMIC_LIBRARY) {
-      // The SolibLibraryToLink implementation returns ArtifactCategory.DYNAMIC_LIBRARY even if
-      // the library being symlinked is an interface library. This was probably an oversight that
-      // didn't cause any issues. In any case, here we have to figure out whether the library is
-      // an interface library or not by checking the extension if it's a symlink.
-
-      if (dynamicModeParamsForExecutableEntry instanceof SolibLibraryToLink) {
-        // Note: with the old way of doing C++ linking, we lose the information regarding the
-        // runtime library. If {@code runtimeArtifact} is a symlink we only have the symlink but
-        // not a reference to the artifact it points to. We can infer whether it's a symlink by
-        // looking at whether the interface library is a symlink, however, we can't find out what
-        // it points to. With the new API design, we won't lose this information anymore. This is
-        // the way it has been done until now, but it wasn't a problem because symlinks get
-        // automatically resolved when they are in runfiles.
-        if (ArtifactCategory.INTERFACE_LIBRARY
-            .getAllowedExtensions()
-            .contains("." + artifact.getExtension())) {
-          libraryToLinkBuilder.setInterfaceLibrary(artifact);
-          libraryToLinkBuilder.setResolvedSymlinkInterfaceLibrary(
-              dynamicModeParamsForExecutableEntry.getOriginalLibraryArtifact());
-          if (runtimeArtifact != null) {
-            libraryToLinkBuilder.setDynamicLibrary(runtimeArtifact);
-          }
-        } else {
-          Preconditions.checkState(runtimeArtifact == null || artifact == runtimeArtifact);
-          libraryToLinkBuilder.setDynamicLibrary(artifact);
-          libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
-              dynamicModeParamsForExecutableEntry.getOriginalLibraryArtifact());
-        }
-      } else {
-        libraryToLinkBuilder.setDynamicLibrary(artifact);
-        Preconditions.checkState(runtimeArtifact == null || artifact == runtimeArtifact);
-      }
-    } else if (dynamicModeParamsForExecutableEntry.getArtifactCategory()
-        == ArtifactCategory.INTERFACE_LIBRARY) {
-      Preconditions.checkState(
-          !(dynamicModeParamsForExecutableEntry instanceof SolibLibraryToLink));
-      libraryToLinkBuilder.setInterfaceLibrary(artifact);
-      if (runtimeArtifact != null) {
-        libraryToLinkBuilder.setDynamicLibrary(runtimeArtifact);
-      }
-    }
-    return libraryIdentifier;
-  }
-
-  private static boolean doArtifactsHaveSameBasename(Artifact first, Artifact second) {
-    String nameFirst = removeAllExtensions(first.getRootRelativePath().getPathString());
-    String nameSecond = removeAllExtensions(second.getRootRelativePath().getPathString());
-    return nameFirst.equals(nameSecond);
-  }
-
-  private static String removeAllExtensions(String name) {
-    String previousWithoutExtension = FileSystemUtils.removeExtension(name);
-    String currentWithoutExtension = FileSystemUtils.removeExtension(previousWithoutExtension);
-    while (!previousWithoutExtension.equals(currentWithoutExtension)) {
-      previousWithoutExtension = currentWithoutExtension;
-      currentWithoutExtension = FileSystemUtils.removeExtension(previousWithoutExtension);
-    }
-    return currentWithoutExtension;
-  }
-
   LinkerInputs.LibraryToLink getStaticLibraryToLink() {
     Preconditions.checkNotNull(getStaticLibrary(), this);
     if (staticLibraryToLink != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index 0e532ed..c466bf8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -781,14 +781,9 @@
     // TODO(cpeyser): Clean up objc-cc interop.
     HashSet<PathFragment> avoidLibrariesSet = new HashSet<>();
     for (CcLinkingContext ccLinkingContext : avoidCcProviders) {
-      List<com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink> librariesToLink =
-          LibraryToLink.convertLibraryToLinkListToLibraryToLinkList(
-              ccLinkingContext.getLibraries(),
-              /* staticMode= */ true,
-              /* forDynamicLibrary= */ false);
-      for (com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink libraryToLink :
-          librariesToLink) {
-        avoidLibrariesSet.add(libraryToLink.getArtifact().getRunfilesPath());
+      List<Artifact> libraries = ccLinkingContext.getStaticModeParamsForExecutableLibraries();
+      for (Artifact library : libraries) {
+        avoidLibrariesSet.add(library.getRunfilesPath());
       }
     }
     for (ObjcProvider avoidProvider : avoidObjcProviders) {
