GNU linker warns “corrupt .drectve” on staticlib binary generated with Rust 1.70 on Windows #112368
Description
It seems, as of version 16, LLVM generates a binary containing incompatible directive with GNU linker. I believe this is the cause:
commit: llvm/llvm-project@c5b3de6
Since Rust 1.70 upgraded LLVM to version 16, we started to see a lot of warnings by GNU linker when I link against staticlibs compiled by Rust. The warnings are like this:
Warning: .drectve `-exclude-symbols:_ZN7testpkg11hello_world17ha68eef8a416aa303E ' unrecognized
Warning: corrupt .drectve at end of def file
It seems I can just ignore this warning (while the concern described in the LLVM's commit can be a real problem in future), but still I feel this is something that should be fixed if possible. I know, from LLVM's viewpoint, it's reasonable to assume the linker is lld and embed the directives that only lld can understand. But, on the other hand, from Rust's viewpoint, is it intentional that the "GNU" target produces a binary that is incompatible with "GNU" linker? I'm honestly not sure about the answer. I'm yet to figure out what the "GNU" in Rust's GNU toolchain/target actually means.
Code
A minimal reproducible code: https://github.com/yutannihilation/rust170_gnu_warning
# compile Rust code to create a staticlib
cargo build --target=x86_64-pc-windows-gnu --lib --release
# compile the C code
gcc -c main.c -o main.o
# link to the staticlib
gcc -o testpkgrust170_gnu_warning.dll main.o -L./target/x86_64-pc-windows-gnu/release -lrust170_gnu_warning -lws2_32 -ladvapi32 -luserenv -lbcrypt -lntdll
In case of Rust 1.69, we don't see any warnings. However, if it's compiled using Rust 1.70, GNU linker warns:
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
(This can be reproducible on GHA: result)
Version it worked on
It most recently worked on: Rust 1.69
Version with regression
rustc --version --verbose
:
rustc 1.70.0 (90c541806 2023-05-31)
binary: rustc
commit-hash: 90c541806f23a127002de5b4038be731ba1458ca
commit-date: 2023-05-31
host: x86_64-pc-windows-msvc
release: 1.70.0
LLVM version: 16.0.2
Backtrace
References
- the original context: Fix compile error on Windows with Rust 1.70 extendr/rextendr#285 (comment)
- post on the Rust user forum before reporting here: https://users.rust-lang.org/t/corrupt-drectve-warning-on-x86-64-pc-windows-gnu-target-with-rust-1-70/94912
Activity