rust-lang / rust-lang/rust

Can't bootstrap 1.89 on Windows with custom dlltool

Open
#147,229 18 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

C-bug O-android T-bootstrap
Dominant language
Rust
Stars
119k
Forks
16.1k
PR merge metrics
PR metrics pending

Description

Summary

Bootstrapping rust 1.89.0 on Windows fails at "Building tool cargo (stage1 -> stage2, x86_64-pc-windows-gnu)" when using a custom dlltool.

Command used

Somewhat complicated to describe. We build a Rust toolchain for Android with a script that is a wrapper around x.py that creates a custom bootstrap.toml and sets some environment variables. Slightly out-of-date version of build scripts is at https://android.googlesource.com/toolchain/android_rust/+/refs/heads/main

Expected behaviour
  • We are able to specify a custom dlltool that is used to bootstrap the toolchain.
Actual behaviour
  • The build fails at "Building tool cargo (stage1 -> stage2, x86_64-pc-windows-gnu)"
  • The failing command is C:/src/main-rust-toolchain/prebuilts/rust/windows-x86/1.88.0/bin/cargo.exe build --target x86_64-pc-windows-gnu -Zbinary-dep-depinfo -j 64 -Zroot-dir=C:\src\main-rust-toolchain\out\rustc -v --frozen --release --manifest-path C:\src\main-rust-toolchain\out\rustc\src/tools/cargo\Cargo.toml --features all-static
  • The failing crate is getrandom 0.3.3, with the error "error: Error calling dlltool 'dlltool.exe': program not found"

We are specifying a custom dlltool in RUSTFLAGS with "-Cdlltool=XXXX". In practice, this doesn't actually work. There seem to be a number of things going on:

  • Cargo ignores RUSTFLAGS when --target is set. This means that ALL of the rust flags, set by our build script and by the bootstrap process, are ignored, not just -Cdlltool=XXX
  • When bootstrapping the new version of cargo, the bootstrap process uses the old (stage0) version of cargo, with the new version of rustc.
  • But the bootstrap process needs to be able to pass some flags to rustc, such as telling rustc about the linker. It can't use RUSTFLAGS, so there is a special rustc wrapper (src/bootstrap/src/bin/rustc.rs) that, among other things, allows additional flags to be passed via RUSTC_HOST_FLAGS, which the bootstrap process sets before invoking cargo.
  • In our case, RUSTC_HOST_FLAGS = "--check-cfg=cfg(bootstrap) -Ctarget-feature=-crt-static -Clinker=C:/src/main-rust-toolchain/out/wrappers/linker-x86_64-pc-windows-gnu.cmd"

This does not appear to be a new issue; it's probably been latent for awhile. It looks like what changed between rust 1.88 and 1.89 is the Cargo.lock file for cargo (src/tools/cargo/Cargo.lock) bumped the version of getrandom from 0.3.1 to 0.3.3, which changes the dependencies and compilation behavior on windows (see https://github.com/rust-random/getrandom/pull/627 and https://github.com/rust-random/getrandom/issues/723).

Bootstrap configuration (bootstrap.toml)
change-id = 131075

[llvm]
download-ci-llvm = false
ninja = true
targets = "AArch64;ARM;X86;RISCV"
link-shared = false
cflags = ""
cxxflags = ""
ldflags = "-Wl,-mllvm,--relocation-model=pic"
use-libcxx = true
static-libstdcpp = false
thin-lto = false
version-suffix = ""
libzstd = false


[llvm.build-config]
CMAKE_BUILD_RPATH = "C:/src/main-rust-toolchain/prebuilts/clang/host/windows-x86/clang-r574158/lib"


[build]
build = "x86_64-pc-windows-gnu"
host = ["x86_64-pc-windows-gnu"]
target = ["x86_64-pc-windows-gnu"]
cargo = "C:/src/main-rust-toolchain/prebuilts/rust/windows-x86/1.88.0/bin/cargo.exe"
rustc = "C:/src/main-rust-toolchain/prebuilts/rust/windows-x86/1.88.0/bin/rustc.exe"
python = "C:/src/main-rust-toolchain/prebuilts/python/windows-x86/python.exe"
verbose = 1
docs = false
submodules = false
vendor = true
full-bootstrap = true
extended = true
tools = ["cargo", "clippy", "rustdoc", "rustfmt", "rust-analyzer"]
cargo-native-static = true

[dist]
compression-formats = ["gz"]
include-mingw-linker = false

[install]
prefix = "/"
sysconfdir = "etc"

[rust]
channel = "dev"
description = "Android Rust Toolchain version windows"
download-rustc = false
remap-debuginfo = true
deny-warnings = false
new-symbol-mangling = true
lld = false
lto = "thin-local"


[target.x86_64-pc-windows-gnu]
cc = "C:/src/main-rust-toolchain/out/wrappers/clang-x86_64-pc-windows-gnu.cmd"
cxx = "C:/src/main-rust-toolchain/out/wrappers/clang++-x86_64-pc-windows-gnu.cmd"
linker = "C:/src/main-rust-toolchain/out/wrappers/linker-x86_64-pc-windows-gnu.cmd"
ar = "C:/src/main-rust-toolchain/prebuilts/clang/host/windows-x86/clang-r574158/bin/llvm-ar.exe"
ranlib = "C:/src/main-rust-toolchain/prebuilts/clang/host/windows-x86/clang-r574158/bin/llvm-ranlib.exe"
crt-static = false
llvm-libunwind = "in-tree"
profiler = false
Operating system

Windows 11

HEAD

29483883eed69d5fb4db01964cdf2af4d86e9cb2

With some patches: https://android.googlesource.com/toolchain/android_rust/+/refs/heads/main/patches/ (somewhat out-of-date due to AOSP turndown)

Additional context

Full set of environment variables used when invoking std::process::Command:

"AR_x86_64_pc_windows_gnu", Some("C:/src/main-rust-toolchain/prebuilts/clang/host/windows-x86/clang-r574158/bin/llvm-ar.exe")
"CARGO_INCREMENTAL", Some("0")
"CARGO_PROFILE_RELEASE_DEBUG", Some("0")
"CARGO_PROFILE_RELEASE_DEBUG_ASSERTIONS", Some("false")
"CARGO_PROFILE_RELEASE_OVERFLOW_CHECKS", Some("false")
"CARGO_PROFILE_RELEASE_STRIP", Some("false")
"CARGO_TARGET_DIR", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\x86_64-pc-windows-gnu\\stage1-tools")
"CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER", Some("C:/src/main-rust-toolchain/out/wrappers/linker-x86_64-pc-windows-gnu.cmd")
"CC_x86_64_pc_windows_gnu", Some("C:/src/main-rust-toolchain/out/wrappers/clang-x86_64-pc-windows-gnu.cmd")
"CFG_COMMIT_DATE", Some("2025-06-23")
"CFG_COMMIT_HASH", Some("c24e1064277fe51ab72011e2612e556ac56addf7")
"CFG_COMPILER_BUILD_TRIPLE", Some("x86_64-pc-windows-gnu")
"CFG_COMPILER_HOST_TRIPLE", Some("x86_64-pc-windows-gnu")
"CFG_RELEASE", Some("1.89.0-dev")
"CFG_RELEASE_CHANNEL", Some("dev")
"CFG_RELEASE_NUM", Some("1.89.0")
"CFG_SHORT_COMMIT_HASH", Some("c24e10642")
"CFG_VERSION", Some("1.89.0-dev (29483883e 2025-08-04) (Android Rust Toolchain version windows)")
"CFG_VER_DATE", Some("2025-08-04")
"CFG_VER_DESCRIPTION", Some("Android Rust Toolchain version windows")
"CFG_VER_HASH", Some("29483883eed69d5fb4db01964cdf2af4d86e9cb2")
"CFLAGS_x86_64_pc_windows_gnu", Some("")
"CXXFLAGS_x86_64_pc_windows_gnu", Some("")
"CXX_x86_64_pc_windows_gnu", Some("C:/src/main-rust-toolchain/out/wrappers/clang++-x86_64-pc-windows-gnu.cmd")
"DOC_RUST_LANG_ORG_CHANNEL", Some("https://doc.rust-lang.org/nightly")
"LIBC_CHECK_CFG", Some("1")
"LIBZ_SYS_STATIC", Some("1")
"LZMA_API_STATIC", Some("1")
"MAKEFLAGS", None
"MFLAGS", None
"RANLIB_x86_64_pc_windows_gnu", Some("C:/src/main-rust-toolchain/prebuilts/clang/host/windows-x86/clang-r574158/bin/llvm-ar.exe s")
"REAL_LIBRARY_PATH", Some("C:\\src\\main-rust-toolchain\\prebuilts\\python\\windows-x86;C:\\src\\main-rust-toolchain\\prebuilts\\rust\\windows-x86\\1.88.0\\bin;C:\\src\\main-rust-toolchain\\prebuilts\\cmake\\windows-x86\\bin;C:\\src\\main-rust-toolchain\\prebuilts\\ninja\\windows-x86;C:\\src\\main-rust-toolchain\\prebuilts\\build-tools\\path\\windows-x86;C:\\src\\main-rust-toolchain\\prebuilts\\build-tools\\windows-x86\\bin;C:\\src\\main-rust-toolchain\\out\\rust-toolchain\\bin;C:\\program files\\git\\usr\\bin;C:\\src\\main-rust-toolchain\\prebuilts\\gcc\\linux-x86\\host\\x86_64-w64-mingw32-4.8\\x86_64-w64-mingw32\\bin;C:\\src\\main-rust-toolchain\\prebuilts\\gcc\\linux-x86\\host\\x86_64-w64-mingw32-4.8\\x86_64-w64-mingw32\\lib")
"REAL_LIBRARY_PATH_VAR", Some("PATH")
"RUSTBUILD_NATIVE_DIR", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\x86_64-pc-windows-gnu\\native")
"RUSTC", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\bootstrap\\debug\\rustc")
"RUSTC_BOOTSTRAP", Some("1")
"RUSTC_BREAK_ON_ICE", Some("1")
"RUSTC_CARGO_REGISTRY_SRC_TO_REMAP", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\vendor=/rust/deps")
"RUSTC_DEBUGINFO_MAP", Some("C:\\src\\main-rust-toolchain\\out\\rustc=/rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2")
"RUSTC_ERROR_METADATA_DST", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\tmp/extended-error-metadata")
"RUSTC_HOST_FLAGS", Some("--check-cfg=cfg(bootstrap) -Ctarget-feature=-crt-static -Clinker=C:/src/main-rust-toolchain/out/wrappers/linker-x86_64-pc-windows-gnu.cmd")
"RUSTC_INSTALL_BINDIR", Some("bin")
"RUSTC_LIBDIR", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\x86_64-pc-windows-gnu\\stage1\\bin")
"RUSTC_LINK_STD_INTO_RUSTC_DRIVER", Some("0")
"RUSTC_LINT_FLAGS", Some("")
"RUSTC_REAL", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\x86_64-pc-windows-gnu\\stage1\\bin\\rustc.exe")
"RUSTC_SNAPSHOT", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\x86_64-pc-windows-gnu\\stage1\\bin\\rustc.exe")
"RUSTC_SNAPSHOT_LIBDIR", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\x86_64-pc-windows-gnu\\stage1\\bin")
"RUSTC_STAGE", Some("1")
"RUSTC_SYSROOT", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\x86_64-pc-windows-gnu\\stage1")
"RUSTC_TLS_MODEL_INITIAL_EXEC", Some("1")
"RUSTC_VERBOSE", Some("1")
"RUSTC_WRAPPER", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\bootstrap\\debug\\rustc")
"RUSTDOC", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\bootstrap\\debug\\rustdoc")
"RUSTDOCFLAGS", Some("-Crelocation-model=pic -Csave-temps -Cdlltool=C:\\src\\main-rust-toolchain\\prebuilts\\clang\\host\\windows-x86\\clang-r574158\\bin\\llvm-dlltool.exe --cfg=windows_raw_dylib -Csymbol-mangling-version=v0 -Zunstable-options --check-cfg=cfg(bootstrap) --check-cfg=cfg(llvm_enzyme) --check-cfg=cfg(rust_analyzer) -Clinker=C:\\src\\main-rust-toolchain\\out\\wrappers\\linker-x86_64-pc-windows-gnu.cmd --crate-version 1.89.0-dev\t(29483883e\t2025-08-04)\t(Android\tRust\tToolchain\tversion\twindows) -Clinker=C:/src/main-rust-toolchain/out/wrappers/linker-x86_64-pc-windows-gnu.cmd")
"RUSTDOC_REAL", Some("/path/to/nowhere/rustdoc/not/required")
"RUSTFLAGS", Some("-Crelocation-model=pic -Csave-temps -Cdlltool=C:\\src\\main-rust-toolchain\\prebuilts\\clang\\host\\windows-x86\\clang-r574158\\bin\\llvm-dlltool.exe --cfg=windows_raw_dylib -Csymbol-mangling-version=v0 -Zunstable-options --check-cfg=cfg(bootstrap) --check-cfg=cfg(llvm_enzyme) --check-cfg=cfg(rust_analyzer) -Zmacro-backtrace -Csplit-debuginfo=packed -Ctarget-feature=-crt-static -Clink-arg=-LC:/src/main-rust-toolchain/out/rustc/build/x86_64-pc-windows-gnu/llvm/lib -Alinker-messages -Zunstable-options")
"RUST_TEST_THREADS", Some("64")
"SYSROOT", Some("C:\\src\\main-rust-toolchain\\out\\rustc\\build\\x86_64-pc-windows-gnu\\stage1")
"__CARGO_DEFAULT_LIB_METADATA", Some("devtool-rustc1.89.0")

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with src/bootstrap/src/bin/rustc.rs and the Cargo.lock change in src/tools/cargo/Cargo.lock, then reproduce the x.py bootstrap using the reported custom dlltool configuration. Trace how host flags reach the stage1 Cargo build. Done means the Windows bootstrap can use the configured custom dlltool instead of failing with a missing dlltool.exe error.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
build-system
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.