Skip to content

Adding verbose flag to rustc makes the compiler fail to link #140003

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
msrd0 opened this issue Apr 18, 2025 · 4 comments
Closed

Adding verbose flag to rustc makes the compiler fail to link #140003

msrd0 opened this issue Apr 18, 2025 · 4 comments

Comments

@msrd0
Copy link
Contributor

msrd0 commented Apr 18, 2025

While trying to reproduce a cross compilation issue from a CI job, I hit this problem. Let's start with cargo init foo && cd foo and try cross compiling:

$ cargo build -v --target=aarch64-unknown-linux-musl
warning: failed to save last-use data
This may prevent cargo from accurately tracking what is being used in its global cache. This information is used for automatically removing unused data in the cache.

unable to open database file: /usr/local/share/rust/.global-cache

Caused by:
  Error code 14: Unable to open the database file
   Compiling foo v0.1.0 (/tmp/foo)
     Running `/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/bin/rustc --crate-name foo --edition=2024 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=283 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=6df085601f40eb32 -C extra-filename=-aad70980d3a10d16 --out-dir /tmp/foo/target/aarch64-unknown-linux-musl/debug/deps --target aarch64-unknown-linux-musl -C linker=clang -C incremental=/tmp/foo/target/aarch64-unknown-linux-musl/debug/incremental -L dependency=/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps -L dependency=/tmp/foo/target/debug/deps -C link-arg=--target=aarch64-unknown-linux-musl -C link-arg=-fuse-ld=mold`
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.13s

$ ./target/aarch64-unknown-linux-musl/debug/foo
Hello, world!

Now I want to know the linker command used, and cargo -v didn't print it, so I tried to add -v to rustc since rustc's help text says that it gives verbose output:

$ rm -rf target

$ RUSTFLAGS=-v cargo build -v --target=aarch64-unknown-linux-musl
warning: failed to save last-use data
This may prevent cargo from accurately tracking what is being used in its global cache. This information is used for automatically removing unused data in the cache.

unable to open database file: /usr/local/share/rust/.global-cache

Caused by:
  Error code 14: Unable to open the database file
   Compiling foo v0.1.0 (/tmp/foo)
     Running `/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/bin/rustc --crate-name foo --edition=2024 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=283 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=6df085601f40eb32 -C extra-filename=-47ef17a3015ab590 --out-dir /tmp/foo/target/aarch64-unknown-linux-musl/debug/deps --target aarch64-unknown-linux-musl -C linker=clang -C incremental=/tmp/foo/target/aarch64-unknown-linux-musl/debug/incremental -L dependency=/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps -L dependency=/tmp/foo/target/debug/deps -v`
error: linking with `clang` failed: exit status: 1
  |
  = note: LC_ALL="C" PATH="/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin/self-contained:/usr/local/share/rust/bin:/home/msrd0/.cargo/bin:/usr/local/share/rust/bin:/home/msrd0/.cargo/bin:/home/msrd0/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/android-ndk:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/opt/android-sdk/tools/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/usr/lib/rustup/bin:/opt/android-ndk:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/opt/android-sdk/tools/bin:/opt/android-ndk:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/opt/android-sdk/tools/bin:/opt/android-ndk:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/opt/android-sdk/tools/bin" VSLANG="1033" "clang" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crti.o" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crtbegin.o" "/tmp/rustcjnjA8g/symbols.o" "/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps/foo-47ef17a3015ab590.11jed61z1tf4ivr03rpap3a22.rcgu.o" "/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps/foo-47ef17a3015ab590.65oj7d1trhcv0d95up0e7udfh.rcgu.o" "/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps/foo-47ef17a3015ab590.78r6qo5gdn2sh2xqowp3o0nmc.rcgu.o" "/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps/foo-47ef17a3015ab590.8arcy87jo5fhxiisl9hqzrrer.rcgu.o" "/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps/foo-47ef17a3015ab590.8o0vc7feewycxyrz41947lk1k.rcgu.o" "/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps/foo-47ef17a3015ab590.dv2jb824xag7gvbxy0atb8n57.rcgu.o" "/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps/foo-47ef17a3015ab590.1a2af7fyklzegv1bxa2ujxpeq.rcgu.o" "-Wl,--as-needed" "-Wl,-Bstatic" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libstd-05f8bfae3756b849.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libpanic_unwind-b2fca0484503bbc1.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libobject-90465fb0f2eb348b.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libmemchr-45d2867e2bc7d636.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libaddr2line-c26099fbb6822fc2.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libgimli-fb48b5a9de5bb7a7.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/librustc_demangle-b41f5f8440ac04e4.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libstd_detect-a0c51d69fb4cbe57.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libhashbrown-89f6c0676762dc4a.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/librustc_std_workspace_alloc-024facbb8f7df00b.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libminiz_oxide-e2a93b7f605e3398.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libadler2-02b2b71e5a1cd21a.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libunwind-8f3f15da6e2ffe8a.rlib" "-lunwind" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libcfg_if-8f5ea71ed8b36bfe.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/liblibc-5da28eb3e59de3f4.rlib" "-lc" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/liballoc-48476d885ab5ddfc.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/librustc_std_workspace_core-007009aefc492d8d.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libcore-66b969dcac8addcc.rlib" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/libcompiler_builtins-b8b0cb5e2d9f1331.rlib" "-Wl,-Bdynamic" "-Wl,--eh-frame-hdr" "-Wl,-z,noexecstack" "-nostartfiles" "-L" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained" "-L" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib" "-o" "/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps/foo-47ef17a3015ab590" "-Wl,--gc-sections" "-static" "-no-pie" "-Wl,-z,relro,-z,now" "-nodefaultlibs" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crtend.o" "/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crtn.o"
  = note: clang: warning: argument unused during compilation: '-no-pie' [-Wunused-command-line-argument]
          /usr/bin/ld: /usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o: Relocations in generic ELF (EM: 183)
          /usr/bin/ld: /usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o: Relocations in generic ELF (EM: 183)
          /usr/bin/ld: /usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o: Relocations in generic ELF (EM: 183)
          /usr/bin/ld: /usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o: Relocations in generic ELF (EM: 183)
          /usr/bin/ld: /usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o: Relocations in generic ELF (EM: 183)
          /usr/bin/ld: /usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o: Relocations in generic ELF (EM: 183)
          /usr/bin/ld: /usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o: Relocations in generic ELF (EM: 183)
          /usr/bin/ld: /usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o: error adding symbols: file in wrong format
          clang: error: linker command failed with exit code 1 (use -v to see invocation)


error: could not compile `foo` (bin "foo") due to 1 previous error

Caused by:
  process didn't exit successfully: `/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/bin/rustc --crate-name foo --edition=2024 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=283 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=6df085601f40eb32 -C extra-filename=-47ef17a3015ab590 --out-dir /tmp/foo/target/aarch64-unknown-linux-musl/debug/deps --target aarch64-unknown-linux-musl -C linker=clang -C incremental=/tmp/foo/target/aarch64-unknown-linux-musl/debug/incremental -L dependency=/tmp/foo/target/aarch64-unknown-linux-musl/debug/deps -L dependency=/tmp/foo/target/debug/deps -v` (exit status: 1)

Now I guess I did get the linker command, but I would've expected verbose output to not turn a perfectly working compiler into a broken one?

Meta

Rust:

$ rustc -Vv
rustc 1.86.0 (05f9846f8 2025-03-31)
binary: rustc
commit-hash: 05f9846f893b09a1be1fc8560e33fc3c815cfecb
commit-date: 2025-03-31
host: x86_64-unknown-linux-gnu
release: 1.86.0
LLVM version: 19.1.7

Rust Config:

$ cat /usr/local/share/rust/config.toml
[env]
CC_armv7-unknown-linux-musleabihf = "clang -I /usr/include/arm-linux-musleabihf -target armv7-unknown-linux-musleabihf -fuse-ld=mold"
CXX_armv7-unknown-linux-musleabihf = "clang++ -I /usr/include/arm-linux-musleabihf -target armv7-unknown-linux-musleabihf -fuse-ld=mold"

[target.x86_64-unknown-linux-gnu]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=mold", "-C", "link-arg=-Wl,--no-rosegment", "-C", "force-frame-pointers=yes"]

[target.x86_64-unknown-linux-musl]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=mold", "-C", "link-arg=-Wl,--no-rosegment", "-C", "force-frame-pointers=yes"]

[target.aarch64-unknown-linux-musl]
linker = "clang"
rustflags = ["-C", "link-arg=--target=aarch64-unknown-linux-musl", "-C", "link-arg=-fuse-ld=mold"]

[target.armv7-unknown-linux-musleabihf]
linker = "clang"
rustflags = ["-C", "link-arg=--target=armv7-unknown-linux-musleabihf", "-C", "link-arg=-fuse-ld=mold"]

[net]
git-fetch-with-cli = true

[registries.crates-io]
protocol = "git"

Cross compilation tools installed on the host:

$ yay -Qs aarch64
local/aarch64-linux-gnu-binutils 2.43-1
    A set of programs to assemble and manipulate binary and object files for the ARM64 target
local/aarch64-linux-gnu-gcc 14.2.0-1
    The GNU Compiler Collection - cross compiler for ARM64 target
local/aarch64-linux-gnu-glibc 2.41-1
    GNU C Library ARM64 target
local/aarch64-linux-gnu-linux-api-headers 6.12-1
    Kernel headers sanitized for use in userspace (aarch64-linux-gnu)

Environment:

$ env |grep -i -e rust -e cargo
CARGO_NET_GIT_FETCH_WITH_CLI=true
CARGO_HOME=/usr/local/share/rust
RUSTC_FORCE_INCREMENTAL=1
RUSTUP_HOME=/usr/local/share/rust
RUST_BACKTRACE=1
RUST_LOG=info,probe_rs::flashing::flasher=warn
RUSTDOCFLAGS=--default-theme ayu
@msrd0 msrd0 added the C-bug Category: This is a bug. label Apr 18, 2025
@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Apr 18, 2025
@bjorn3
Copy link
Member

bjorn3 commented Apr 18, 2025

What does file /usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o show?

@msrd0
Copy link
Contributor Author

msrd0 commented Apr 18, 2025

@bjorn3

$ file /usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o
/usr/local/share/rust/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/crt1.o: ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), with debug_info, not stripped

@bjorn3
Copy link
Member

bjorn3 commented Apr 18, 2025

The RUSTFLAGS=-v overrides the rustflags in .cargo/config.toml, causing the system linker to be used, which doesn't support linking for arm64. Try RUSTFLAGS="-v -Clink-arg=-fuse-ld=mold". (The -Clink-arg=--target=aarch64-unknown-linux-musl shouldn't be necessary afaik as rustc already explicitly passes all linker arguments for linking against the arm64 musl it bundles, but if that doesn't work anyway you can add -Clink-arg=--target=aarch64-unknown-linux-musl to RUSTFLAGS too.)

@msrd0
Copy link
Contributor Author

msrd0 commented Apr 18, 2025

oh I see, I assumed those were additive. (the --target was necessary in the past, not sure if that is still the case)

@msrd0 msrd0 closed this as completed Apr 18, 2025
@jieyouxu jieyouxu removed C-bug Category: This is a bug. needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. labels Apr 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants