From 90a08fb4b7e79e79121a563ac9cd8138cfedeb3c Mon Sep 17 00:00:00 2001 From: A2uria Date: Wed, 12 Mar 2025 14:47:01 +0800 Subject: [PATCH] [LLD][COFF] Update nodefaultlibs after updating search paths (#128813) Fix #107346 --- lld/COFF/Driver.cpp | 7 +++++++ lld/test/COFF/Inputs/defaultlib.yaml | 24 ++++++++++++++++++++++++ lld/test/COFF/nodefaultlib.test | 9 +++++++++ 3 files changed, 40 insertions(+) create mode 100644 lld/test/COFF/Inputs/defaultlib.yaml diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index c20c04901701..bb64a5c0b9e9 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -786,6 +786,13 @@ void LinkerDriver::addWinSysRootLibSearchPaths() { path)) searchPaths.push_back(saver().save(path)); } + + // Libraries specified by `/nodefaultlib:` may not be found in incomplete + // search paths before lld infers a machine type from input files. + std::set noDefaultLibs; + for (const std::string &path : ctx.config.noDefaultLibs) + noDefaultLibs.insert(findLib(path).lower()); + ctx.config.noDefaultLibs = noDefaultLibs; } // Parses LIB environment which contains a list of search paths. diff --git a/lld/test/COFF/Inputs/defaultlib.yaml b/lld/test/COFF/Inputs/defaultlib.yaml new file mode 100644 index 000000000000..5b61095d6582 --- /dev/null +++ b/lld/test/COFF/Inputs/defaultlib.yaml @@ -0,0 +1,24 @@ +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ ] +sections: + - Name: .drectve + Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ] + Alignment: 1 + SectionData: 202F44454641554C544C49423A64656661756C742E6C6962 + SizeOfRawData: 24 +symbols: + - Name: .drectve + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 24 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 2526009418 + Number: 1 +... diff --git a/lld/test/COFF/nodefaultlib.test b/lld/test/COFF/nodefaultlib.test index ca8f09bdfc76..ceeb1f393b14 100644 --- a/lld/test/COFF/nodefaultlib.test +++ b/lld/test/COFF/nodefaultlib.test @@ -36,3 +36,12 @@ MSVC stamps uppercase references in OBJ directives, thus ensure that passing low UPPERCASE-NOT: OLDNAMES UPPERCASE-NOT: LIBCMT + +# RUN: yaml2obj -o %T/defaultlib.obj %p/Inputs/defaultlib.yaml +# RUN: mkdir -p %t.dir/sysroot/VC/Tools/MSVC/1.1.1.1/lib/x64 +# RUN: cp %p/Inputs/ret42.lib %t.dir/sysroot/VC/Tools/MSVC/1.1.1.1/lib/x64/default.lib + +# RUN: lld-link /winsysroot:%t.dir/sysroot /out:%t.exe /entry:main /subsystem:console %T/defaultlib.obj +# RUN: not lld-link /winsysroot:%t.dir/sysroot /out:%t.exe /entry:main /subsystem:console /nodefaultlib:default.lib %T/defaultlib.obj 2>&1 | FileCheck -check-prefix=CHECK4 %s + +CHECK4: error: : undefined symbol: main