diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
index f6d58e4..66fe2d8 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
@@ -26,8 +26,8 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.BazelCcModuleApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Runtime;
@@ -50,7 +50,7 @@
         CcCompilationOutputs,
         LinkingInfo,
         CcLinkingContext,
-        LibraryToLinkWrapper,
+        LibraryToLink,
         CcToolchainVariables,
         CcToolchainConfigInfo> {
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index d8fd5be..7a84702 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -49,8 +49,8 @@
 import com.google.devtools.build.lib.rules.android.ZipFilterBuilder.CheckHashMismatchMode;
 import com.google.devtools.build.lib.rules.android.databinding.DataBindingContext;
 import com.google.devtools.build.lib.rules.cpp.CcInfo;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext.LinkOptions;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext.LinkOptions;
 import com.google.devtools.build.lib.rules.java.ClasspathConfiguredFragment;
 import com.google.devtools.build.lib.rules.java.JavaCcLinkParamsProvider;
 import com.google.devtools.build.lib.rules.java.JavaCommon;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
index 3187e82..0dbf12b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
@@ -38,7 +38,7 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
 import com.google.devtools.build.lib.rules.cpp.CppHelper;
 import com.google.devtools.build.lib.rules.cpp.CppSemantics;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.rules.nativedeps.NativeDepsHelper;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -246,13 +246,13 @@
   }
 
   private static Iterable<Artifact> filterUniqueSharedLibraries(
-      RuleContext ruleContext, Artifact linkedLibrary, NestedSet<LibraryToLinkWrapper> libraries) {
+      RuleContext ruleContext, Artifact linkedLibrary, NestedSet<LibraryToLink> libraries) {
     Map<String, Artifact> basenames = new HashMap<>();
     Set<Artifact> artifacts = new HashSet<>();
     if (linkedLibrary != null) {
       basenames.put(linkedLibrary.getExecPath().getBaseName(), linkedLibrary);
     }
-    for (LibraryToLinkWrapper linkerInput : libraries) {
+    for (LibraryToLink linkerInput : libraries) {
       if (linkerInput.getPicStaticLibrary() != null || linkerInput.getStaticLibrary() != null) {
         // This is not a shared library and will not be loaded by Android, so skip it.
         continue;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
index 5907c07..311ac76 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
@@ -59,8 +59,8 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.DynamicMode;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext.LinkOptions;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext.LinkOptions;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
 import com.google.devtools.build.lib.syntax.Type;
@@ -154,7 +154,7 @@
       RuleContext ruleContext,
       FeatureConfiguration featureConfiguration,
       CcToolchainProvider toolchain,
-      List<LibraryToLinkWrapper> libraries,
+      List<LibraryToLink> libraries,
       CcLinkingOutputs ccLibraryLinkingOutputs,
       CcCompilationContext ccCompilationContext,
       Link.LinkingMode linkingMode,
@@ -173,7 +173,7 @@
     builder.addTransitiveArtifacts(transitiveArtifacts);
     // Add the shared libraries to the runfiles. This adds any shared libraries that are in the
     // srcs of this target.
-    builder.addArtifacts(LibraryToLinkWrapper.getDynamicLibrariesForRuntime(true, libraries));
+    builder.addArtifacts(LibraryToLink.getDynamicLibrariesForRuntime(true, libraries));
     builder.addRunfiles(ruleContext, RunfilesProvider.DEFAULT_RUNFILES);
     // TODO(plf): Why do we need .so files produced by cc_library in data dependencies of cc_binary?
     // This can probably be removed safely.
@@ -401,7 +401,7 @@
         ImmutableList.Builder<Artifact> objectFiles = ImmutableList.builder();
         objectFiles.addAll(ccCompilationOutputs.getObjectFiles(false));
 
-        for (LibraryToLinkWrapper library : depsCcLinkingContext.getLibraries()) {
+        for (LibraryToLink library : depsCcLinkingContext.getLibraries()) {
           if (isStaticMode
               || (library.getDynamicLibrary() == null && library.getInterfaceLibrary() == null)) {
             if (library.getPicStaticLibrary() != null) {
@@ -435,8 +435,7 @@
       pdbFile = ruleContext.getRelatedArtifact(binary.getRootRelativePath(), ".pdb");
     }
 
-    NestedSetBuilder<LibraryToLinkWrapper> extraLinkTimeLibrariesNestedSet =
-        NestedSetBuilder.linkOrder();
+    NestedSetBuilder<LibraryToLink> extraLinkTimeLibrariesNestedSet = NestedSetBuilder.linkOrder();
     NestedSetBuilder<Artifact> extraLinkTimeRuntimeLibraries = NestedSetBuilder.linkOrder();
 
     ExtraLinkTimeLibraries extraLinkTimeLibraries =
@@ -479,10 +478,10 @@
 
     CcLauncherInfo ccLauncherInfo = ccLinkingOutputsAndCcLinkingInfo.second;
 
-    LibraryToLinkWrapper ccLinkingOutputsBinaryLibrary = ccLinkingOutputsBinary.getLibraryToLink();
+    LibraryToLink ccLinkingOutputsBinaryLibrary = ccLinkingOutputsBinary.getLibraryToLink();
     Iterable<Artifact> fakeLinkerInputs =
         fake ? ccLinkingOutputsBinary.getLinkActionInputs() : ImmutableList.<Artifact>of();
-    ImmutableList.Builder<LibraryToLinkWrapper> librariesBuilder = ImmutableList.builder();
+    ImmutableList.Builder<LibraryToLink> librariesBuilder = ImmutableList.builder();
     if (isLinkShared(ruleContext)) {
       if (ccLinkingOutputsBinaryLibrary != null) {
         librariesBuilder.add(ccLinkingOutputsBinaryLibrary);
@@ -491,15 +490,15 @@
     // Also add all shared libraries from srcs.
     for (Artifact library : precompiledFiles.getSharedLibraries()) {
       Artifact symlink = common.getDynamicLibrarySymlink(library, true);
-      LibraryToLinkWrapper libraryToLink =
-          LibraryToLinkWrapper.builder()
+      LibraryToLink libraryToLink =
+          LibraryToLink.builder()
               .setLibraryIdentifier(CcLinkingOutputs.libraryIdentifierOf(library))
               .setDynamicLibrary(symlink)
               .setResolvedSymlinkDynamicLibrary(library)
               .build();
       librariesBuilder.add(libraryToLink);
     }
-    ImmutableList<LibraryToLinkWrapper> libraries = librariesBuilder.build();
+    ImmutableList<LibraryToLink> libraries = librariesBuilder.build();
     NestedSet<Artifact> filesToBuild = NestedSetBuilder.create(Order.STABLE_ORDER, binary);
 
     // Create the stripped binary, but don't add it to filesToBuild; it's only built when requested.
@@ -539,10 +538,9 @@
     // all the dynamic libraries we need at runtime. Then copy these libraries next to the binary.
     if (featureConfiguration.isEnabled(CppRuleClasses.COPY_DYNAMIC_LIBRARIES_TO_BINARY)) {
       ImmutableList.Builder<Artifact> runtimeLibraries = ImmutableList.builder();
-      for (LibraryToLinkWrapper libraryToLinkWrapper : depsCcLinkingContext.getLibraries()) {
+      for (LibraryToLink libraryToLink : depsCcLinkingContext.getLibraries()) {
         Artifact library =
-            libraryToLinkWrapper.getDynamicLibraryForRuntimeOrNull(
-                /* linkingStatically= */ isStaticMode);
+            libraryToLink.getDynamicLibraryForRuntimeOrNull(/* linkingStatically= */ isStaticMode);
         if (library != null) {
           runtimeLibraries.add(library);
         }
@@ -614,7 +612,7 @@
     }
 
     if (!ccLinkingOutputsBinary.isEmpty()) {
-      LibraryToLinkWrapper libraryToLink = ccLinkingOutputsBinary.getLibraryToLink();
+      LibraryToLink libraryToLink = ccLinkingOutputsBinary.getLibraryToLink();
       Artifact dynamicLibraryForLinking = null;
       if (libraryToLink.getInterfaceLibrary() != null) {
         if (libraryToLink.getResolvedSymlinkInterfaceLibrary() != null) {
@@ -658,7 +656,7 @@
       boolean fake,
       Artifact binary,
       CcLinkingContext depsCcLinkingContext,
-      NestedSet<LibraryToLinkWrapper> extraLinkTimeLibraries,
+      NestedSet<LibraryToLink> extraLinkTimeLibraries,
       boolean linkCompileOutputSeparately,
       CppSemantics cppSemantics,
       LinkingMode linkingMode,
@@ -690,7 +688,7 @@
     if (linkCompileOutputSeparately) {
       if (!ccLinkingOutputs.isEmpty()) {
         currentCcLinkingContextBuilder.addLibraries(
-            NestedSetBuilder.<LibraryToLinkWrapper>linkOrder()
+            NestedSetBuilder.<LibraryToLink>linkOrder()
                 .add(ccLinkingOutputs.getLibraryToLink())
                 .build());
       }
@@ -701,32 +699,32 @@
     // First libraries from srcs. Shared library artifacts here are substituted with mangled symlink
     // artifacts generated by getDynamicLibraryLink(). This is done to minimize number of -rpath
     // entries during linking process.
-    ImmutableList.Builder<LibraryToLinkWrapper> precompiledLibraries = ImmutableList.builder();
+    ImmutableList.Builder<LibraryToLink> precompiledLibraries = ImmutableList.builder();
     for (Artifact library : precompiledFiles.getLibraries()) {
       if (Link.SHARED_LIBRARY_FILETYPES.matches(library.getFilename())) {
-        LibraryToLinkWrapper libraryToLinkWrapper =
-            LibraryToLinkWrapper.builder()
+        LibraryToLink libraryToLink =
+            LibraryToLink.builder()
                 .setLibraryIdentifier(CcLinkingOutputs.libraryIdentifierOf(library))
                 .setDynamicLibrary(
                     common.getDynamicLibrarySymlink(library, /* preserveName= */ true))
                 .setResolvedSymlinkDynamicLibrary(library)
                 .build();
-        precompiledLibraries.add(libraryToLinkWrapper);
+        precompiledLibraries.add(libraryToLink);
       } else if (Link.LINK_LIBRARY_FILETYPES.matches(library.getFilename())) {
-        LibraryToLinkWrapper libraryToLinkWrapper =
-            LibraryToLinkWrapper.builder()
+        LibraryToLink libraryToLink =
+            LibraryToLink.builder()
                 .setLibraryIdentifier(CcLinkingOutputs.libraryIdentifierOf(library))
                 .setStaticLibrary(library)
                 .setAlwayslink(true)
                 .build();
-        precompiledLibraries.add(libraryToLinkWrapper);
+        precompiledLibraries.add(libraryToLink);
       } else if (Link.ARCHIVE_FILETYPES.matches(library.getFilename())) {
-        LibraryToLinkWrapper libraryToLinkWrapper =
-            LibraryToLinkWrapper.builder()
+        LibraryToLink libraryToLink =
+            LibraryToLink.builder()
                 .setLibraryIdentifier(CcLinkingOutputs.libraryIdentifierOf(library))
                 .setStaticLibrary(library)
                 .build();
-        precompiledLibraries.add(libraryToLinkWrapper);
+        precompiledLibraries.add(libraryToLink);
       } else {
         throw new IllegalStateException();
       }
@@ -1032,7 +1030,7 @@
       NestedSet<Artifact> filesToBuild,
       CcCompilationOutputs ccCompilationOutputs,
       CcCompilationContext ccCompilationContext,
-      List<LibraryToLinkWrapper> libraries,
+      List<LibraryToLink> libraries,
       DwoArtifactsCollector dwoArtifacts,
       boolean fake) {
     List<Artifact> instrumentedObjectFiles = new ArrayList<>();
@@ -1077,9 +1075,9 @@
     CppHelper.maybeAddStaticLinkMarkerProvider(builder, ruleContext);
   }
 
-  private static NestedSet<LibraryToLinkWrapper> collectTransitiveCcNativeLibraries(
-      RuleContext ruleContext, List<LibraryToLinkWrapper> libraries) {
-    NestedSetBuilder<LibraryToLinkWrapper> builder = NestedSetBuilder.linkOrder();
+  private static NestedSet<LibraryToLink> collectTransitiveCcNativeLibraries(
+      RuleContext ruleContext, List<LibraryToLink> libraries) {
+    NestedSetBuilder<LibraryToLink> builder = NestedSetBuilder.linkOrder();
     builder.addAll(libraries);
     for (CcNativeLibraryProvider dep :
         ruleContext.getPrerequisites("deps", Mode.TARGET, CcNativeLibraryProvider.class)) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java
index 06f601a..f1bab33 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java
@@ -30,7 +30,7 @@
 import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper.CompilationInfo;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.HeadersCheckingMode;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.syntax.Type;
 import java.util.Map;
 import javax.annotation.Nullable;
@@ -136,8 +136,8 @@
     }
 
     if (notNullArtifactToLink != null) {
-      LibraryToLinkWrapper libraryToLinkWrapper =
-          LibraryToLinkWrapper.builder()
+      LibraryToLink libraryToLink =
+          LibraryToLink.builder()
               .setStaticLibrary(noPicAndPicStaticLibrary.noPicStaticLibrary())
               .setPicStaticLibrary(noPicAndPicStaticLibrary.picStaticLibrary())
               .setDynamicLibrary(sharedLibrary)
@@ -149,10 +149,7 @@
               .build();
       ccLinkingContext =
           CcLinkingContext.builder()
-              .addLibraries(
-                  NestedSetBuilder.<LibraryToLinkWrapper>linkOrder()
-                      .add(libraryToLinkWrapper)
-                      .build())
+              .addLibraries(NestedSetBuilder.<LibraryToLink>linkOrder().add(libraryToLink).build())
               .build();
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
index 15187b5..c0c20e4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.EvalException;
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 93d170e..ad6bba3 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
@@ -48,9 +48,8 @@
 import com.google.devtools.build.lib.rules.cpp.CcCommon.CcFlagsSupplier;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper.CompilationInfo;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
+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.LibraryToLink;
 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;
@@ -341,8 +340,8 @@
      *
      * Note that some target platforms do not require shared library code to be PIC.
      */
-    ImmutableList<LibraryToLink> precompiledStaticLibraries =
-        ImmutableList.<LibraryToLink>builder()
+    ImmutableList<LinkerInputs.LibraryToLink> precompiledStaticLibraries =
+        ImmutableList.<LinkerInputs.LibraryToLink>builder()
             .addAll(
                 LinkerInputs.opaqueLibrariesToLink(
                     ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getStaticLibraries()))
@@ -352,8 +351,8 @@
                     precompiledFiles.getAlwayslinkStaticLibraries()))
             .build();
 
-    ImmutableList<LibraryToLink> precompiledPicStaticLibraries =
-        ImmutableList.<LibraryToLink>builder()
+    ImmutableList<LinkerInputs.LibraryToLink> precompiledPicStaticLibraries =
+        ImmutableList.<LinkerInputs.LibraryToLink>builder()
             .addAll(
                 LinkerInputs.opaqueLibrariesToLink(
                     ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getPicStaticLibraries()))
@@ -363,7 +362,7 @@
                     precompiledFiles.getPicAlwayslinkLibraries()))
             .build();
 
-    List<LibraryToLink> dynamicLibraries =
+    List<LinkerInputs.LibraryToLink> dynamicLibraries =
         ImmutableList.copyOf(
             Iterables.transform(
                 precompiledFiles.getSharedLibraries(),
@@ -384,8 +383,8 @@
               ccCompilationOutputs,
               featureConfiguration));
     }
-    List<LibraryToLinkWrapper> precompiledLibraries =
-        convertPrecompiledLibrariesToLibraryToLinkWrapper(
+    List<LibraryToLink> precompiledLibraries =
+        convertPrecompiledLibrariesToLibraryToLink(
             ruleContext.getFragment(CppConfiguration.class).forcePic(),
             precompiledStaticLibraries,
             precompiledPicStaticLibraries,
@@ -396,19 +395,19 @@
           ruleContext, ccLinkingOutputs, precompiledLibraries);
     }
 
-    ImmutableList<LibraryToLinkWrapper> libraryToLinkWrappers =
-        createLibraryToLinkWrappersList(
+    ImmutableList<LibraryToLink> libraryToLinks =
+        createLibrariesToLinkList(
             ccLinkingOutputs.getLibraryToLink(),
             precompiledLibraries,
             ccCompilationOutputs.isEmpty());
 
     CcLinkingContext ccLinkingContext =
-        linkingHelper.buildCcLinkingContextFromLibraryToLinkWrappers(
-            neverLink ? ImmutableList.of() : libraryToLinkWrappers,
+        linkingHelper.buildCcLinkingContextFromLibrariesToLink(
+            neverLink ? ImmutableList.of() : libraryToLinks,
             compilationInfo.getCcCompilationContext());
     CcNativeLibraryProvider ccNativeLibraryProvider =
         CppHelper.collectNativeCcLibraries(
-            ruleContext.getPrerequisites("deps", Mode.TARGET), libraryToLinkWrappers);
+            ruleContext.getPrerequisites("deps", Mode.TARGET), libraryToLinks);
 
     /*
      * We always generate a static library, even if there aren't any source files.
@@ -421,7 +420,7 @@
 
     NestedSetBuilder<Artifact> filesBuilder = NestedSetBuilder.stableOrder();
     if (!ccLinkingOutputs.isEmpty()) {
-      LibraryToLinkWrapper artifactsToBuild = ccLinkingOutputs.getLibraryToLink();
+      LibraryToLink artifactsToBuild = ccLinkingOutputs.getLibraryToLink();
       if (artifactsToBuild.getStaticLibrary() != null) {
         filesBuilder.add(artifactsToBuild.getStaticLibrary());
       }
@@ -468,16 +467,14 @@
     Runfiles.Builder defaultRunfiles =
         new Runfiles.Builder(ruleContext.getWorkspaceName())
             .merge(runfiles)
-            .addArtifacts(
-                LibraryToLinkWrapper.getDynamicLibrariesForRuntime(
-                    !neverLink, libraryToLinkWrappers));
+            .addArtifacts(LibraryToLink.getDynamicLibrariesForRuntime(!neverLink, libraryToLinks));
 
     Runfiles.Builder dataRunfiles =
         new Runfiles.Builder(ruleContext.getWorkspaceName())
             .merge(runfiles)
             .addArtifacts(
-                LibraryToLinkWrapper.getDynamicLibrariesForRuntime(
-                    /* linkingStatically= */ false, libraryToLinkWrappers));
+                LibraryToLink.getDynamicLibrariesForRuntime(
+                    /* linkingStatically= */ false, libraryToLinks));
 
     @SuppressWarnings("unchecked")
     CppDebugFileProvider cppDebugFileProvider =
@@ -682,12 +679,12 @@
     return outputGroups.build();
   }
 
-  private static ImmutableList<LibraryToLinkWrapper> createLibraryToLinkWrappersList(
-      @Nullable LibraryToLinkWrapper outputLibrary,
-      List<LibraryToLinkWrapper> precompiledLibraries,
+  private static ImmutableList<LibraryToLink> createLibrariesToLinkList(
+      @Nullable LibraryToLink outputLibrary,
+      List<LibraryToLink> precompiledLibraries,
       boolean ccCompilationOutputsIsEmpty) {
-    ImmutableList.Builder<LibraryToLinkWrapper> libraryToLinkWrappers = ImmutableList.builder();
-    libraryToLinkWrappers.addAll(precompiledLibraries);
+    ImmutableList.Builder<LibraryToLink> librariesToLink = ImmutableList.builder();
+    librariesToLink.addAll(precompiledLibraries);
 
     // For cc_library if it contains precompiled libraries we link them. If it contains normal
     // sources we link them as well, if it doesn't contain normal sources, then we don't do
@@ -699,11 +696,11 @@
             && isContentsOfCcLinkingOutputsImplicitlyCreated(
                 ccCompilationOutputsIsEmpty, outputLibrary == null))) {
       if (outputLibrary != null) {
-        libraryToLinkWrappers.add(outputLibrary);
+        librariesToLink.add(outputLibrary);
       }
     }
 
-    return libraryToLinkWrappers.build();
+    return librariesToLink.build();
   }
 
   private static boolean isContentsOfCcLinkingOutputsImplicitlyCreated(
@@ -711,100 +708,100 @@
     return ccCompilationOutputsIsEmpty && !ccLinkingOutputsIsEmpty;
   }
 
-  private static List<LibraryToLinkWrapper> convertPrecompiledLibrariesToLibraryToLinkWrapper(
+  private static List<LibraryToLink> convertPrecompiledLibrariesToLibraryToLink(
       boolean forcePic,
-      List<LibraryToLink> staticLibraries,
-      List<LibraryToLink> picStaticLibraries,
-      List<LibraryToLink> dynamicLibrariesForRuntime) {
-    ImmutableList.Builder<LibraryToLinkWrapper> libraryToLinkWrappers = ImmutableList.builder();
+      List<LinkerInputs.LibraryToLink> staticLibraries,
+      List<LinkerInputs.LibraryToLink> picStaticLibraries,
+      List<LinkerInputs.LibraryToLink> dynamicLibrariesForRuntime) {
+    ImmutableList.Builder<LibraryToLink> librariesToLink = ImmutableList.builder();
 
     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 (LibraryToLink staticLibrary : staticLibraries) {
-      LibraryToLinkWrapper.Builder libraryToLinkWrapperBuilder = LibraryToLinkWrapper.builder();
+    for (LinkerInputs.LibraryToLink staticLibrary : staticLibraries) {
+      LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
       String identifier = staticLibrary.getLibraryIdentifier();
-      libraryToLinkWrapperBuilder.setLibraryIdentifier(identifier);
-      List<LibraryToLink> sameIdentifierPicStaticLibraries =
+      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;
-        libraryToLinkWrapperBuilder.setPicStaticLibrary(
+        libraryToLinkBuilder.setPicStaticLibrary(
             sameIdentifierPicStaticLibraries.get(0).getArtifact());
       }
       if (!forcePic || !hadPic) {
-        libraryToLinkWrapperBuilder.setStaticLibrary(staticLibrary.getArtifact());
+        libraryToLinkBuilder.setStaticLibrary(staticLibrary.getArtifact());
       }
-      List<LibraryToLink> sameIdentifierDynamicLibraries =
+      List<LinkerInputs.LibraryToLink> sameIdentifierDynamicLibraries =
           dynamicLibrariesForRuntime.stream()
               .filter(x -> x.getLibraryIdentifier().equals(identifier))
               .collect(ImmutableList.toImmutableList());
       if (!sameIdentifierDynamicLibraries.isEmpty()) {
-        LibraryToLink dynamicLibrary = sameIdentifierDynamicLibraries.get(0);
-        libraryToLinkWrapperBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
+        LinkerInputs.LibraryToLink dynamicLibrary = sameIdentifierDynamicLibraries.get(0);
+        libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
         if (dynamicLibrary instanceof SolibLibraryToLink) {
-          libraryToLinkWrapperBuilder.setResolvedSymlinkDynamicLibrary(
+          libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
               dynamicLibrary.getOriginalLibraryArtifact());
         }
       }
-      libraryToLinkWrapperBuilder.setAlwayslink(
+      libraryToLinkBuilder.setAlwayslink(
           staticLibrary.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY);
       identifiersUsed.add(identifier);
-      libraryToLinkWrappers.add(libraryToLinkWrapperBuilder.build());
+      librariesToLink.add(libraryToLinkBuilder.build());
     }
 
-    for (LibraryToLink picStaticLibrary : picStaticLibraries) {
+    for (LinkerInputs.LibraryToLink picStaticLibrary : picStaticLibraries) {
       String identifier = picStaticLibrary.getLibraryIdentifier();
       if (identifiersUsed.contains(identifier)) {
         continue;
       }
-      LibraryToLinkWrapper.Builder libraryToLinkWrapperBuilder = LibraryToLinkWrapper.builder();
-      libraryToLinkWrapperBuilder.setPicStaticLibrary(picStaticLibrary.getArtifact());
-      libraryToLinkWrapperBuilder.setLibraryIdentifier(identifier);
-      List<LibraryToLink> sameIdentifierDynamicLibraries =
+      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()) {
-        LibraryToLink dynamicLibrary = sameIdentifierDynamicLibraries.get(0);
-        libraryToLinkWrapperBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
+        LinkerInputs.LibraryToLink dynamicLibrary = sameIdentifierDynamicLibraries.get(0);
+        libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
         if (dynamicLibrary instanceof SolibLibraryToLink) {
-          libraryToLinkWrapperBuilder.setResolvedSymlinkDynamicLibrary(
+          libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
               dynamicLibrary.getOriginalLibraryArtifact());
         }
       }
-      libraryToLinkWrapperBuilder.setAlwayslink(
+      libraryToLinkBuilder.setAlwayslink(
           picStaticLibrary.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY);
       identifiersUsed.add(identifier);
-      libraryToLinkWrappers.add(libraryToLinkWrapperBuilder.build());
+      librariesToLink.add(libraryToLinkBuilder.build());
     }
 
-    for (LibraryToLink dynamicLibrary : dynamicLibrariesForRuntime) {
+    for (LinkerInputs.LibraryToLink dynamicLibrary : dynamicLibrariesForRuntime) {
       String identifier = dynamicLibrary.getLibraryIdentifier();
       if (identifiersUsed.contains(identifier)) {
         continue;
       }
-      LibraryToLinkWrapper.Builder libraryToLinkWrapperBuilder = LibraryToLinkWrapper.builder();
-      libraryToLinkWrapperBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
-      libraryToLinkWrapperBuilder.setLibraryIdentifier(identifier);
+      LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
+      libraryToLinkBuilder.setDynamicLibrary(dynamicLibrary.getArtifact());
+      libraryToLinkBuilder.setLibraryIdentifier(identifier);
       if (dynamicLibrary instanceof SolibLibraryToLink) {
-        libraryToLinkWrapperBuilder.setResolvedSymlinkDynamicLibrary(
+        libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
             dynamicLibrary.getOriginalLibraryArtifact());
       }
-      libraryToLinkWrappers.add(libraryToLinkWrapperBuilder.build());
+      librariesToLink.add(libraryToLinkBuilder.build());
     }
-    return libraryToLinkWrappers.build();
+    return librariesToLink.build();
   }
 
   private static void checkIfLinkOutputsCollidingWithPrecompiledFiles(
       RuleContext ruleContext,
       CcLinkingOutputs ccLinkingOutputs,
-      List<LibraryToLinkWrapper> precompiledLibraries) {
+      List<LibraryToLink> precompiledLibraries) {
     String identifier = ccLinkingOutputs.getLibraryToLink().getLibraryIdentifier();
-    for (LibraryToLinkWrapper precompiledLibrary : precompiledLibraries) {
+    for (LibraryToLink precompiledLibrary : precompiledLibraries) {
       if (identifier.equals(precompiledLibrary.getLibraryIdentifier())) {
         ruleContext.ruleError(
             "Can't put library with identifier '"
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 ea32f44..47086bd 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
@@ -36,13 +36,12 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.ExpansionException;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.VariablesExtension;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext.Linkstamp;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext.Linkstamp;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkerOrArchiver;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
 import com.google.devtools.build.lib.rules.cpp.Link.Picness;
-import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.LinkingInfoApi;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -342,8 +341,8 @@
     return ccLinkingOutputs;
   }
 
-  public CcLinkingContext buildCcLinkingContextFromLibraryToLinkWrappers(
-      ImmutableCollection<LibraryToLinkWrapper> libraryToLinkWrappers,
+  public CcLinkingContext buildCcLinkingContextFromLibrariesToLink(
+      ImmutableCollection<LibraryToLink> libraryToLinks,
       CcCompilationContext ccCompilationContext) {
     NestedSetBuilder<Linkstamp> linkstampBuilder = NestedSetBuilder.stableOrder();
     for (Artifact linkstamp : linkstamps.build()) {
@@ -367,9 +366,7 @@
                           CcLinkingContext.LinkOptions.of(
                               linkopts, ruleContext.getSymbolGenerator())))
               .addLibraries(
-                  NestedSetBuilder.<LibraryToLinkWrapper>linkOrder()
-                      .addAll(libraryToLinkWrappers)
-                      .build())
+                  NestedSetBuilder.<LibraryToLink>linkOrder().addAll(libraryToLinks).build())
               .addNonCodeInputs(
                   NestedSetBuilder.<Artifact>linkOrder().addAll(nonCodeLinkerInputs).build())
               .addLinkstamps(linkstampBuilder.build())
@@ -403,7 +400,7 @@
         staticLinkType.linkerOrArchiver() == LinkerOrArchiver.ARCHIVER,
         "can only handle static links");
 
-    LibraryToLinkWrapper.Builder libraryToLinkBuilder = LibraryToLinkWrapper.builder();
+    LibraryToLink.Builder libraryToLinkBuilder = LibraryToLink.builder();
     boolean usePicForBinaries = CppHelper.usePicForBinaries(ccToolchain, featureConfiguration);
     boolean usePicForDynamicLibs = ccToolchain.usePicForDynamicLibraries(featureConfiguration);
 
@@ -482,7 +479,7 @@
   }
 
   private void createNoPicAndPicStaticLibraries(
-      LibraryToLinkWrapper.Builder libraryToLinkBuilder,
+      LibraryToLink.Builder libraryToLinkBuilder,
       boolean usePicForBinaries,
       boolean usePicForDynamicLibs,
       String libraryIdentifier,
@@ -519,7 +516,7 @@
     }
 
     if (createNoPicAction) {
-      LibraryToLink staticLibrary =
+      LinkerInputs.LibraryToLink staticLibrary =
           registerActionForStaticLibrary(
                   staticLinkType, ccOutputs, /* usePic= */ false, libraryIdentifier)
               .getOutputLibrary();
@@ -544,7 +541,7 @@
                 ? LinkTargetType.ALWAYS_LINK_PIC_STATIC_LIBRARY
                 : LinkTargetType.PIC_STATIC_LIBRARY;
       }
-      LibraryToLink picStaticLibrary =
+      LinkerInputs.LibraryToLink picStaticLibrary =
           registerActionForStaticLibrary(
                   linkTargetTypeUsedForNaming, ccOutputs, /* usePic= */ true, libraryIdentifier)
               .getOutputLibrary();
@@ -584,7 +581,7 @@
 
   private boolean createDynamicLibrary(
       CcLinkingOutputs.Builder ccLinkingOutputs,
-      LibraryToLinkWrapper.Builder libraryToLinkBuilder,
+      LibraryToLink.Builder libraryToLinkBuilder,
       boolean usePic,
       String libraryIdentifier,
       CcCompilationOutputs ccOutputs)
@@ -670,8 +667,8 @@
 
     if (shouldLinkTransitively) {
       CcLinkingContext ccLinkingContext = CcLinkingContext.merge(ccLinkingContexts);
-      List<LibraryToLink> libraries =
-          LibraryToLinkWrapper.convertLibraryToLinkWrapperListToLibraryToLinkList(
+      List<LinkerInputs.LibraryToLink> libraries =
+          LibraryToLink.convertLibraryToLinkListToLibraryToLinkList(
               ccLinkingContext.getLibraries(),
               linkingMode != LinkingMode.DYNAMIC,
               dynamicLinkType.isDynamicLibrary());
@@ -710,8 +707,8 @@
     ccLinkingOutputs.addLinkActionInputs(dynamicLinkAction.getInputs());
     actionConstructionContext.registerAction(dynamicLinkAction);
 
-    LibraryToLink dynamicLibrary = dynamicLinkAction.getOutputLibrary();
-    LibraryToLink interfaceLibrary = dynamicLinkAction.getInterfaceOutputLibrary();
+    LinkerInputs.LibraryToLink dynamicLibrary = dynamicLinkAction.getOutputLibrary();
+    LinkerInputs.LibraryToLink interfaceLibrary = dynamicLinkAction.getInterfaceOutputLibrary();
 
     // If shared library has neverlink=1, then leave it untouched. Otherwise,
     // create a mangled symlink for it and from now on reference it through
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java
index 2020700..3d8a689 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingOutputs.java
@@ -18,7 +18,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSetMultimap;
 import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingOutputsApi;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import javax.annotation.Nullable;
@@ -28,13 +27,13 @@
 
   public static final CcLinkingOutputs EMPTY = new Builder().build();
 
-  @Nullable private final LibraryToLinkWrapper libraryToLink;
+  @Nullable private final LibraryToLink libraryToLink;
 
   private final ImmutableList<LtoBackendArtifacts> allLtoArtifacts;
   private final ImmutableList<Artifact> linkActionInputs;
 
   private CcLinkingOutputs(
-      LibraryToLinkWrapper libraryToLink,
+      LibraryToLink libraryToLink,
       ImmutableList<LtoBackendArtifacts> allLtoArtifacts,
       ImmutableList<Artifact> linkActionInputs) {
     this.libraryToLink = libraryToLink;
@@ -44,7 +43,7 @@
 
   @Override
   @Nullable
-  public LibraryToLinkWrapper getLibraryToLink() {
+  public LibraryToLink getLibraryToLink() {
     return libraryToLink;
   }
 
@@ -64,11 +63,11 @@
    * Gathers up a map from library identifiers to sets of LibraryToLink which share that library
    * identifier.
    */
-  public static ImmutableSetMultimap<String, LibraryToLink> getLibrariesByIdentifier(
-      Iterable<LibraryToLink> inputs) {
-    ImmutableSetMultimap.Builder<String, LibraryToLink> result =
+  public static ImmutableSetMultimap<String, LinkerInputs.LibraryToLink> getLibrariesByIdentifier(
+      Iterable<LinkerInputs.LibraryToLink> inputs) {
+    ImmutableSetMultimap.Builder<String, LinkerInputs.LibraryToLink> result =
         new ImmutableSetMultimap.Builder<>();
-    for (LibraryToLink library : inputs) {
+    for (LinkerInputs.LibraryToLink library : inputs) {
       Preconditions.checkNotNull(library.getLibraryIdentifier());
       result.put(library.getLibraryIdentifier(), library);
     }
@@ -97,7 +96,7 @@
   }
 
   public static final class Builder {
-    private LibraryToLinkWrapper libraryToLink;
+    private LibraryToLink libraryToLink;
 
     // TODO(plf): Return a list of debug artifacts instead of lto back end artifacts and in that
     // same list return the .pdb file for Windows.
@@ -109,7 +108,7 @@
       return new CcLinkingOutputs(libraryToLink, allLtoArtifacts.build(), linkActionInputs.build());
     }
 
-    public Builder setLibraryToLink(LibraryToLinkWrapper libraryToLink) {
+    public Builder setLibraryToLink(LibraryToLink libraryToLink) {
       this.libraryToLink = libraryToLink;
       return this;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index 89b57ad..79f7fd9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -52,7 +52,7 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.Expandable;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables.StringValueParser;
 import com.google.devtools.build.lib.rules.cpp.CppActionConfigs.CppPlatform;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcModuleApi;
 import com.google.devtools.build.lib.skylarkinterface.StarlarkContext;
@@ -86,7 +86,7 @@
         FeatureConfiguration,
         CcCompilationContext,
         CcLinkingContext,
-        LibraryToLinkWrapper,
+        LibraryToLink,
         CcToolchainVariables,
         SkylarkRuleContext,
         CcToolchainConfigInfo> {
@@ -318,7 +318,7 @@
   }
 
   /**
-   * This method returns a {@link LibraryToLinkWrapper} object that will be used to contain linking
+   * This method returns a {@link LibraryToLink} object that will be used to contain linking
    * artifacts and information for a single library that will later be used by a linking action.
    *
    * @param actionsObject SkylarkActionFactory
@@ -333,7 +333,7 @@
    * @throws InterruptedException
    */
   @Override
-  public LibraryToLinkWrapper createLibraryLinkerInput(
+  public LibraryToLink createLibraryLinkerInput(
       Object actionsObject,
       Object featureConfigurationObject,
       Object ccToolchainProviderObject,
@@ -457,7 +457,7 @@
           "Must pass at least one of the following parameters: static_library, pic_static_library, "
               + "dynamic_library and interface_library.");
     }
-    return LibraryToLinkWrapper.builder()
+    return LibraryToLink.builder()
         .setLibraryIdentifier(CcLinkingOutputs.libraryIdentifierOf(notNullArtifactForIdentifier))
         .setStaticLibrary(staticLibrary)
         .setPicStaticLibrary(picStaticLibrary)
@@ -538,7 +538,7 @@
       StarlarkContext context)
       throws EvalException {
     @SuppressWarnings("unchecked")
-    SkylarkList<LibraryToLinkWrapper> librariesToLink =
+    SkylarkList<LibraryToLink> librariesToLink =
         nullIfNone(librariesToLinkObject, SkylarkList.class);
     @SuppressWarnings("unchecked")
     SkylarkList<String> userLinkFlags = nullIfNone(userLinkFlagsObject, SkylarkList.class);
@@ -698,16 +698,16 @@
             .setNeverLink(neverLink);
     try {
       CcLinkingOutputs ccLinkingOutputs = CcLinkingOutputs.EMPTY;
-      ImmutableList<LibraryToLinkWrapper> libraryToLinkWrapper = ImmutableList.of();
+      ImmutableList<LibraryToLink> libraryToLink = ImmutableList.of();
       if (!ccCompilationOutputs.isEmpty()) {
         ccLinkingOutputs = helper.link(ccCompilationOutputs);
         if (!neverLink && !ccLinkingOutputs.isEmpty()) {
-          libraryToLinkWrapper = ImmutableList.of(ccLinkingOutputs.getLibraryToLink());
+          libraryToLink = ImmutableList.of(ccLinkingOutputs.getLibraryToLink());
         }
       }
       CcLinkingContext ccLinkingContext =
-          helper.buildCcLinkingContextFromLibraryToLinkWrappers(
-              libraryToLinkWrapper, CcCompilationContext.EMPTY);
+          helper.buildCcLinkingContextFromLibrariesToLink(
+              libraryToLink, CcCompilationContext.EMPTY);
       return new LinkingInfo(ccLinkingContext, ccLinkingOutputs);
     } catch (RuleErrorException e) {
       throw new EvalException(ruleContext.getRule().getLocation(), e);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcNativeLibraryProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcNativeLibraryProvider.java
index dee0276..b392cd7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcNativeLibraryProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcNativeLibraryProvider.java
@@ -26,9 +26,9 @@
 @Immutable
 @AutoCodec
 public final class CcNativeLibraryProvider implements TransitiveInfoProvider {
-  private final NestedSet<LibraryToLinkWrapper> transitiveCcNativeLibraries;
+  private final NestedSet<LibraryToLink> transitiveCcNativeLibraries;
 
-  public CcNativeLibraryProvider(NestedSet<LibraryToLinkWrapper> transitiveCcNativeLibraries) {
+  public CcNativeLibraryProvider(NestedSet<LibraryToLink> transitiveCcNativeLibraries) {
     this.transitiveCcNativeLibraries = transitiveCcNativeLibraries;
   }
 
@@ -38,7 +38,7 @@
    *
    * <p>In effect, returns all dynamic library (.so) artifacts provided by the transitive closure.
    */
-  public NestedSet<LibraryToLinkWrapper> getTransitiveCcNativeLibraries() {
+  public NestedSet<LibraryToLink> getTransitiveCcNativeLibraries() {
     return transitiveCcNativeLibraries;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index 37ec6bc..a15f078 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -33,7 +33,7 @@
 import com.google.devtools.build.lib.packages.RuleErrorConsumer;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcToolchainProviderApi;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index 2a1a466..3379d31 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -55,8 +55,8 @@
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.packages.RuleErrorConsumer;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext.Linkstamp;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext.Linkstamp;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.rules.proto.ProtoInfo;
 import com.google.devtools.build.lib.shell.ShellUtils;
@@ -849,8 +849,8 @@
   }
 
   public static CcNativeLibraryProvider collectNativeCcLibraries(
-      List<? extends TransitiveInfoCollection> deps, List<LibraryToLinkWrapper> libraries) {
-    NestedSetBuilder<LibraryToLinkWrapper> result = NestedSetBuilder.linkOrder();
+      List<? extends TransitiveInfoCollection> deps, List<LibraryToLink> libraries) {
+    NestedSetBuilder<LibraryToLink> result = NestedSetBuilder.linkOrder();
     result.addAll(libraries);
     for (CcNativeLibraryProvider dep :
         AnalysisUtils.getProviders(deps, CcNativeLibraryProvider.class)) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
index 1d9ec67..fe51e2b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
@@ -46,12 +46,11 @@
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool;
 import com.google.devtools.build.lib.rules.cpp.CppLinkAction.LinkArtifactFactory;
 import com.google.devtools.build.lib.rules.cpp.LibrariesToLinkCollector.CollectedLibrariesToLink;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext.Linkstamp;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext.Linkstamp;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkerOrArchiver;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
-import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -112,9 +111,9 @@
   // Keep these in sync with {@link Context}.
   private final Set<LinkerInput> objectFiles = new LinkedHashSet<>();
   private final Set<Artifact> nonCodeInputs = new LinkedHashSet<>();
-  private final NestedSetBuilder<LibraryToLink> libraries = NestedSetBuilder.linkOrder();
-  private final NestedSetBuilder<LibraryToLinkWrapper> libraryToLinkWrappers =
+  private final NestedSetBuilder<LinkerInputs.LibraryToLink> libraries =
       NestedSetBuilder.linkOrder();
+  private final NestedSetBuilder<LibraryToLink> librariesToLink = NestedSetBuilder.linkOrder();
   private NestedSet<Artifact> linkerFiles = NestedSetBuilder.emptySet(Order.STABLE_ORDER);
   private Artifact runtimeMiddleman;
   private ArtifactCategory toolchainLibrariesType = null;
@@ -220,10 +219,8 @@
     return objectFiles;
   }
 
-  /**
-   * Returns linker inputs that are libraries.
-   */
-  public NestedSetBuilder<LibraryToLink> getLibraries() {
+  /** Returns linker inputs that are libraries. */
+  public NestedSetBuilder<LinkerInputs.LibraryToLink> getLibraries() {
     return libraries;
   }
 
@@ -283,10 +280,12 @@
    * Maps bitcode library files used by the LTO backends to the corresponding minimized bitcode file
    * used as input to the LTO indexing step.
    */
-  private static NestedSet<LibraryToLink> computeLtoIndexingUniqueLibraries(
-      NestedSet<LibraryToLink> originalUniqueLibraries, boolean includeLinkStaticInLtoIndexing) {
-    NestedSetBuilder<LibraryToLink> uniqueLibrariesBuilder = NestedSetBuilder.linkOrder();
-    for (LibraryToLink lib : originalUniqueLibraries) {
+  private static NestedSet<LinkerInputs.LibraryToLink> computeLtoIndexingUniqueLibraries(
+      NestedSet<LinkerInputs.LibraryToLink> originalUniqueLibraries,
+      boolean includeLinkStaticInLtoIndexing) {
+    NestedSetBuilder<LinkerInputs.LibraryToLink> uniqueLibrariesBuilder =
+        NestedSetBuilder.linkOrder();
+    for (LinkerInputs.LibraryToLink lib : originalUniqueLibraries) {
       if (!lib.containsObjectFiles()) {
         uniqueLibrariesBuilder.add(lib);
         continue;
@@ -332,7 +331,7 @@
     if (!ltoCompilationContext.isEmpty()) {
       return true;
     }
-    for (LibraryToLink lib : libraries.build()) {
+    for (LinkerInputs.LibraryToLink lib : libraries.build()) {
       if (!lib.getLtoCompilationContext().isEmpty()) {
         return true;
       }
@@ -410,11 +409,11 @@
 
   private Iterable<LtoBackendArtifacts> createLtoArtifacts(
       PathFragment ltoOutputRootPrefix,
-      NestedSet<LibraryToLink> uniqueLibraries,
+      NestedSet<LinkerInputs.LibraryToLink> uniqueLibraries,
       boolean allowLtoIndexing,
       boolean includeLinkStaticInLtoIndexing) {
     Set<Artifact> compiled = new LinkedHashSet<>();
-    for (LibraryToLink lib : uniqueLibraries) {
+    for (LinkerInputs.LibraryToLink lib : uniqueLibraries) {
       compiled.addAll(lib.getLtoCompilationContext().getBitcodeFiles());
     }
 
@@ -425,7 +424,7 @@
     // statically linked, so we need to look at includeLinkStaticInLtoIndexing to decide whether
     // to include its objects in the LTO indexing for this target.
     if (includeLinkStaticInLtoIndexing) {
-      for (LibraryToLink lib : uniqueLibraries) {
+      for (LinkerInputs.LibraryToLink lib : uniqueLibraries) {
         if (!lib.containsObjectFiles()) {
           continue;
         }
@@ -443,7 +442,7 @@
     }
 
     ImmutableList.Builder<LtoBackendArtifacts> ltoOutputs = ImmutableList.builder();
-    for (LibraryToLink lib : uniqueLibraries) {
+    for (LinkerInputs.LibraryToLink lib : uniqueLibraries) {
       if (!lib.containsObjectFiles()) {
         continue;
       }
@@ -557,19 +556,18 @@
     }
   }
 
-  private List<LibraryToLink> convertLibraryToLinkWrapperListToLibraryToLinkList(
-      NestedSet<LibraryToLinkWrapper> libraryToLinkWrappers) {
-    ImmutableList.Builder<LibraryToLink> librariesToLink = ImmutableList.builder();
-    for (LibraryToLinkWrapper libraryToLinkWrapper : libraryToLinkWrappers) {
-      LibraryToLink staticLibraryToLink =
-          libraryToLinkWrapper.getStaticLibrary() == null
+  private List<LinkerInputs.LibraryToLink> convertLibraryToLinkListToLibraryToLinkList(
+      NestedSet<LibraryToLink> librariesToLink) {
+    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
-              : libraryToLinkWrapper.getStaticLibraryToLink();
-      LibraryToLink picStaticLibraryToLink =
-          libraryToLinkWrapper.getPicStaticLibrary() == null
-              ? null
-              : libraryToLinkWrapper.getPicStaticLibraryToLink();
-      LibraryToLink libraryToLinkToUse = null;
+              : libraryToLink.getPicStaticLibraryToLink();
+      LinkerInputs.LibraryToLink libraryToLinkToUse = null;
       if (linkingMode == LinkingMode.STATIC) {
         if (linkType.isDynamicLibrary()) {
           if (picStaticLibraryToLink != null) {
@@ -586,31 +584,30 @@
         }
       }
       if (libraryToLinkToUse == null) {
-        if (libraryToLinkWrapper.getInterfaceLibrary() != null) {
-          libraryToLinkToUse = libraryToLinkWrapper.getInterfaceLibraryToLink();
-        } else if (libraryToLinkWrapper.getDynamicLibrary() != null) {
-          libraryToLinkToUse = libraryToLinkWrapper.getDynamicLibraryToLink();
+        if (libraryToLink.getInterfaceLibrary() != null) {
+          libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
+        } else if (libraryToLink.getDynamicLibrary() != null) {
+          libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
         }
       }
       Preconditions.checkNotNull(libraryToLinkToUse);
       checkLibrary(libraryToLinkToUse);
-      librariesToLink.add(libraryToLinkToUse);
+      librariesToLinkBuilder.add(libraryToLinkToUse);
     }
-    return librariesToLink.build();
+    return librariesToLinkBuilder.build();
   }
 
   /** Builds the Action as configured and returns it. */
   public CppLinkAction build() throws InterruptedException {
-    NestedSet<LibraryToLink> originalUniqueLibraries = null;
+    NestedSet<LinkerInputs.LibraryToLink> originalUniqueLibraries = null;
 
-    if (libraryToLinkWrappers.isEmpty()) {
+    if (librariesToLink.isEmpty()) {
       originalUniqueLibraries = libraries.build();
     } else {
       Preconditions.checkState(libraries.isEmpty());
       originalUniqueLibraries =
-          NestedSetBuilder.<LibraryToLink>linkOrder()
-              .addAll(
-                  convertLibraryToLinkWrapperListToLibraryToLinkList(libraryToLinkWrappers.build()))
+          NestedSetBuilder.<LinkerInputs.LibraryToLink>linkOrder()
+              .addAll(convertLibraryToLinkListToLibraryToLinkList(librariesToLink.build()))
               .build();
     }
 
@@ -700,7 +697,7 @@
     // Get the set of object files and libraries containing the correct
     // inputs for this link, depending on whether this is LTO indexing or
     // a native link.
-    NestedSet<LibraryToLink> uniqueLibraries;
+    NestedSet<LinkerInputs.LibraryToLink> uniqueLibraries;
     ImmutableSet<LinkerInput> objectFileInputs;
     ImmutableSet<LinkerInput> linkstampObjectFileInputs;
     if (isLtoIndexing) {
@@ -737,7 +734,7 @@
             .addAll(objectArtifacts)
             .addAll(linkstampObjectArtifacts)
             .build();
-    final LibraryToLink outputLibrary =
+    final LinkerInputs.LibraryToLink outputLibrary =
         linkType.isExecutable()
             ? null
             : LinkerInputs.newInputLibrary(
@@ -752,7 +749,7 @@
                     : LtoCompilationContext.EMPTY,
                 createSharedNonLtoArtifacts(isLtoIndexing),
                 /* mustKeepDebug= */ false);
-    final LibraryToLink interfaceOutputLibrary =
+    final LinkerInputs.LibraryToLink interfaceOutputLibrary =
         (interfaceOutput == null)
             ? null
             : LinkerInputs.newInputLibrary(
@@ -1355,7 +1352,7 @@
     return this;
   }
 
-  private void checkLibrary(LibraryToLink input) {
+  private void checkLibrary(LinkerInputs.LibraryToLink input) {
     String name = input.getArtifact().getFilename();
     Preconditions.checkArgument(
         Link.ARCHIVE_LIBRARY_FILETYPES.matches(name) || Link.SHARED_LIBRARY_FILETYPES.matches(name),
@@ -1368,7 +1365,7 @@
    * library. Note that all directly added libraries are implicitly ordered before all nested sets
    * added with {@link #addLibraries}, even if added in the opposite order.
    */
-  public CppLinkActionBuilder addLibrary(LibraryToLink input) {
+  public CppLinkActionBuilder addLibrary(LinkerInputs.LibraryToLink input) {
     checkLibrary(input);
     libraries.add(input);
     if (input.isMustKeepDebug()) {
@@ -1381,9 +1378,9 @@
    * Adds multiple artifact to the set of inputs. The artifacts must be archives or shared
    * libraries.
    */
-  public CppLinkActionBuilder addLibraries(Iterable<LibraryToLink> inputs) {
-    Preconditions.checkState(libraryToLinkWrappers.isEmpty());
-    for (LibraryToLink input : inputs) {
+  public CppLinkActionBuilder addLibraries(Iterable<LinkerInputs.LibraryToLink> inputs) {
+    Preconditions.checkState(librariesToLink.isEmpty());
+    for (LinkerInputs.LibraryToLink input : inputs) {
       checkLibrary(input);
       if (input.isMustKeepDebug()) {
         mustKeepDebug = true;
@@ -1393,14 +1390,14 @@
     return this;
   }
 
-  public CppLinkActionBuilder addLibraryToLinkWrappers(Iterable<LibraryToLinkWrapper> inputs) {
+  public CppLinkActionBuilder addLibrariesToLink(Iterable<LibraryToLink> inputs) {
     Preconditions.checkState(libraries.isEmpty());
-    for (LibraryToLinkWrapper input : inputs) {
+    for (LibraryToLink input : inputs) {
       if (input.getMustKeepDebug()) {
         mustKeepDebug = true;
       }
     }
-    this.libraryToLinkWrappers.addAll(inputs);
+    this.librariesToLink.addAll(inputs);
     return this;
   }
 
@@ -1472,7 +1469,7 @@
    * #addLibraries}, and {@link #addLinkstamps}.
    */
   public CppLinkActionBuilder addLinkParams(
-      List<LibraryToLink> libraries,
+      List<LinkerInputs.LibraryToLink> libraries,
       List<String> userLinkFlags,
       List<Linkstamp> linkstamps,
       List<Artifact> nonCodeInputs,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibraries.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibraries.java
index 9f53944..ec2ef03 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibraries.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibraries.java
@@ -106,7 +106,7 @@
   public BuildLibraryOutput buildLibraries(
       RuleContext ruleContext, boolean staticMode, boolean forDynamicLibrary)
       throws InterruptedException, RuleErrorException {
-    NestedSetBuilder<LibraryToLinkWrapper> librariesToLink = NestedSetBuilder.linkOrder();
+    NestedSetBuilder<LibraryToLink> librariesToLink = NestedSetBuilder.linkOrder();
     NestedSetBuilder<Artifact> runtimeLibraries = NestedSetBuilder.linkOrder();
     for (ExtraLinkTimeLibrary extraLibrary : getExtraLibraries()) {
       BuildLibraryOutput buildLibraryOutput =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java
index 28722fb..4dc742a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java
@@ -33,16 +33,16 @@
 
   /** Output of {@link #buildLibraries}. Pair of libraries to link and runtime libraries. */
   class BuildLibraryOutput {
-    public NestedSet<LibraryToLinkWrapper> librariesToLink;
+    public NestedSet<LibraryToLink> librariesToLink;
     public NestedSet<Artifact> runtimeLibraries;
 
     public BuildLibraryOutput(
-        NestedSet<LibraryToLinkWrapper> librariesToLink, NestedSet<Artifact> runtimeLibraries) {
+        NestedSet<LibraryToLink> librariesToLink, NestedSet<Artifact> runtimeLibraries) {
       this.librariesToLink = librariesToLink;
       this.runtimeLibraries = runtimeLibraries;
     }
 
-    public NestedSet<LibraryToLinkWrapper> getLibrariesToLink() {
+    public NestedSet<LibraryToLink> getLibrariesToLink() {
       return librariesToLink;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkWrapper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
similarity index 84%
rename from src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkWrapper.java
rename to src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
index 02503cb..eb5138d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkWrapper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
@@ -29,10 +29,9 @@
 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.LibraryToLink;
 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.LibraryToLinkWrapperApi;
+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;
@@ -51,23 +50,20 @@
  * dynamic params for executable and dynamic params for dynamic library.
  */
 @AutoValue
-public abstract class LibraryToLinkWrapper implements LibraryToLinkWrapperApi<Artifact> {
+public abstract class LibraryToLink implements LibraryToLinkApi<Artifact> {
 
-  public static List<LibraryToLink> convertLibraryToLinkWrapperListToLibraryToLinkList(
-      NestedSet<LibraryToLinkWrapper> libraryToLinkWrappers,
-      boolean staticMode,
-      boolean forDynamicLibrary) {
-    ImmutableList.Builder<LibraryToLink> librariesToLink = ImmutableList.builder();
-    for (LibraryToLinkWrapper libraryToLinkWrapper : libraryToLinkWrappers) {
-      LibraryToLink staticLibraryToLink =
-          libraryToLinkWrapper.getStaticLibrary() == null
+  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
-              : libraryToLinkWrapper.getStaticLibraryToLink();
-      LibraryToLink picStaticLibraryToLink =
-          libraryToLinkWrapper.getPicStaticLibrary() == null
-              ? null
-              : libraryToLinkWrapper.getPicStaticLibraryToLink();
-      LibraryToLink libraryToLinkToUse = null;
+              : libraryToLink.getPicStaticLibraryToLink();
+      LinkerInputs.LibraryToLink libraryToLinkToUse = null;
       if (staticMode) {
         if (forDynamicLibrary) {
           if (picStaticLibraryToLink != null) {
@@ -83,17 +79,17 @@
           }
         }
         if (libraryToLinkToUse == null) {
-          if (libraryToLinkWrapper.getInterfaceLibrary() != null) {
-            libraryToLinkToUse = libraryToLinkWrapper.getInterfaceLibraryToLink();
-          } else if (libraryToLinkWrapper.getDynamicLibrary() != null) {
-            libraryToLinkToUse = libraryToLinkWrapper.getDynamicLibraryToLink();
+          if (libraryToLink.getInterfaceLibrary() != null) {
+            libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
+          } else if (libraryToLink.getDynamicLibrary() != null) {
+            libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
           }
         }
       } else {
-        if (libraryToLinkWrapper.getInterfaceLibrary() != null) {
-          libraryToLinkToUse = libraryToLinkWrapper.getInterfaceLibraryToLink();
-        } else if (libraryToLinkWrapper.getDynamicLibrary() != null) {
-          libraryToLinkToUse = libraryToLinkWrapper.getDynamicLibraryToLink();
+        if (libraryToLink.getInterfaceLibrary() != null) {
+          libraryToLinkToUse = libraryToLink.getInterfaceLibraryToLink();
+        } else if (libraryToLink.getDynamicLibrary() != null) {
+          libraryToLinkToUse = libraryToLink.getDynamicLibraryToLink();
         }
         if (libraryToLinkToUse == null) {
           if (forDynamicLibrary) {
@@ -112,9 +108,9 @@
         }
       }
       Preconditions.checkNotNull(libraryToLinkToUse);
-      librariesToLink.add(libraryToLinkToUse);
+      librariesToLinkBuilder.add(libraryToLinkToUse);
     }
-    return librariesToLink.build();
+    return librariesToLinkBuilder.build();
   }
 
   public Artifact getDynamicLibraryForRuntimeOrNull(boolean linkingStatically) {
@@ -242,14 +238,14 @@
       }
     }
 
-    private final NestedSet<LibraryToLinkWrapper> libraries;
+    private final NestedSet<LibraryToLink> libraries;
     private final NestedSet<LinkOptions> userLinkFlags;
     private final NestedSet<Linkstamp> linkstamps;
     private final NestedSet<Artifact> nonCodeInputs;
     private final ExtraLinkTimeLibraries extraLinkTimeLibraries;
 
     public CcLinkingContext(
-        NestedSet<LibraryToLinkWrapper> libraries,
+        NestedSet<LibraryToLink> libraries,
         NestedSet<LinkOptions> userLinkFlags,
         NestedSet<Linkstamp> linkstamps,
         NestedSet<Artifact> nonCodeInputs,
@@ -281,15 +277,15 @@
 
     public List<Artifact> getStaticModeParamsForExecutableLibraries() {
       ImmutableList.Builder<Artifact> libraryListBuilder = ImmutableList.builder();
-      for (LibraryToLinkWrapper libraryToLinkWrapper : getLibraries()) {
-        if (libraryToLinkWrapper.getStaticLibrary() != null) {
-          libraryListBuilder.add(libraryToLinkWrapper.getStaticLibrary());
-        } else if (libraryToLinkWrapper.getPicStaticLibrary() != null) {
-          libraryListBuilder.add(libraryToLinkWrapper.getPicStaticLibrary());
-        } else if (libraryToLinkWrapper.getInterfaceLibrary() != null) {
-          libraryListBuilder.add(libraryToLinkWrapper.getInterfaceLibrary());
+      for (LibraryToLink libraryToLink : getLibraries()) {
+        if (libraryToLink.getStaticLibrary() != null) {
+          libraryListBuilder.add(libraryToLink.getStaticLibrary());
+        } else if (libraryToLink.getPicStaticLibrary() != null) {
+          libraryListBuilder.add(libraryToLink.getPicStaticLibrary());
+        } else if (libraryToLink.getInterfaceLibrary() != null) {
+          libraryListBuilder.add(libraryToLink.getInterfaceLibrary());
         } else {
-          libraryListBuilder.add(libraryToLinkWrapper.getDynamicLibrary());
+          libraryListBuilder.add(libraryToLink.getDynamicLibrary());
         }
       }
       return libraryListBuilder.build();
@@ -297,7 +293,7 @@
 
     public List<Artifact> getStaticModeParamsForDynamicLibraryLibraries() {
       ImmutableList.Builder<Artifact> artifactListBuilder = ImmutableList.builder();
-      for (LibraryToLinkWrapper library : getLibraries()) {
+      for (LibraryToLink library : getLibraries()) {
         if (library.getPicStaticLibrary() != null) {
           artifactListBuilder.add(library.getPicStaticLibrary());
         } else if (library.getStaticLibrary() != null) {
@@ -313,7 +309,7 @@
 
     public List<Artifact> getDynamicModeParamsForExecutableLibraries() {
       ImmutableList.Builder<Artifact> artifactListBuilder = ImmutableList.builder();
-      for (LibraryToLinkWrapper library : getLibraries()) {
+      for (LibraryToLink library : getLibraries()) {
         if (library.getInterfaceLibrary() != null) {
           artifactListBuilder.add(library.getInterfaceLibrary());
         } else if (library.getDynamicLibrary() != null) {
@@ -329,7 +325,7 @@
 
     public List<Artifact> getDynamicModeParamsForDynamicLibraryLibraries() {
       ImmutableList.Builder<Artifact> artifactListBuilder = ImmutableList.builder();
-      for (LibraryToLinkWrapper library : getLibraries()) {
+      for (LibraryToLink library : getLibraries()) {
         if (library.getInterfaceLibrary() != null) {
           artifactListBuilder.add(library.getInterfaceLibrary());
         } else if (library.getDynamicLibrary() != null) {
@@ -344,10 +340,10 @@
     }
 
     public List<Artifact> getDynamicLibrariesForRuntime(boolean linkingStatically) {
-      return LibraryToLinkWrapper.getDynamicLibrariesForRuntime(linkingStatically, libraries);
+      return LibraryToLink.getDynamicLibrariesForRuntime(linkingStatically, libraries);
     }
 
-    public NestedSet<LibraryToLinkWrapper> getLibraries() {
+    public NestedSet<LibraryToLink> getLibraries() {
       return libraries;
     }
 
@@ -357,7 +353,7 @@
     }
 
     @Override
-    public SkylarkList<LibraryToLinkWrapperApi> getSkylarkLibrariesToLink() {
+    public SkylarkList<LibraryToLinkApi> getSkylarkLibrariesToLink() {
       return SkylarkList.createImmutable(libraries.toList());
     }
 
@@ -390,13 +386,13 @@
 
     /** Builder for {@link CcLinkingContext}. */
     public static class Builder {
-      private final NestedSetBuilder<LibraryToLinkWrapper> libraries = NestedSetBuilder.linkOrder();
+      private final NestedSetBuilder<LibraryToLink> libraries = NestedSetBuilder.linkOrder();
       private final NestedSetBuilder<LinkOptions> userLinkFlags = NestedSetBuilder.linkOrder();
       private final NestedSetBuilder<Linkstamp> linkstamps = NestedSetBuilder.compileOrder();
       private final NestedSetBuilder<Artifact> nonCodeInputs = NestedSetBuilder.linkOrder();
       private ExtraLinkTimeLibraries extraLinkTimeLibraries = null;
 
-      public Builder addLibraries(NestedSet<LibraryToLinkWrapper> libraries) {
+      public Builder addLibraries(NestedSet<LibraryToLink> libraries) {
         this.libraries.addTransitive(libraries);
         return this;
       }
@@ -467,10 +463,10 @@
     }
   }
 
-  private LibraryToLink picStaticLibraryToLink;
-  private LibraryToLink staticLibraryToLink;
-  private LibraryToLink dynamicLibraryToLink;
-  private LibraryToLink interfaceLibraryToLink;
+  private LinkerInputs.LibraryToLink picStaticLibraryToLink;
+  private LinkerInputs.LibraryToLink staticLibraryToLink;
+  private LinkerInputs.LibraryToLink dynamicLibraryToLink;
+  private LinkerInputs.LibraryToLink interfaceLibraryToLink;
 
   public abstract String getLibraryIdentifier();
 
@@ -524,17 +520,15 @@
   abstract boolean getMustKeepDebug();
 
   public static Builder builder() {
-    return new AutoValue_LibraryToLinkWrapper.Builder()
-        .setMustKeepDebug(false)
-        .setAlwayslink(false);
+    return new AutoValue_LibraryToLink.Builder().setMustKeepDebug(false).setAlwayslink(false);
   }
 
   @Nullable
   @SuppressWarnings("ReferenceEquality")
   static String setDynamicArtifactsAndReturnIdentifier(
-      LibraryToLinkWrapper.Builder libraryToLinkWrapperBuilder,
-      LibraryToLink dynamicModeParamsForExecutableEntry,
-      LibraryToLink dynamicModeParamsForDynamicLibraryEntry,
+      LibraryToLink.Builder libraryToLinkBuilder,
+      LinkerInputs.LibraryToLink dynamicModeParamsForExecutableEntry,
+      LinkerInputs.LibraryToLink dynamicModeParamsForDynamicLibraryEntry,
       ListIterator<Artifact> runtimeLibraryIterator) {
     Preconditions.checkNotNull(runtimeLibraryIterator);
     Artifact artifact = dynamicModeParamsForExecutableEntry.getArtifact();
@@ -579,29 +573,29 @@
         if (ArtifactCategory.INTERFACE_LIBRARY
             .getAllowedExtensions()
             .contains("." + artifact.getExtension())) {
-          libraryToLinkWrapperBuilder.setInterfaceLibrary(artifact);
-          libraryToLinkWrapperBuilder.setResolvedSymlinkInterfaceLibrary(
+          libraryToLinkBuilder.setInterfaceLibrary(artifact);
+          libraryToLinkBuilder.setResolvedSymlinkInterfaceLibrary(
               dynamicModeParamsForExecutableEntry.getOriginalLibraryArtifact());
           if (runtimeArtifact != null) {
-            libraryToLinkWrapperBuilder.setDynamicLibrary(runtimeArtifact);
+            libraryToLinkBuilder.setDynamicLibrary(runtimeArtifact);
           }
         } else {
           Preconditions.checkState(runtimeArtifact == null || artifact == runtimeArtifact);
-          libraryToLinkWrapperBuilder.setDynamicLibrary(artifact);
-          libraryToLinkWrapperBuilder.setResolvedSymlinkDynamicLibrary(
+          libraryToLinkBuilder.setDynamicLibrary(artifact);
+          libraryToLinkBuilder.setResolvedSymlinkDynamicLibrary(
               dynamicModeParamsForExecutableEntry.getOriginalLibraryArtifact());
         }
       } else {
-        libraryToLinkWrapperBuilder.setDynamicLibrary(artifact);
+        libraryToLinkBuilder.setDynamicLibrary(artifact);
         Preconditions.checkState(runtimeArtifact == null || artifact == runtimeArtifact);
       }
     } else if (dynamicModeParamsForExecutableEntry.getArtifactCategory()
         == ArtifactCategory.INTERFACE_LIBRARY) {
       Preconditions.checkState(
           !(dynamicModeParamsForExecutableEntry instanceof SolibLibraryToLink));
-      libraryToLinkWrapperBuilder.setInterfaceLibrary(artifact);
+      libraryToLinkBuilder.setInterfaceLibrary(artifact);
       if (runtimeArtifact != null) {
-        libraryToLinkWrapperBuilder.setDynamicLibrary(runtimeArtifact);
+        libraryToLinkBuilder.setDynamicLibrary(runtimeArtifact);
       }
     }
     return libraryIdentifier;
@@ -623,7 +617,7 @@
     return currentWithoutExtension;
   }
 
-  LibraryToLink getStaticLibraryToLink() {
+  LinkerInputs.LibraryToLink getStaticLibraryToLink() {
     Preconditions.checkNotNull(getStaticLibrary(), this);
     if (staticLibraryToLink != null) {
       return staticLibraryToLink;
@@ -642,7 +636,7 @@
     return staticLibraryToLink;
   }
 
-  LibraryToLink getPicStaticLibraryToLink() {
+  LinkerInputs.LibraryToLink getPicStaticLibraryToLink() {
     Preconditions.checkNotNull(getPicStaticLibrary(), this);
     if (picStaticLibraryToLink != null) {
       return picStaticLibraryToLink;
@@ -661,7 +655,7 @@
     return picStaticLibraryToLink;
   }
 
-  LibraryToLink getDynamicLibraryToLink() {
+  LinkerInputs.LibraryToLink getDynamicLibraryToLink() {
     Preconditions.checkNotNull(getDynamicLibrary(), this);
     if (dynamicLibraryToLink != null) {
       return dynamicLibraryToLink;
@@ -684,7 +678,7 @@
     return dynamicLibraryToLink;
   }
 
-  LibraryToLink getInterfaceLibraryToLink() {
+  LinkerInputs.LibraryToLink getInterfaceLibraryToLink() {
     Preconditions.checkNotNull(getInterfaceLibrary());
     if (interfaceLibraryToLink != null) {
       return interfaceLibraryToLink;
@@ -708,10 +702,10 @@
   }
 
   public static List<Artifact> getDynamicLibrariesForRuntime(
-      boolean linkingStatically, Iterable<LibraryToLinkWrapper> libraries) {
+      boolean linkingStatically, Iterable<LibraryToLink> libraries) {
     ImmutableList.Builder<Artifact> dynamicLibrariesForRuntimeBuilder = ImmutableList.builder();
-    for (LibraryToLinkWrapper libraryToLinkWrapper : libraries) {
-      Artifact artifact = libraryToLinkWrapper.getDynamicLibraryForRuntimeOrNull(linkingStatically);
+    for (LibraryToLink libraryToLink : libraries) {
+      Artifact artifact = libraryToLink.getDynamicLibraryForRuntimeOrNull(linkingStatically);
       if (artifact != null) {
         dynamicLibrariesForRuntimeBuilder.add(artifact);
       }
@@ -719,20 +713,19 @@
     return dynamicLibrariesForRuntimeBuilder.build();
   }
 
-  public static List<Artifact> getDynamicLibrariesForLinking(
-      Iterable<LibraryToLinkWrapper> libraries) {
+  public static List<Artifact> getDynamicLibrariesForLinking(Iterable<LibraryToLink> libraries) {
     ImmutableList.Builder<Artifact> dynamicLibrariesForLinkingBuilder = ImmutableList.builder();
-    for (LibraryToLinkWrapper libraryToLinkWrapper : libraries) {
-      if (libraryToLinkWrapper.getInterfaceLibrary() != null) {
-        dynamicLibrariesForLinkingBuilder.add(libraryToLinkWrapper.getInterfaceLibrary());
-      } else if (libraryToLinkWrapper.getDynamicLibrary() != null) {
-        dynamicLibrariesForLinkingBuilder.add(libraryToLinkWrapper.getDynamicLibrary());
+    for (LibraryToLink libraryToLink : libraries) {
+      if (libraryToLink.getInterfaceLibrary() != null) {
+        dynamicLibrariesForLinkingBuilder.add(libraryToLink.getInterfaceLibrary());
+      } else if (libraryToLink.getDynamicLibrary() != null) {
+        dynamicLibrariesForLinkingBuilder.add(libraryToLink.getDynamicLibrary());
       }
     }
     return dynamicLibrariesForLinkingBuilder.build();
   }
 
-  /** Builder for LibraryToLinkWrapper. */
+  /** Builder for LibraryToLink. */
   @AutoValue.Builder
   public abstract static class Builder {
 
@@ -769,7 +762,7 @@
     public abstract Builder setMustKeepDebug(boolean mustKeepDebug);
 
     // Methods just for validation, not to be called externally.
-    abstract LibraryToLinkWrapper autoBuild();
+    abstract LibraryToLink autoBuild();
 
     abstract String getLibraryIdentifier();
 
@@ -797,7 +790,7 @@
 
     abstract Artifact getResolvedSymlinkInterfaceLibrary();
 
-    public LibraryToLinkWrapper build() {
+    public LibraryToLink build() {
       Preconditions.checkNotNull(getLibraryIdentifier());
       Preconditions.checkState(
           (getObjectFiles() == null
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
index 4c6845c..ba9510b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
@@ -57,8 +57,8 @@
 import com.google.devtools.build.lib.rules.cpp.CppHelper;
 import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
 import com.google.devtools.build.lib.rules.cpp.CppSemantics;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.rules.proto.ProtoCommon;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.Exports;
@@ -212,18 +212,18 @@
         ccLinkingHelper.emitInterfaceSharedLibraries(true);
       }
 
-      ImmutableList<LibraryToLinkWrapper> libraryToLinkWrapper = ImmutableList.of();
+      ImmutableList<LibraryToLink> libraryToLink = ImmutableList.of();
       if (!ccCompilationOutputs.isEmpty()) {
         CcLinkingOutputs ccLinkingOutputs = ccLinkingHelper.link(ccCompilationOutputs);
         if (!ccLinkingOutputs.isEmpty()) {
-          libraryToLinkWrapper = ImmutableList.of(ccLinkingOutputs.getLibraryToLink());
+          libraryToLink = ImmutableList.of(ccLinkingOutputs.getLibraryToLink());
         }
       }
       CcNativeLibraryProvider ccNativeLibraryProvider =
-          CppHelper.collectNativeCcLibraries(deps, libraryToLinkWrapper);
+          CppHelper.collectNativeCcLibraries(deps, libraryToLink);
       CcLinkingContext ccLinkingContext =
-          ccLinkingHelper.buildCcLinkingContextFromLibraryToLinkWrappers(
-              libraryToLinkWrapper, compilationInfo.getCcCompilationContext());
+          ccLinkingHelper.buildCcLinkingContextFromLibrariesToLink(
+              libraryToLink, compilationInfo.getCcCompilationContext());
 
       CppDebugFileProvider cppDebugFileProvider =
           CcCompilationHelper.buildCppDebugFileProvider(
@@ -243,8 +243,8 @@
               CcCompilationHelper.buildOutputGroups(compilationInfo.getCcCompilationOutputs()));
       // On Windows, dynamic library is not built by default, so don't add them to filesToBuild.
 
-      if (!libraryToLinkWrapper.isEmpty()) {
-        LibraryToLinkWrapper artifactsToBuild = libraryToLinkWrapper.get(0);
+      if (!libraryToLink.isEmpty()) {
+        LibraryToLink artifactsToBuild = libraryToLink.get(0);
         if (artifactsToBuild.getStaticLibrary() != null) {
           filesBuilder.add(artifactsToBuild.getStaticLibrary());
         }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index 988be2b..e94868d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -48,7 +48,7 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CppHelper;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider.ClasspathType;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
 import com.google.devtools.build.lib.rules.java.ProguardHelper.ProguardOutput;
@@ -650,9 +650,9 @@
    */
   public static Collection<Artifact> collectNativeLibraries(
       Iterable<? extends TransitiveInfoCollection> deps) {
-    NestedSet<LibraryToLinkWrapper> linkerInputs =
+    NestedSet<LibraryToLink> linkerInputs =
         new NativeLibraryNestedSetBuilder().addJavaTargets(deps).build();
-    return LibraryToLinkWrapper.getDynamicLibrariesForLinking(linkerInputs);
+    return LibraryToLink.getDynamicLibrariesForLinking(linkerInputs);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index db00038..d47425a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -45,7 +45,7 @@
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.packages.TargetUtils;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider.ClasspathType;
 import com.google.devtools.build.lib.rules.java.JavaPluginInfoProvider.JavaPluginInfo;
 import com.google.devtools.build.lib.syntax.Type;
@@ -358,7 +358,7 @@
    *
    * @see JavaNativeLibraryProvider
    */
-  protected NestedSet<LibraryToLinkWrapper> collectTransitiveJavaNativeLibraries() {
+  protected NestedSet<LibraryToLink> collectTransitiveJavaNativeLibraries() {
     NativeLibraryNestedSetBuilder builder = new NativeLibraryNestedSetBuilder();
     builder.addJavaTargets(targetsTreatedAsDeps(ClasspathType.BOTH));
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
index 7e56364..d0322f8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
@@ -31,7 +31,7 @@
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
@@ -78,7 +78,7 @@
     JavaCompilationArtifacts javaArtifacts = collectJavaArtifacts(jars, interfaceJars);
     common.setJavaCompilationArtifacts(javaArtifacts);
 
-    NestedSet<LibraryToLinkWrapper> transitiveJavaNativeLibraries =
+    NestedSet<LibraryToLink> transitiveJavaNativeLibraries =
         common.collectTransitiveJavaNativeLibraries();
     boolean neverLink = JavaCommon.isNeverLink(ruleContext);
     JavaCompilationArgsProvider javaCompilationArgs =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
index 7216dc9..5464f3d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider.ClasspathType;
 import com.google.devtools.build.lib.rules.java.proto.GeneratedExtensionRegistryProvider;
 
@@ -165,7 +165,7 @@
         new JavaStrictCompilationArgsProvider(
             common.collectJavaCompilationArgs(
                 neverLink, /* srcLessDepsExport= */ false, /* javaProtoLibraryStrictDeps= */ true));
-    NestedSet<LibraryToLinkWrapper> transitiveJavaNativeLibraries =
+    NestedSet<LibraryToLink> transitiveJavaNativeLibraries =
         common.collectTransitiveJavaNativeLibraries();
 
     RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryProvider.java
index e9cf460..c22b68e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryProvider.java
@@ -18,7 +18,7 @@
 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.LibraryToLinkWrapper;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 
 /**
@@ -29,9 +29,9 @@
 @AutoCodec
 public final class JavaNativeLibraryProvider implements TransitiveInfoProvider {
 
-  private final NestedSet<LibraryToLinkWrapper> transitiveJavaNativeLibraries;
+  private final NestedSet<LibraryToLink> transitiveJavaNativeLibraries;
 
-  public JavaNativeLibraryProvider(NestedSet<LibraryToLinkWrapper> transitiveJavaNativeLibraries) {
+  public JavaNativeLibraryProvider(NestedSet<LibraryToLink> transitiveJavaNativeLibraries) {
     this.transitiveJavaNativeLibraries = transitiveJavaNativeLibraries;
   }
 
@@ -39,12 +39,12 @@
    * Collects native libraries in the transitive closure of its deps that are needed for executing
    * Java code.
    */
-  public NestedSet<LibraryToLinkWrapper> getTransitiveJavaNativeLibraries() {
+  public NestedSet<LibraryToLink> getTransitiveJavaNativeLibraries() {
     return transitiveJavaNativeLibraries;
   }
 
   public static JavaNativeLibraryProvider merge(Iterable<JavaNativeLibraryProvider> deps) {
-    NestedSetBuilder<LibraryToLinkWrapper> transitiveSourceJars = NestedSetBuilder.stableOrder();
+    NestedSetBuilder<LibraryToLink> transitiveSourceJars = NestedSetBuilder.stableOrder();
 
     for (JavaNativeLibraryProvider wrapper : deps) {
       transitiveSourceJars.addTransitive(wrapper.getTransitiveJavaNativeLibraries());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java
index 6648387..8598750 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java
@@ -22,21 +22,21 @@
 import com.google.devtools.build.lib.rules.cpp.CcLinkingOutputs;
 import com.google.devtools.build.lib.rules.cpp.CcNativeLibraryProvider;
 import com.google.devtools.build.lib.rules.cpp.CppFileTypes;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.util.FileType;
 
 /** A builder that helps construct nested sets of native libraries. */
 public final class NativeLibraryNestedSetBuilder {
 
-  private final NestedSetBuilder<LibraryToLinkWrapper> builder = NestedSetBuilder.linkOrder();
+  private final NestedSetBuilder<LibraryToLink> builder = NestedSetBuilder.linkOrder();
 
   /** Build a nested set of native libraries. */
-  public NestedSet<LibraryToLinkWrapper> build() {
+  public NestedSet<LibraryToLink> build() {
     return builder.build();
   }
 
   /** Include specified artifacts as native libraries in the nested set. */
-  public NativeLibraryNestedSetBuilder addAll(Iterable<LibraryToLinkWrapper> deps) {
+  public NativeLibraryNestedSetBuilder addAll(Iterable<LibraryToLink> deps) {
     builder.addAll(deps);
     return this;
   }
@@ -94,7 +94,7 @@
         FileType.filterList(
             dep.getProvider(FileProvider.class).getFilesToBuild(), CppFileTypes.SHARED_LIBRARY)) {
       builder.add(
-          LibraryToLinkWrapper.builder()
+          LibraryToLink.builder()
               .setLibraryIdentifier(CcLinkingOutputs.libraryIdentifierOf(artifact))
               .setDynamicLibrary(artifact)
               .build());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
index 56cff9b..ce5d87d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
@@ -43,9 +43,9 @@
 import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
 import com.google.devtools.build.lib.rules.cpp.CppSemantics;
 import com.google.devtools.build.lib.rules.cpp.FdoContext;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext.Linkstamp;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext.Linkstamp;
 import com.google.devtools.build.lib.rules.cpp.Link;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
@@ -148,8 +148,8 @@
   }
 
   /** Determines if there is any code to be linked in the input iterable. */
-  private static boolean containsCodeToLink(Iterable<LibraryToLinkWrapper> libraries) {
-    for (LibraryToLinkWrapper library : libraries) {
+  private static boolean containsCodeToLink(Iterable<LibraryToLink> libraries) {
+    for (LibraryToLink library : libraries) {
       if (containsCodeToLink(library)) {
         return true;
       }
@@ -158,7 +158,7 @@
   }
 
   /** Determines if the input library is or contains an archive which must be linked. */
-  private static boolean containsCodeToLink(LibraryToLinkWrapper library) {
+  private static boolean containsCodeToLink(LibraryToLink library) {
     if (library.getStaticLibrary() == null && library.getPicStaticLibrary() == null) {
       // this is a shared library so we're going to have to copy it
       return false;
@@ -210,7 +210,7 @@
             ruleContext, CppBuildInfo.KEY, configuration);
 
     boolean shareNativeDeps = configuration.getFragment(CppConfiguration.class).shareNativeDeps();
-    NestedSet<LibraryToLinkWrapper> linkerInputs = ccLinkingContext.getLibraries();
+    NestedSet<LibraryToLink> linkerInputs = ccLinkingContext.getLibraries();
     Artifact sharedLibrary;
     if (shareNativeDeps) {
       PathFragment sharedPath =
@@ -262,7 +262,7 @@
           toolchain.getStaticRuntimeLinkInputs(ruleContext, featureConfiguration));
     }
     LtoCompilationContext.Builder ltoCompilationContext = new LtoCompilationContext.Builder();
-    for (LibraryToLinkWrapper lib : linkerInputs) {
+    for (LibraryToLink lib : linkerInputs) {
       if (lib.getPicLtoCompilationContext() != null
           && !lib.getPicLtoCompilationContext().isEmpty()) {
         ltoCompilationContext.addAll(lib.getPicLtoCompilationContext());
@@ -280,7 +280,7 @@
     builder
         .setLinkArtifactFactory(SHAREABLE_LINK_ARTIFACT_FACTORY)
         .setLinkerFiles(toolchain.getLinkerFiles())
-        .addLibraryToLinkWrappers(linkerInputs)
+        .addLibrariesToLink(linkerInputs)
         .setLinkType(LinkTargetType.DYNAMIC_LIBRARY)
         .setLinkingMode(LinkingMode.STATIC)
         .setLibraryIdentifier(libraryIdentifier)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index 095eb60..f6df9f6e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -70,8 +70,8 @@
 import com.google.devtools.build.lib.rules.cpp.CcInfo;
 import com.google.devtools.build.lib.rules.cpp.CppFileTypes;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.util.FileType;
@@ -455,7 +455,7 @@
             .addAll(LINKOPT, nonFrameworkLinkOpts.build())
             .addTransitiveAndPropagate(
                 CC_LIBRARY,
-                NestedSetBuilder.<LibraryToLinkWrapper>linkOrder()
+                NestedSetBuilder.<LibraryToLink>linkOrder()
                     .addTransitive(linkProvider.getLibraries())
                     .build());
       }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index 6f97111..7a52350 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -27,9 +27,9 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
 import com.google.devtools.build.lib.rules.cpp.CcInfo;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext.LinkOptions;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext.LinkOptions;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -126,11 +126,11 @@
 
   private CcLinkingContext buildCcLinkingContext(
       ObjcCommon common, SymbolGenerator<?> symbolGenerator) {
-    ImmutableSet.Builder<LibraryToLinkWrapper> libraries = new ImmutableSet.Builder<>();
+    ImmutableSet.Builder<LibraryToLink> libraries = new ImmutableSet.Builder<>();
     ObjcProvider objcProvider = common.getObjcProvider();
     for (Artifact library : objcProvider.get(ObjcProvider.LIBRARY)) {
       libraries.add(
-          LibraryToLinkWrapper.builder()
+          LibraryToLink.builder()
               .setStaticLibrary(library)
               .setLibraryIdentifier(
                   FileSystemUtils.removeExtension(library.getRootRelativePathString()))
@@ -141,9 +141,7 @@
     CcLinkingContext.Builder ccLinkingContext =
         CcLinkingContext.builder()
             .addLibraries(
-                NestedSetBuilder.<LibraryToLinkWrapper>linkOrder()
-                    .addAll(libraries.build())
-                    .build());
+                NestedSetBuilder.<LibraryToLink>linkOrder().addAll(libraries.build()).build());
 
     NestedSetBuilder<LinkOptions> userLinkFlags = NestedSetBuilder.linkOrder();
     for (SdkFramework sdkFramework : objcProvider.get(ObjcProvider.SDK_FRAMEWORK)) {
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 f9ab015..0e532ed 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
@@ -35,9 +35,8 @@
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.packages.NativeProvider.WithLegacySkylarkName;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
-import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.skylarkbuildapi.apple.ObjcProviderApi;
 import com.google.devtools.build.lib.syntax.EvalUtils;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
@@ -293,8 +292,8 @@
   public static final Key<Artifact> STRINGS = new Key<>(STABLE_ORDER, "strings", Artifact.class);
 
   /** Linking information from cc dependencies. */
-  public static final Key<LibraryToLinkWrapper> CC_LIBRARY =
-      new Key<>(LINK_ORDER, "cc_library", LibraryToLinkWrapper.class);
+  public static final Key<LibraryToLink> CC_LIBRARY =
+      new Key<>(LINK_ORDER, "cc_library", LibraryToLink.class);
 
   /**
    * Linking options from dependencies.
@@ -749,9 +748,9 @@
 
   /** Returns the list of .a files required for linking that arise from cc libraries. */
   List<Artifact> getCcLibraries() {
-    NestedSetBuilder<LibraryToLinkWrapper> libraryToLinkListBuilder = NestedSetBuilder.linkOrder();
-    for (LibraryToLinkWrapper libraryToLinkWrapper : get(CC_LIBRARY)) {
-      libraryToLinkListBuilder.add(libraryToLinkWrapper);
+    NestedSetBuilder<LibraryToLink> libraryToLinkListBuilder = NestedSetBuilder.linkOrder();
+    for (LibraryToLink libraryToLink : get(CC_LIBRARY)) {
+      libraryToLinkListBuilder.add(libraryToLink);
     }
     CcLinkingContext ccLinkingContext =
         CcLinkingContext.builder().addLibraries(libraryToLinkListBuilder.build()).build();
@@ -782,12 +781,13 @@
     // TODO(cpeyser): Clean up objc-cc interop.
     HashSet<PathFragment> avoidLibrariesSet = new HashSet<>();
     for (CcLinkingContext ccLinkingContext : avoidCcProviders) {
-      List<LibraryToLink> librariesToLink =
-          LibraryToLinkWrapper.convertLibraryToLinkWrapperListToLibraryToLinkList(
+      List<com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink> librariesToLink =
+          LibraryToLink.convertLibraryToLinkListToLibraryToLinkList(
               ccLinkingContext.getLibraries(),
               /* staticMode= */ true,
               /* forDynamicLibrary= */ false);
-      for (LibraryToLink libraryToLink : librariesToLink) {
+      for (com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink libraryToLink :
+          librariesToLink) {
         avoidLibrariesSet.add(libraryToLink.getArtifact().getRunfilesPath());
       }
     }
@@ -831,39 +831,38 @@
   }
 
   /**
-   * Returns a predicate which returns true for a given {@link LibraryToLinkWrapper} if the
-   * library's runfiles path is not contained in the given set.
+   * Returns a predicate which returns true for a given {@link LibraryToLink} if the library's
+   * runfiles path is not contained in the given set.
    *
    * @param runfilesPaths if a given library has runfiles path present in this set, the predicate
    *     will return false
    */
-  private static Predicate<LibraryToLinkWrapper> ccLibraryNotYetLinked(
+  private static Predicate<LibraryToLink> ccLibraryNotYetLinked(
       final HashSet<PathFragment> runfilesPaths) {
     return libraryToLink -> !checkIfLibraryIsInPaths(libraryToLink, runfilesPaths);
   }
 
   private static boolean checkIfLibraryIsInPaths(
-      LibraryToLinkWrapper libraryToLinkWrapper, HashSet<PathFragment> runfilesPaths) {
+      LibraryToLink libraryToLink, HashSet<PathFragment> runfilesPaths) {
     ImmutableList.Builder<PathFragment> libraryRunfilesPaths = ImmutableList.builder();
-    if (libraryToLinkWrapper.getStaticLibrary() != null) {
-      libraryRunfilesPaths.add(libraryToLinkWrapper.getStaticLibrary().getRunfilesPath());
+    if (libraryToLink.getStaticLibrary() != null) {
+      libraryRunfilesPaths.add(libraryToLink.getStaticLibrary().getRunfilesPath());
     }
-    if (libraryToLinkWrapper.getPicStaticLibrary() != null) {
-      libraryRunfilesPaths.add(libraryToLinkWrapper.getPicStaticLibrary().getRunfilesPath());
+    if (libraryToLink.getPicStaticLibrary() != null) {
+      libraryRunfilesPaths.add(libraryToLink.getPicStaticLibrary().getRunfilesPath());
     }
-    if (libraryToLinkWrapper.getDynamicLibrary() != null) {
-      libraryRunfilesPaths.add(libraryToLinkWrapper.getDynamicLibrary().getRunfilesPath());
+    if (libraryToLink.getDynamicLibrary() != null) {
+      libraryRunfilesPaths.add(libraryToLink.getDynamicLibrary().getRunfilesPath());
     }
-    if (libraryToLinkWrapper.getResolvedSymlinkDynamicLibrary() != null) {
+    if (libraryToLink.getResolvedSymlinkDynamicLibrary() != null) {
+      libraryRunfilesPaths.add(libraryToLink.getResolvedSymlinkDynamicLibrary().getRunfilesPath());
+    }
+    if (libraryToLink.getInterfaceLibrary() != null) {
+      libraryRunfilesPaths.add(libraryToLink.getInterfaceLibrary().getRunfilesPath());
+    }
+    if (libraryToLink.getResolvedSymlinkInterfaceLibrary() != null) {
       libraryRunfilesPaths.add(
-          libraryToLinkWrapper.getResolvedSymlinkDynamicLibrary().getRunfilesPath());
-    }
-    if (libraryToLinkWrapper.getInterfaceLibrary() != null) {
-      libraryRunfilesPaths.add(libraryToLinkWrapper.getInterfaceLibrary().getRunfilesPath());
-    }
-    if (libraryToLinkWrapper.getResolvedSymlinkInterfaceLibrary() != null) {
-      libraryRunfilesPaths.add(
-          libraryToLinkWrapper.getResolvedSymlinkInterfaceLibrary().getRunfilesPath());
+          libraryToLink.getResolvedSymlinkInterfaceLibrary().getRunfilesPath());
     }
 
     return !Collections.disjoint(libraryRunfilesPaths.build(), runfilesPaths);
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
index a97b3de..3e454c6 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
@@ -41,7 +41,7 @@
         CcCompilationOutputsT extends CcCompilationOutputsApi,
         LinkingInfoT extends LinkingInfoApi,
         LinkingContextT extends CcLinkingContextApi,
-        LibraryToLinkWrapperT extends LibraryToLinkWrapperApi,
+        LibraryToLinkT extends LibraryToLinkApi,
         CcToolchainVariablesT extends CcToolchainVariablesApi,
         CcToolchainConfigInfoT extends CcToolchainConfigInfoApi>
     extends CcModuleApi<
@@ -49,7 +49,7 @@
         FeatureConfigurationT,
         CcCompilationContextT,
         LinkingContextT,
-        LibraryToLinkWrapperT,
+        LibraryToLinkT,
         CcToolchainVariablesT,
         SkylarkRuleContextT,
         CcToolchainConfigInfoT> {
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
index ecf3d3d..a06572d 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
@@ -34,7 +34,7 @@
           ? extends CcCompilationOutputsApi,
           ? extends LinkingInfoApi,
           ? extends CcLinkingContextApi,
-          ? extends LibraryToLinkWrapperApi,
+          ? extends LibraryToLinkApi,
           ? extends CcToolchainVariablesApi,
           ? extends CcToolchainConfigInfoApi>
       ccModule;
@@ -50,7 +50,7 @@
               ? extends CcCompilationOutputsApi,
               ? extends LinkingInfoApi,
               ? extends CcLinkingContextApi,
-              ? extends LibraryToLinkWrapperApi,
+              ? extends LibraryToLinkApi,
               ? extends CcToolchainVariablesApi,
               ? extends CcToolchainConfigInfoApi>
           ccModule) {
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java
index 3d70d84..6acdc7f 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java
@@ -37,5 +37,5 @@
       name = "libraries_to_link",
       doc = "Returns the list of <code>LibraryToLink</code>.",
       structField = true)
-  SkylarkList<LibraryToLinkWrapperApi> getSkylarkLibrariesToLink();
+  SkylarkList<LibraryToLinkApi> getSkylarkLibrariesToLink();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingOutputsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingOutputsApi.java
index 0d26caa..d0c61dc 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingOutputsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingOutputsApi.java
@@ -27,5 +27,5 @@
     doc = "Helper class containing CC compilation outputs.")
 public interface CcLinkingOutputsApi<FileT extends FileApi> {
   @SkylarkCallable(name = "library_to_link", structField = true, documented = false)
-  LibraryToLinkWrapperApi<FileT> getLibraryToLink();
+  LibraryToLinkApi<FileT> getLibraryToLink();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
index 30d3856..56ad1ec 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
@@ -40,7 +40,7 @@
     FeatureConfigurationT extends FeatureConfigurationApi,
     CompilationContextT extends CcCompilationContextApi,
     LinkingContextT extends CcLinkingContextApi,
-    LibraryToLinkWrapperT extends LibraryToLinkWrapperApi,
+    LibraryToLinkT extends LibraryToLinkApi,
     CcToolchainVariablesT extends CcToolchainVariablesApi,
     SkylarkRuleContextT extends SkylarkRuleContextApi,
     CcToolchainConfigInfoT extends CcToolchainConfigInfoApi> {
@@ -550,7 +550,7 @@
             named = true,
             defaultValue = "False"),
       })
-  LibraryToLinkWrapperT createLibraryLinkerInput(
+  LibraryToLinkT createLibraryLinkerInput(
       Object actions,
       Object featureConfiguration,
       Object ccToolchainProvider,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkWrapperApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java
similarity index 97%
rename from src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkWrapperApi.java
rename to src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java
index 6da12af..9e365ef 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkWrapperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java
@@ -27,7 +27,7 @@
     name = "LibraryToLink",
     category = SkylarkModuleCategory.BUILTIN,
     doc = "A library the user can link against.")
-public interface LibraryToLinkWrapperApi<FileT extends FileApi> {
+public interface LibraryToLinkApi<FileT extends FileApi> {
   @SkylarkCallable(
       name = "static_library",
       allowReturnNones = true,
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
index c170eec..ae7a17b 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
@@ -29,7 +29,7 @@
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcToolchainVariablesApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CompilationInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.FeatureConfigurationApi;
-import com.google.devtools.build.lib.skylarkbuildapi.cpp.LibraryToLinkWrapperApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.LibraryToLinkApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.LinkingInfoApi;
 import com.google.devtools.build.lib.skylarkinterface.StarlarkContext;
 import com.google.devtools.build.lib.syntax.Environment;
@@ -50,7 +50,7 @@
         CcCompilationOutputsApi,
         LinkingInfoApi,
         CcLinkingContextApi,
-        LibraryToLinkWrapperApi,
+        LibraryToLinkApi,
         CcToolchainVariablesApi,
         CcToolchainConfigInfoApi> {
 
@@ -119,7 +119,7 @@
   }
 
   @Override
-  public LibraryToLinkWrapperApi createLibraryLinkerInput(
+  public LibraryToLinkApi createLibraryLinkerInput(
       Object actions,
       Object featureConfiguration,
       Object ccToolchainProvider,
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
index 9f36e63..ebf1bf5 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
@@ -207,7 +207,7 @@
     assertThat(getFilesToBuild(hello)).containsExactly(archive, implSharedObject,
         implInterfaceSharedObject);
     assertThat(
-            LibraryToLinkWrapper.getDynamicLibrariesForLinking(
+            LibraryToLink.getDynamicLibrariesForLinking(
                 hello.getProvider(CcNativeLibraryProvider.class).getTransitiveCcNativeLibraries()))
         .containsExactly(implInterfaceSharedObjectLink);
     assertThat(
@@ -273,7 +273,7 @@
         getSharedArtifact("_solib_" + cpu + "/libhello_Slibhello.so", hello);
     assertThat(getFilesToBuild(hello)).containsExactly(archive, sharedObject, implSharedObject);
     assertThat(
-            LibraryToLinkWrapper.getDynamicLibrariesForLinking(
+            LibraryToLink.getDynamicLibrariesForLinking(
                 hello.getProvider(CcNativeLibraryProvider.class).getTransitiveCcNativeLibraries()))
         .containsExactly(sharedObjectLink);
     assertThat(
@@ -1378,7 +1378,7 @@
     ConfiguredTarget target =
         scratchConfiguredTarget("a", "foo", "cc_library(name = 'foo', srcs = ['foo.cc'])");
 
-    LibraryToLinkWrapper library =
+    LibraryToLink library =
         Iterables.getOnlyElement(target.get(CcInfo.PROVIDER).getCcLinkingContext().getLibraries());
     Artifact libraryToUse = library.getPicStaticLibrary();
     if (libraryToUse == null) {
@@ -1395,7 +1395,7 @@
     ConfiguredTarget target =
         scratchConfiguredTarget("a", "foo", "cc_library(name = 'foo', srcs = ['libfoo.so'])");
 
-    LibraryToLinkWrapper library =
+    LibraryToLink library =
         Iterables.getOnlyElement(target.get(CcInfo.PROVIDER).getCcLinkingContext().getLibraries());
     assertThat(library.getStaticLibrary()).isNull();
     assertThat(artifactsToStrings(ImmutableList.of(library.getResolvedSymlinkDynamicLibrary())))
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
index b6c4fc3..e364bb6 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
@@ -1219,8 +1219,8 @@
     assertThat(userLinkFlags.getImmutableList())
         .containsExactly("-la", "-lc2", "-DEP2_LINKOPT", "-lc1", "-lc2", "-DEP1_LINKOPT");
     @SuppressWarnings("unchecked")
-    SkylarkList<LibraryToLinkWrapper> librariesToLink =
-        (SkylarkList<LibraryToLinkWrapper>) info.getValue("libraries_to_link", SkylarkList.class);
+    SkylarkList<LibraryToLink> librariesToLink =
+        (SkylarkList<LibraryToLink>) info.getValue("libraries_to_link", SkylarkList.class);
     assertThat(
             librariesToLink.stream()
                 .filter(x -> x.getStaticLibrary() != null)
@@ -1399,8 +1399,7 @@
     ConfiguredTarget target = getConfiguredTarget("//foo:skylark_lib");
     assertThat(target).isNotNull();
     @SuppressWarnings("unchecked")
-    SkylarkList<LibraryToLinkWrapper> libraries =
-        (SkylarkList<LibraryToLinkWrapper>) target.get("libraries");
+    SkylarkList<LibraryToLink> libraries = (SkylarkList<LibraryToLink>) target.get("libraries");
     assertThat(
             libraries.stream()
                 .map(x -> x.getResolvedSymlinkDynamicLibrary().getFilename())
@@ -1427,8 +1426,7 @@
     assertThat(getConfiguredTarget("//foo:skylark_lib")).isNotNull();
     ConfiguredTarget target = getConfiguredTarget("//foo:skylark_lib");
     @SuppressWarnings("unchecked")
-    SkylarkList<LibraryToLinkWrapper> libraries =
-        (SkylarkList<LibraryToLinkWrapper>) target.get("libraries");
+    SkylarkList<LibraryToLink> libraries = (SkylarkList<LibraryToLink>) target.get("libraries");
     assertThat(
             libraries.stream()
                 .map(x -> x.getResolvedSymlinkDynamicLibrary().getFilename())
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
index 1a34a4a..2583655 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
@@ -54,7 +54,7 @@
 import com.google.devtools.build.lib.rules.cpp.CppCompileAction;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMapAction;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -1477,9 +1477,9 @@
     Iterable<Artifact> linkerInputArtifacts =
         Iterables.transform(
             objcProvider.get(CC_LIBRARY),
-            new Function<LibraryToLinkWrapper, Artifact>() {
+            new Function<LibraryToLink, Artifact>() {
               @Override
-              public Artifact apply(LibraryToLinkWrapper library) {
+              public Artifact apply(LibraryToLink library) {
                 return library.getStaticLibrary();
               }
             });
