Auto merge of #129257 - ChrisDenton:rename-null-descriptor, r=jieyouxu
Allow rust staticlib to work with MSVC's /WHOLEARCHIVE This fixes #129020 by renaming the `__NULL_IMPORT_DESCRIPTOR` to prevent conflicts. try-job: dist-i686-msvc
This commit is contained in:
commit
5ad98b4026
7 changed files with 74 additions and 4 deletions
|
@ -195,9 +195,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ar_archive_writer"
|
name = "ar_archive_writer"
|
||||||
version = "0.4.0"
|
version = "0.4.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "de11a9d32db3327f981143bdf699ade4d637c6887b13b97e6e91a9154666963c"
|
checksum = "01667f6f40216b9a0b2945e05fed5f1ad0ab6470e69cb9378001e37b1c0668e4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"object 0.36.3",
|
"object 0.36.3",
|
||||||
]
|
]
|
||||||
|
|
|
@ -5,7 +5,7 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# tidy-alphabetical-start
|
# tidy-alphabetical-start
|
||||||
ar_archive_writer = "0.4.0"
|
ar_archive_writer = "0.4.2"
|
||||||
arrayvec = { version = "0.7", default-features = false }
|
arrayvec = { version = "0.7", default-features = false }
|
||||||
bitflags = "2.4.1"
|
bitflags = "2.4.1"
|
||||||
cc = "1.0.90"
|
cc = "1.0.90"
|
||||||
|
|
|
@ -108,7 +108,11 @@ pub trait ArchiveBuilderBuilder {
|
||||||
&exports,
|
&exports,
|
||||||
machine,
|
machine,
|
||||||
!sess.target.is_like_msvc,
|
!sess.target.is_like_msvc,
|
||||||
/*comdat=*/ false,
|
// Enable compatibility with MSVC's `/WHOLEARCHIVE` flag.
|
||||||
|
// Without this flag a duplicate symbol error would be emitted
|
||||||
|
// when linking a rust staticlib using `/WHOLEARCHIVE`.
|
||||||
|
// See #129020
|
||||||
|
true,
|
||||||
) {
|
) {
|
||||||
sess.dcx()
|
sess.dcx()
|
||||||
.emit_fatal(ErrorCreatingImportLibrary { lib_name, error: error.to_string() });
|
.emit_fatal(ErrorCreatingImportLibrary { lib_name, error: error.to_string() });
|
||||||
|
|
1
tests/run-make/msvc-wholearchive/c.c
Normal file
1
tests/run-make/msvc-wholearchive/c.c
Normal file
|
@ -0,0 +1 @@
|
||||||
|
// This page is intentionally left blank
|
4
tests/run-make/msvc-wholearchive/dll.def
Normal file
4
tests/run-make/msvc-wholearchive/dll.def
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
LIBRARY dll
|
||||||
|
EXPORTS
|
||||||
|
hello
|
||||||
|
number
|
52
tests/run-make/msvc-wholearchive/rmake.rs
Normal file
52
tests/run-make/msvc-wholearchive/rmake.rs
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
//! This is a regression test for #129020
|
||||||
|
//! It ensures we can use `/WHOLEARCHIVE` to link a rust staticlib into DLL
|
||||||
|
//! using the MSVC linker
|
||||||
|
|
||||||
|
//@ only-msvc
|
||||||
|
// Reason: this is testing the MSVC linker
|
||||||
|
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use run_make_support::{cc, cmd, env_var, extra_c_flags, rustc};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// Build the staticlib
|
||||||
|
rustc().crate_type("staticlib").input("static.rs").output("static.lib").run();
|
||||||
|
// Build an empty object to pass to the linker.
|
||||||
|
cc().input("c.c").output("c.obj").args(["-c"]).run();
|
||||||
|
|
||||||
|
// Find the C toolchain's linker.
|
||||||
|
let mut linker = PathBuf::from(env_var("CC"));
|
||||||
|
let linker_flavour = if linker.file_stem().is_some_and(|s| s == "cl") {
|
||||||
|
linker.set_file_name("link.exe");
|
||||||
|
"msvc"
|
||||||
|
} else if linker.file_stem().is_some_and(|s| s == "clang-cl") {
|
||||||
|
linker.set_file_name("lld-link.exe");
|
||||||
|
"llvm"
|
||||||
|
} else {
|
||||||
|
panic!("unknown C toolchain");
|
||||||
|
};
|
||||||
|
|
||||||
|
// As a sanity check, make sure this works without /WHOLEARCHIVE.
|
||||||
|
// Otherwise the actual test failure may be caused by something else.
|
||||||
|
cmd(&linker)
|
||||||
|
.args(["c.obj", "./static.lib", "-dll", "-def:dll.def", "-out:dll.dll"])
|
||||||
|
.args(extra_c_flags())
|
||||||
|
.run();
|
||||||
|
|
||||||
|
// FIXME(@ChrisDenton): this doesn't currently work with llvm's lld-link for other reasons.
|
||||||
|
// May need LLVM patches.
|
||||||
|
if linker_flavour == "msvc" {
|
||||||
|
// Link in the staticlib using `/WHOLEARCHIVE` and produce a DLL.
|
||||||
|
cmd(&linker)
|
||||||
|
.args([
|
||||||
|
"c.obj",
|
||||||
|
"-WHOLEARCHIVE:./static.lib",
|
||||||
|
"-dll",
|
||||||
|
"-def:dll.def",
|
||||||
|
"-out:dll_whole_archive.dll",
|
||||||
|
])
|
||||||
|
.args(extra_c_flags())
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
}
|
9
tests/run-make/msvc-wholearchive/static.rs
Normal file
9
tests/run-make/msvc-wholearchive/static.rs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn hello() {
|
||||||
|
println!("Hello world!");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn number() -> u32 {
|
||||||
|
42
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue