Building/linking on MSVC fails with LNK1107?
Downstream bug: https://github.com/nabijaczleweli/vswhom-sys.rs/issues/3
When building vswhom-sys.rs, @solomoncyj got this:
Compiling shlex v1.3.0
Compiling find-msvc-tools v0.1.2
Compiling libc v0.2.175
Compiling cc v1.2.38
Compiling vswhom-sys v0.1.3 (C:\Users\solom\Downloads\vswhom-sys.rs)
error: failed to run custom build command for `vswhom-sys v0.1.3 (C:\Users\solom\Downloads\vswhom-sys.rs)`
Caused by:
process didn't exit successfully: `C:\Users\solom\target\debug\build\vswhom-sys-046bce82504c0475\build-script-build` (exit code: 1)
--- stdout
cargo:rerun-if-changed=build.rs
cargo:rerun-if-changed=ext/vswhom.cpp
OPT_LEVEL = Some(0)
OUT_DIR = Some(C:\Users\solom\target\debug\build\vswhom-sys-7a4b6afb6681f858\out)
TARGET = Some(x86_64-pc-windows-msvc)
cargo:rerun-if-env-changed=VCINSTALLDIR
VCINSTALLDIR = None
cargo:rerun-if-env-changed=VSTEL_MSBuildProjectFullPath
VSTEL_MSBuildProjectFullPath = None
cargo:rerun-if-env-changed=VSCMD_ARG_VCVARS_SPECTRE
VSCMD_ARG_VCVARS_SPECTRE = None
cargo:rerun-if-env-changed=WindowsSdkDir
WindowsSdkDir = None
cargo:rerun-if-env-changed=WindowsSDKVersion
WindowsSDKVersion = None
cargo:rerun-if-env-changed=LIB
LIB = None
PATH = Some(C:\Users\solom\target\debug\deps;C:\Users\solom\target\debug;C:\Users\solom\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib;C:\Program Files (x86)\oh-my-posh\bin\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\ProgramData\chocolatey\bin;C:\clang\bin;C:\Program Files\NASM;C:\bin;C:\lib;C:\Program Files\dotnet\;C:\Program Files\NVIDIA Corporation\NVIDIA app\NvDLISR;C:\Program Files\GitHub CLI\;C:\Program Files\CMake\bin;C:\Program Files\Git\cmd;C:\Program Files (x86)\Gpg4win\..\GnuPG\bin;C:\Program Files\Monero GUI Wallet\;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\nodejs\;C:\LLVM\bin;C:\Program Files\Go\bin;C:\Program Files\PowerShell\7\;C:\c\bin;C:\perl\site\bin;C:\perl\bin;C:\Users\solom\AppData\Local\Programs\oh-my-posh\bin\;C:\Users\solom\AppData\Local\Programs\Python\Python310\Scripts\;C:\Users\solom\AppData\Local\Programs\Python\Python310\;C:\Users\solom\AppData\Local\Programs\Python\Launcher\;C:\Users\solom\.cargo\bin;C:\Users\solom\AppData\Local\Microsoft\WindowsApps;C:\Users\solom\AppData\Local\Microsoft\WinGet\Links;C:\Users\solom\AppData\Local\Programs\Python\Python313\Scripts;C:\Users\solom\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\solom\AppData\Local\JetBrains\Toolbox\scripts;C:\Users\solom\.dotnet\tools;C:\Users\solom\AppData\Local\gitkraken\bin;C:\Users\solom\.dotnet\tools;C:\Users\solom\AppData\Local\Microsoft\WindowsApps;C:\Users\solom\AppData\Local\Programs\cursor\resources\app\bin;C:\Users\solom\AppData\Local\Muse Hub\lib;C:\Users\solom\AppData\Roaming\npm;C:\Users\solom\go\bin)
cargo:rerun-if-env-changed=INCLUDE
INCLUDE = None
HOST = Some(x86_64-pc-windows-msvc)
cargo:rerun-if-env-changed=CXX_x86_64-pc-windows-msvc
CXX_x86_64-pc-windows-msvc = None
cargo:rerun-if-env-changed=CXX_x86_64_pc_windows_msvc
CXX_x86_64_pc_windows_msvc = None
cargo:rerun-if-env-changed=HOST_CXX
HOST_CXX = None
cargo:rerun-if-env-changed=CXX
CXX = Some(clang++)
cargo:rerun-if-env-changed=CC_KNOWN_WRAPPER_CUSTOM
CC_KNOWN_WRAPPER_CUSTOM = None
RUSTC_WRAPPER = None
cargo:rerun-if-env-changed=CC_ENABLE_DEBUG_OUTPUT
cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS
CRATE_CC_NO_DEFAULTS = None
DEBUG = Some(true)
cargo:rerun-if-env-changed=CXXFLAGS
CXXFLAGS = Some(-march=native -flto=thin)
cargo:rerun-if-env-changed=CC_SHELL_ESCAPED_FLAGS
CC_SHELL_ESCAPED_FLAGS = None
cargo:rerun-if-env-changed=HOST_CXXFLAGS
HOST_CXXFLAGS = None
cargo:rerun-if-env-changed=CXXFLAGS_x86_64_pc_windows_msvc
CXXFLAGS_x86_64_pc_windows_msvc = None
cargo:rerun-if-env-changed=CXXFLAGS_x86_64-pc-windows-msvc
CXXFLAGS_x86_64-pc-windows-msvc = None
CARGO_ENCODED_RUSTFLAGS = Some(-Ctarget-cpu=native)
cargo:rerun-if-env-changed=AR_x86_64-pc-windows-msvc
AR_x86_64-pc-windows-msvc = None
cargo:rerun-if-env-changed=AR_x86_64_pc_windows_msvc
AR_x86_64_pc_windows_msvc = None
cargo:rerun-if-env-changed=HOST_AR
HOST_AR = None
cargo:rerun-if-env-changed=AR
AR = None
cargo:rerun-if-env-changed=ARFLAGS
ARFLAGS = None
cargo:rerun-if-env-changed=HOST_ARFLAGS
HOST_ARFLAGS = None
cargo:rerun-if-env-changed=ARFLAGS_x86_64_pc_windows_msvc
ARFLAGS_x86_64_pc_windows_msvc = None
cargo:rerun-if-env-changed=ARFLAGS_x86_64-pc-windows-msvc
ARFLAGS_x86_64-pc-windows-msvc = None
C:\Users\solom\target\debug\build\vswhom-sys-7a4b6afb6681f858\out\71b29add3157f200-vswhom.o : fatal error LNK1107: invalid or corrupt file: cannot read at 0x1B124
--- stderr
error occurred in cc-rs: command did not execute successfully (status code exit code: 1107): "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.44.35207\\bin\\HostX64\\x64\\lib.exe" "-out:C:\\Users\\solom\\target\\debug\\build\\vswhom-sys-7a4b6afb6681f858\\out\\libvswhom.a" "-nologo" "C:\\Users\\solom\\target\\debug\\build\\vswhom-sys-7a4b6afb6681f858\\out\\71b29add3157f200-vswhom.o"
LNK1107 is nominally corruption, but this persists through a de-novo rebuild.
build.rs says:
let mut cc = cc::Build::new();
cc.cpp(true);
cc.file("ext/vswhom.cpp");
if cc.get_compiler().is_like_msvc() {
cc.flag("/Zm2000");
}
cc.compile("vswhom");
with nothing of interest otherwise, so this looks like an issue with the reporter's setup or with the way cc drives it to me.
The code looks ok, would need more info on the environment to know what's going on.
i think is that cc failed to get the linker env, and called msvc linker over the clang one if clang was used to compile the code
Well you are building for MSVC, so if it was built with clang then we've found the issue at hand.
...and looking at the environment dump I do see CXX=clang++ and CXXFLAGS in cc style; it's unclear what this should mean when building for a -msvc quad (beside maybe it should explode with "compiler and linker are different brands" like cmake does).
i have flags to rust that overids the liker to lld-link, and I have enviroment variables pointing to lld-link as the linker.. so maybe the buildscript ovrode the linker, but not the compier
cc doesn't link anything by default though, only compiles an object and archive it
Hmmm, let me set up ar variables and see if it fixes it
ok, exporting AR = llvm-ar fixed it, i think therre should be a toolchain checker to make sure all of them is compatible before compiling, like cmake
Hmmm normally clang does work with ar
Could this be under influence of -flto (we were talking about only enable -flto for -Clinker-plugin-lto)
Cold be a possibility as clang's flto emits llvm IR insted of objects, as lld can optimize it better, but runs the risk of non toolchain not being able to use it
Yes, that's what I'm working on at the moment in #1564