Skip to content

Rust compiler fails to build when host linker requires extra arguments #94003

@ComputerDruid

Description

@ComputerDruid

Using a config.toml, I've configured a custom host linker (building on a Mac):

[target.x86_64-apple-darwin]
cc = "/opt/s/w/ir/x/w/cipd/bin/clang"
cxx = "/opt/s/w/ir/x/w/cipd/bin/clang++"
ar = "/opt/s/w/ir/x/w/cipd/bin/llvm-ar"
ranlib = "/opt/s/w/ir/x/w/cipd/bin/llvm-ranlib"
profiler = true
linker = "/opt/s/w/ir/x/w/cipd/bin/clang++"

full config.toml

On this machine, the linker requires a custom --sysroot to be passed to it, so I also set some environment variables:

CFLAGS_x86_64_apple_darwin=--target=x86_64-apple-darwin --sysroot=/opt/s/w/ir/cache/macos_sdk/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk
CXXFLAGS_x86_64_apple_darwin=--target=x86_64-apple-darwin --sysroot=/opt/s/w/ir/cache/macos_sdk/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk
LDFLAGS_x86_64_apple_darwin=--target=x86_64-apple-darwin --sysroot=/opt/s/w/ir/cache/macos_sdk/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk
CARGO_TARGET_X86_64_APPLE_DARWIN_RUSTFLAGS=-C link-arg=--target=x86_64-apple-darwin -C link-arg=--sysroot=/opt/s/w/ir/cache/macos_sdk/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk

full environment

But this isn't enough to ensure that --sysroot is always passed to the linker, because when I try to build the compiler with ./x.py install, I get:

 error: linking with `/opt/s/w/ir/x/w/cipd/bin/clang++` failed: exit status: 1
   |
   = note: "/opt/s/w/ir/x/w/cipd/bin/clang++" "-m64" "-arch" "x86_64" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.0.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.1.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.10.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.11.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.12.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.13.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.14.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.15.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.2.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.3.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.4.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.5.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.6.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.7.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.8.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.build_script_build.8b6a5296-cgu.9.rcgu.o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01.2u71r0gxx5cfeky5.rcgu.o" "-L" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/deps" "-L" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libstd-301ac569e1f5b4aa.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libpanic_unwind-16e99e032d9da8c8.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libobject-ee624fb1c42ac415.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libmemchr-3d9a363ff0815197.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libaddr2line-90c612fcf2db3a6c.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libgimli-0662566af5cce885.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libstd_detect-6b4fbea665e8ba50.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/librustc_demangle-1acdb4532b0dd3e5.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libhashbrown-95671edf95d63cce.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/librustc_std_workspace_alloc-0470582744ac5371.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libunwind-cce6b5d0dd51e55f.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libcfg_if-b05763aba30b2386.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/liblibc-598373f5a98f0c63.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/liballoc-21a9c5a08f6fb9ac.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/librustc_std_workspace_core-7cdb23da1434d3f8.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libcore-6e3f464b02c07d39.rlib" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib/libcompiler_builtins-3b25963d2d3ed4ab.rlib" "-lSystem" "-lresolv" "-lc" "-lm" "-liconv" "-L" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/x86_64-apple-darwin/stage0/lib/rustlib/x86_64-apple-darwin/lib" "-o" "/opt/s/w/ir/x/w/staging/build/fuchsia-build/bootstrap/debug/build/serde_json-a9e1ff0fe4c1cd01/build_script_build-a9e1ff0fe4c1cd01" "-Wl,-dead_strip" "-nodefaultlibs"
   = note: ld: library not found for -lSystem
           clang-14: error: linker command failed with exit code 1 (use -v to see invocation)

full build output

And the resulting linker command does not include --sysroot.

To make it easier to reproduce, I created the following script:

#!/bin/bash

found=0
for arg in "$@"; do
  if [[ "$arg" =~ --sysroot ]]; then
    found=1
    break
  fi
done
if [ $found -eq 0 ]; then
  echo "linker argv missing sysroot" >&2
  exit 1
fi

# or whatever linker you would normally use
clang++ "$@"

Which can be used as the linker in config.toml to reproduce this, because it artificially requires the extra command-line argument. On a mac I believe you can get the correct value for the sysroot with xcrun --sdk macosx --show-sdk-path, on linux I believe / is a reasonable sysroot to pass.

I actually tried patching boostrap.py:

From 05c21525247f4d35b82b8828efff43f26caaf4aa Mon Sep 17 00:00:00 2001
From: Dan Johnson <[email protected]>
Date: Thu, 10 Feb 2022 15:41:12 -0800
Subject: [PATCH] WIP use target-specific rustflags when building bootstrap

Change-Id: If6ad55f67e77c5698854f600c873fadbbfbbd8ae
---
 src/bootstrap/bootstrap.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py
index 86115a90294..9a390b783af 100644
--- a/src/bootstrap/bootstrap.py
+++ b/src/bootstrap/bootstrap.py
@@ -999,6 +999,10 @@ class RustBuild(object):
 
         # preserve existing RUSTFLAGS
         env.setdefault("RUSTFLAGS", "")
+        envify = lambda b: b.replace("-", "_").upper()
+        target_rustflags = env.get("CARGO_TARGET_%s_RUSTFLAGS"%envify(self.build))
+        if target_rustflags:
+            env["RUSTFLAGS"] += " " + target_rustflags
         build_section = "target.{}".format(self.build)
         target_features = []
         if self.get_toml("crt-static", build_section) == "true":
-- 
2.35.1.265.g69c8d7142f-goog

Which gets it a little bit further, but then it fails while building build scripts during the libstd build.

Meta

I noticed this while trying to build the latest commit at the time, which happened to be 9a60099

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.T-bootstrapRelevant to the bootstrap subteam: Rust's build system (x.py and src/bootstrap)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions