Make the interface dynamic library builder a regular label instead of a magic artifact.

--
PiperOrigin-RevId: 147830857
MOS_MIGRATED_REVID=147830857
diff --git a/src/BUILD b/src/BUILD
index d1887a9..c00823e 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -28,7 +28,6 @@
         "//src/main/tools:build-runfiles",
         "//src/main/tools:process-wrapper",
         "//src/main/tools:linux-sandbox",
-        "//src/main/tools:build_interface_so",
         "//tools/osx:xcode-locator",
     ] + embedded_tools,
     outs = ["install_base_key" + suffix],
@@ -190,7 +189,6 @@
         "//src/main/tools:process-wrapper",
         "//src/main/tools:jdk-support",
         "//src/main/tools:linux-sandbox",
-        "//src/main/tools:build_interface_so",
         "//tools/osx:xcode-locator",
         ":java-version",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
index 9f9a655..3c02666 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
@@ -91,11 +91,6 @@
   Artifact getFilesetArtifact(PathFragment rootRelativePath, Root root);
 
   /**
-   * Returns the artifact for the specified tool.
-   */
-  Artifact getEmbeddedToolArtifact(String embeddedPath);
-
-  /**
    * Returns the middleman factory associated with the build.
    */
   // TODO(bazel-team): remove this method and replace it with delegate methods.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index 10a9216..1f12d2c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -35,7 +35,6 @@
 import com.google.devtools.build.lib.actions.ArtifactFactory;
 import com.google.devtools.build.lib.actions.ArtifactOwner;
 import com.google.devtools.build.lib.actions.Root;
-import com.google.devtools.build.lib.analysis.config.BinTools;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
@@ -1083,14 +1082,14 @@
   @VisibleForTesting
   public RuleContext getRuleContextForTesting(
       ConfiguredTarget target, StoredEventHandler eventHandler,
-      BuildConfigurationCollection configurations, BinTools binTools)
+      BuildConfigurationCollection configurations)
           throws EvalException, InvalidConfigurationException, InterruptedException {
     BuildConfiguration targetConfig = target.getConfiguration();
     CachingAnalysisEnvironment env =
         new CachingAnalysisEnvironment(getArtifactFactory(),
             new ConfiguredTargetKey(target.getLabel(), targetConfig),
             /*isSystemEnv=*/false, targetConfig.extendedSanityChecks(), eventHandler,
-            /*skyframeEnv=*/null, targetConfig.isActionsEnabled(), binTools);
+            /*skyframeEnv=*/null, targetConfig.isActionsEnabled());
     return getRuleContextForTesting(eventHandler, target, env, configurations);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
index 5aed23d..7a768c9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
@@ -26,7 +26,6 @@
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoCollection;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BinTools;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.StoredEventHandler;
@@ -82,7 +81,6 @@
   private EventHandler errorEventListener;
   private SkyFunction.Environment skyframeEnv;
   private Map<Artifact, String> artifacts;
