[lld] 90a08fb - [LLD][COFF] Update nodefaultlibs after updating search paths (#128813)

via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 11 23:47:04 PDT 2025


Author: A2uria
Date: 2025-03-12T08:47:01+02:00
New Revision: 90a08fb4b7e79e79121a563ac9cd8138cfedeb3c

URL: https://github.com/llvm/llvm-project/commit/90a08fb4b7e79e79121a563ac9cd8138cfedeb3c
DIFF: https://github.com/llvm/llvm-project/commit/90a08fb4b7e79e79121a563ac9cd8138cfedeb3c.diff

LOG: [LLD][COFF] Update nodefaultlibs after updating search paths (#128813)

Fix #107346

Added: 
    lld/test/COFF/Inputs/defaultlib.yaml

Modified: 
    lld/COFF/Driver.cpp
    lld/test/COFF/nodefaultlib.test

Removed: 
    


################################################################################
diff  --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index c20c049017018..bb64a5c0b9e96 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<std::string> 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 0000000000000..5b61095d65822
--- /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 ca8f09bdfc76c..ceeb1f393b141 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: <root>: undefined symbol: main


        


More information about the llvm-commits mailing list