-  private final BinTools binTools;
 
   /**
    * The list of actions registered by the configured target this analysis environment is
@@ -92,8 +90,8 @@
 
   public CachingAnalysisEnvironment(ArtifactFactory artifactFactory,
       ArtifactOwner owner, boolean isSystemEnv, boolean extendedSanityChecks,
-      EventHandler errorEventListener, SkyFunction.Environment env, boolean allowRegisteringActions,
-      BinTools binTools) {
+      EventHandler errorEventListener, SkyFunction.Environment env,
+      boolean allowRegisteringActions) {
     this.artifactFactory = artifactFactory;
     this.owner = Preconditions.checkNotNull(owner);
     this.isSystemEnv = isSystemEnv;
@@ -101,7 +99,6 @@
     this.errorEventListener = errorEventListener;
     this.skyframeEnv = env;
     this.allowRegisteringActions = allowRegisteringActions;
-    this.binTools = Preconditions.checkNotNull(binTools);
     middlemanFactory = new MiddlemanFactory(artifactFactory, this);
     artifacts = new HashMap<>();
   }
@@ -250,12 +247,6 @@
   }
 
   @Override
-  public Artifact getEmbeddedToolArtifact(String embeddedPath) {
-    Preconditions.checkState(enabled);
-    return binTools.getEmbeddedArtifact(embeddedPath, artifactFactory);
-  }
-
-  @Override
   public void registerAction(ActionAnalysisMetadata... actions) {
     Preconditions.checkState(enabled);
     if (allowRegisteringActions) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index 16408d1..5ff1698 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -199,8 +199,6 @@
           "FDO_DIR", cppConfiguration.getFdoInstrument().getPathString()));
     }
 
-    Artifact linkDynamicLibraryTool = getLinkDynamicLibraryTool(ruleContext);
-
     CcToolchainProvider provider =
         new CcToolchainProvider(
             cppConfiguration,
@@ -210,6 +208,7 @@
             strip,
             objcopy,
             fullInputsForLink(ruleContext, link),
+            ruleContext.getPrerequisiteArtifact("$interface_library_builder", Mode.HOST),
             dwp,
             libcLink,
             staticRuntimeLinkInputs,
@@ -223,7 +222,7 @@
             getBuildVariables(ruleContext),
             getBuiltinIncludes(ruleContext),
             coverageEnvironment.build(),
-            linkDynamicLibraryTool,
+            ruleContext.getPrerequisiteArtifact("$link_dynamic_library_tool", Mode.HOST),
             getEnvironment(ruleContext));
     RuleConfiguredTargetBuilder builder =
         new RuleConfiguredTargetBuilder(ruleContext)
@@ -269,10 +268,6 @@
     return builder.build();
   }
 
-  private Artifact getLinkDynamicLibraryTool(RuleContext ruleContext) {
-    return ruleContext.getPrerequisiteArtifact("$link_dynamic_library_tool", Mode.TARGET);
-  }
-
   private ImmutableList<Artifact> getBuiltinIncludes(RuleContext ruleContext) {
     ImmutableList.Builder<Artifact> result = ImmutableList.builder();
     for (Artifact artifact : inputsForLibc(ruleContext)) {
@@ -308,11 +303,8 @@
     return NestedSetBuilder.<Artifact>stableOrder()
         .addTransitive(link)
         .addTransitive(AnalysisUtils.getMiddlemanFor(ruleContext, ":libc_top"))
-        .add(getLinkDynamicLibraryTool(ruleContext))
-        .add(
-            ruleContext
-                .getAnalysisEnvironment()
-                .getEmbeddedToolArtifact(CppRuleClasses.BUILD_INTERFACE_SO))
+        .add(ruleContext.getPrerequisiteArtifact("$interface_library_builder", Mode.HOST))
+        .add(ruleContext.getPrerequisiteArtifact("$link_dynamic_library_tool", Mode.HOST))
         .build();
   }
 
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 4145ebd..8f2f767 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
@@ -43,6 +43,7 @@
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
+          null,
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
           NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
@@ -66,6 +67,7 @@
   private final NestedSet<Artifact> strip;
   private final NestedSet<Artifact> objCopy;
   private final NestedSet<Artifact> link;
+  private final Artifact interfaceSoBuilder;
   private final NestedSet<Artifact> dwp;
   private final NestedSet<Artifact> libcLink;
   private final NestedSet<Artifact> staticRuntimeLinkInputs;
@@ -90,6 +92,7 @@
       NestedSet<Artifact> strip,
       NestedSet<Artifact> objCopy,
       NestedSet<Artifact> link,
+      Artifact interfaceSoBuilder,
       NestedSet<Artifact> dwp,
       NestedSet<Artifact> libcLink,
       NestedSet<Artifact> staticRuntimeLinkInputs,
@@ -112,6 +115,7 @@
     this.strip = Preconditions.checkNotNull(strip);
     this.objCopy = Preconditions.checkNotNull(objCopy);
     this.link = Preconditions.checkNotNull(link);
+    this.interfaceSoBuilder = interfaceSoBuilder;
     this.dwp = Preconditions.checkNotNull(dwp);
     this.libcLink = Preconditions.checkNotNull(libcLink);
     this.staticRuntimeLinkInputs = Preconditions.checkNotNull(staticRuntimeLinkInputs);
@@ -291,4 +295,11 @@
   public Artifact getLinkDynamicLibraryTool() {
     return linkDynamicLibraryTool;
   }
+
+  /**
+   * Returns the tool that builds interface libraries from dynamic libraries.
+   */
+  public Artifact getInterfaceSoBuilder() {
+    return interfaceSoBuilder;
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
index 786add8..877865d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
@@ -76,7 +76,14 @@
         .add(attr("supports_param_files", BOOLEAN).value(true))
         .add(attr("supports_header_parsing", BOOLEAN).value(false))
         .add(
+            attr("$interface_library_builder", LABEL)
+                .cfg(HOST)
+                .singleArtifact()
+                .value(env.getToolsLabel("//tools/cpp:interface_library_builder")))
+        .add(
             attr("$link_dynamic_library_tool", LABEL)
+                .cfg(HOST)
+                .singleArtifact()
                 .value(env.getToolsLabel("//tools/cpp:link_dynamic_library")))
         // TODO(bazel-team): Should be using the TARGET configuration.
         .add(attr(":libc_top", LABEL).cfg(HOST).value(LIBC_TOP))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index 9441fbe..1db3f3a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -1281,8 +1281,9 @@
   }
 
   /**
-   * Returns whether build_interface_so can build interface shared objects for this toolchain.
-   * Should be true if this toolchain generates ELF objects.
+   * Returns whether this toolchain supports interface shared objects.
+   *
+   * <p>Should be true if this toolchain generates ELF objects.
    */
   public boolean supportsInterfaceSharedObjects() {
     return supportsInterfaceSharedObjects;
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 d1fed5d..3e0b716 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
@@ -188,7 +188,7 @@
    * @param ruleContext the rule that owns the action
    * @param output the output artifact
    * @param toolchain the C++ toolchain provider
-   * @param the C++ FDO optimization support
+   * @param fdoSupport the C++ FDO optimization support
    */
   public CppLinkActionBuilder(RuleContext ruleContext, Artifact output,
       CcToolchainProvider toolchain, FdoSupport fdoSupport) {
@@ -208,7 +208,7 @@
    * @param output the output artifact
    * @param configuration build configuration
    * @param toolchain C++ toolchain provider
-   * @param the C++ FDO optimization support
+   * @param fdoSupport the C++ FDO optimization support
    */
   public CppLinkActionBuilder(
       RuleContext ruleContext,
@@ -228,7 +228,7 @@
    * @param configuration the configuration used to determine the tool chain and the default link
    *     options
    * @param toolchain the C++ toolchain provider
-   * @param the C++ FDO optimization support
+   * @param fdoSupport the C++ FDO optimization support
    */
   private CppLinkActionBuilder(
       @Nullable RuleContext ruleContext,
@@ -258,7 +258,7 @@
    * @param linkContext an immutable CppLinkAction.Context from the original builder
    * @param configuration build configuration
    * @param toolchain the C++ toolchain provider
-   * @param the C++ FDO optimization support
+   * @param fdoSupport the C++ FDO optimization support
    */
   public CppLinkActionBuilder(
       RuleContext ruleContext,
@@ -362,10 +362,6 @@
     return this.linkstampOptions;
   }
 
-  protected Artifact getInterfaceSoBuilder() {
-    return analysisEnvironment.getEmbeddedToolArtifact(CppRuleClasses.BUILD_INTERFACE_SO);
-  }
-  
   /**
    * Returns command line options for this link action.
    */
@@ -627,7 +623,7 @@
                 paramFile,
                 thinltoParamFile,
                 PathFragment.EMPTY_FRAGMENT,
-                getInterfaceSoBuilder(),
+                toolchain.getInterfaceSoBuilder(),
                 interfaceOutput);
     variablesExtension.addVariables(buildVariablesBuilder);
     for (VariablesExtension extraVariablesExtension : variablesExtensions) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
index bb22ec2..9ad6ba3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
@@ -125,11 +125,6 @@
 
 
   /**
-   * Path of the build_interface_so script in the Blaze binary.
-   */
-  public static final String BUILD_INTERFACE_SO = "build_interface_so";
-
-  /**
    * A string constant for the parse_headers feature.
    */
   public static final String PARSE_HEADERS = "parse_headers";
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index c84cf27..0e2c828 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -40,7 +40,6 @@
 import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
-import com.google.devtools.build.lib.analysis.config.BinTools;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
@@ -91,7 +90,6 @@
   private final ConfiguredTargetFactory factory;
   private final ArtifactFactory artifactFactory;
   private final SkyframeExecutor skyframeExecutor;
-  private final BinTools binTools;
   private boolean enableAnalysis = false;
 
   // This hack allows us to see when a configured target has been invalidated, and thus when the set
@@ -126,13 +124,11 @@
   private boolean skyframeAnalysisWasDiscarded;
 
   public SkyframeBuildView(BlazeDirectories directories,
-      SkyframeExecutor skyframeExecutor, BinTools binTools,
-      ConfiguredRuleClassProvider ruleClassProvider) {
+      SkyframeExecutor skyframeExecutor, ConfiguredRuleClassProvider ruleClassProvider) {
     this.factory = new ConfiguredTargetFactory(ruleClassProvider);
     this.artifactFactory = new ArtifactFactory(
         directories.getExecRoot().getParentDirectory(), directories.getRelativeOutputPath());
     this.skyframeExecutor = skyframeExecutor;
-    this.binTools = binTools;
     this.ruleClassProvider = ruleClassProvider;
   }
 
@@ -468,7 +464,7 @@
     boolean allowRegisteringActions = config == null || config.isActionsEnabled();
     return new CachingAnalysisEnvironment(
         artifactFactory, owner, isSystemEnv, extendedSanityChecks, eventHandler, env,
-        allowRegisteringActions, binTools);
+        allowRegisteringActions);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index e587f8f..1a04d15 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -331,7 +331,6 @@
     this.skyframeBuildView = new SkyframeBuildView(
         directories,
         this,
-        binTools,
         (ConfiguredRuleClassProvider) ruleClassProvider);
     this.artifactFactory.set(skyframeBuildView.getArtifactFactory());
     this.externalFilesHelper = new ExternalFilesHelper(
diff --git a/src/main/tools/build_interface_so b/src/main/tools/build_interface_so
deleted file mode 100755
index 626e707..0000000
--- a/src/main/tools/build_interface_so
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-if [[ $# != 2 ]]; then
-   echo "Usage: $0 <so> <interface so>" 1>&2
-   exit 1
-fi
-
-exec cp $1 $2
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index 7f26b3e..c7219ae 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -49,7 +49,6 @@
     testonly = 1,
     data = [
         "//src/main/tools:build-runfiles",
-        "//src/main/tools:build_interface_so",
         "//src/main/tools:linux-sandbox",
         "//src/main/tools:process-wrapper",
     ],
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
index 664a516..50e591b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
@@ -139,11 +139,6 @@
     }
 
     @Override
-    public Artifact getEmbeddedToolArtifact(String embeddedPath) {
-      return original.getEmbeddedToolArtifact(embeddedPath);
-    }
-
-    @Override
     public MiddlemanFactory getMiddlemanFactory() {
       return original.getMiddlemanFactory();
     }
@@ -316,11 +311,6 @@
     }
 
     @Override
-    public Artifact getEmbeddedToolArtifact(String embeddedPath) {
-      return null;
-    }
-
-    @Override
     public Artifact getConstantMetadataArtifact(PathFragment rootRelativePath, Root root) {
       return null;
     }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 72b756d..0e68cfa 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -467,7 +467,7 @@
   protected CachingAnalysisEnvironment getTestAnalysisEnvironment() {
     return new CachingAnalysisEnvironment(view.getArtifactFactory(),
         ArtifactOwner.NULL_OWNER, /*isSystemEnv=*/true, /*extendedSanityChecks*/false, reporter,
-        /*skyframeEnv=*/ null, /*actionsEnabled=*/true, binTools);
+        /*skyframeEnv=*/ null, /*actionsEnabled=*/true);
   }
 
   /**
@@ -567,7 +567,7 @@
         reporter.handle(e);
       }
     };
-    return view.getRuleContextForTesting(target, eventHandler, masterConfig, binTools);
+    return view.getRuleContextForTesting(target, eventHandler, masterConfig);
   }
 
   /**
@@ -1630,11 +1630,6 @@
     }
 
     @Override
-    public Artifact getEmbeddedToolArtifact(String embeddedPath) {
-      return null;
-    }
-
-    @Override
     public Artifact getConstantMetadataArtifact(PathFragment rootRelativePath, Root root) {
       throw new UnsupportedOperationException();
     }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
index cc063b1..9eb703c 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
@@ -139,6 +139,10 @@
         "    objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
         ")",
         "filegroup(",
+        "    name = 'interface_library_builder',",
+        "    srcs = ['build_interface_so'],",
+        ")",
+        "filegroup(",
         "    name = 'link_dynamic_library',",
         "    srcs = ['link_dynamic_library.sh'],",
         ")");
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
index 1441289..80dceea 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
@@ -44,6 +44,7 @@
           String pathString = artifact.getExecPathString();
           return !pathString.startsWith("third_party/crosstool/")
               && !pathString.startsWith("tools/cpp/link_dynamic_library")
+              && !pathString.startsWith("tools/cpp/build_interface_so")
               && !(pathString.contains("/internal/_middlemen") && basename.contains("crosstool"))
               && !pathString.startsWith("_bin/build_interface_so")
               && !pathString.endsWith(".cppmap");
@@ -567,13 +568,19 @@
         "alias(name='toolchain', actual='//third_party/crosstool')",
         "cc_library(name = 'malloc')",
         "filegroup(",
+        "    name = 'interface_library_builder',",
+        "    srcs = ['build_interface_so'],",
+        ")",
+        "filegroup(",
         "    name = 'link_dynamic_library',",
         "    srcs = ['link_dynamic_library.sh'],",
         ")");
     if (config.isRealFileSystem()) {
       config.linkTool("tools/cpp/link_dynamic_library.sh");
+      config.linkTool("tools/cpp/build_interface_so");
     } else {
       config.create("tools/cpp/link_dynamic_library.sh", "");
+      config.create("tools/cpp/build_interface_so", "");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
index 2b678f0..c6cf10c 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
@@ -71,11 +71,6 @@
           }
 
           @Override
-          public Artifact getEmbeddedToolArtifact(String embeddedPath) {
-            return scratchArtifact("tools/interface_so_builder");
-          }
-
-          @Override
           public Artifact getDerivedArtifact(PathFragment rootRelativePath, Root root) {
             return CppLinkActionTest.this.getDerivedArtifact(
                 rootRelativePath, root, ActionsTestUtil.NULL_ARTIFACT_OWNER);
@@ -231,7 +226,6 @@
     final Artifact dynamicOutputFile = getBinArtifactWithNoOwner(dynamicOutputPath.getPathString());
     final Artifact oFile = getSourceArtifact("cc/a.o");
     final Artifact oFile2 = getSourceArtifact("cc/a2.o");
-    final Artifact interfaceSoBuilder = getBinArtifactWithNoOwner("foo/build_interface_so");
     final FeatureConfiguration featureConfiguration = getMockFeatureConfiguration();
 
     ActionTester.runTest(
@@ -246,10 +240,6 @@
                     (i & 2) == 0 ? dynamicOutputFile : staticOutputFile,
                     CppHelper.getToolchain(ruleContext, ":cc_toolchain"),
                     CppHelper.getFdoSupport(ruleContext, ":cc_toolchain").getFdoSupport()) {
-                  @Override
-                  protected Artifact getInterfaceSoBuilder() {
-                    return interfaceSoBuilder;
-                  }
                 };
             builder.addCompilationInputs(
                 (i & 1) == 0 ? ImmutableList.of(oFile) : ImmutableList.of(oFile2));
@@ -284,7 +274,6 @@
     final Artifact dynamicOutputFile = getBinArtifactWithNoOwner(dynamicOutputPath.getPathString());
     final Artifact oFile = getSourceArtifact("cc/a.o");
     final Artifact oFile2 = getSourceArtifact("cc/a2.o");
-    final Artifact interfaceSoBuilder = getBinArtifactWithNoOwner("foo/build_interface_so");
     final FeatureConfiguration featureConfiguration = getMockFeatureConfiguration();
 
     ActionTester.runTest(
@@ -299,10 +288,6 @@
                     (i & 2) == 0 ? staticOutputFile : dynamicOutputFile,
                     CppHelper.getToolchain(ruleContext, ":cc_toolchain"),
                     CppHelper.getFdoSupport(ruleContext, ":cc_toolchain").getFdoSupport()) {
-                  @Override
-                  protected Artifact getInterfaceSoBuilder() {
-                    return interfaceSoBuilder;
-                  }
                 };
             builder.addCompilationInputs(
                 (i & 1) == 0 ? ImmutableList.of(oFile) : ImmutableList.of(oFile2));
@@ -533,7 +518,7 @@
     assertThat(commandLine).hasSize(6);
     assertThat(commandLine.get(0)).endsWith("custom/crosstool/scripts/link_dynamic_library.sh");
     assertThat(commandLine.get(1)).isEqualTo("yes");
-    assertThat(commandLine.get(2)).isEqualTo("tools/interface_so_builder");
+    assertThat(commandLine.get(2)).endsWith("tools/cpp/build_interface_so");
     assertThat(commandLine.get(3)).endsWith("foo.so");
     assertThat(commandLine.get(4)).isEqualTo("FakeInterfaceOutput.ifso");
     assertThat(commandLine.get(5)).isEqualTo("dynamic_library_linker_tool");
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
index 815b4f0..3f71f6f 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
@@ -31,7 +31,6 @@
    * A list of all embedded binaries that go into the regular Bazel binary.
    */
   public static final ImmutableList<String> EMBEDDED_TOOLS = ImmutableList.of(
-      "build_interface_so",
       "build-runfiles",
       "linux-sandbox",
       "process-wrapper",