diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -140,6 +140,7 @@ // True if we are creating a DLL. bool dll = false; StringRef implib; + bool noimplib = false; std::vector exports; bool hadExplicitExports; std::set delayLoads; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1673,6 +1673,9 @@ if (auto *arg = args.getLastArg(OPT_implib)) config->implib = arg->getValue(); + if (auto *arg = args.getLastArg(OPT_noimplib)) + config->noimplib = true; + // Handle /opt. bool doGC = debug == DebugKind::None || args.hasArg(OPT_profile); Optional icfLevel = None; @@ -2022,7 +2025,8 @@ // Handle generation of import library from a def file. if (!args.hasArg(OPT_INPUT, OPT_wholearchive_file)) { fixupExports(); - createImportLibrary(/*asLib=*/true); + if (!config->noimplib) + createImportLibrary(/*asLib=*/true); return; } @@ -2281,7 +2285,7 @@ // -implib option is given explicitly, for compatibility with GNU ld. if (!config->exports.empty() || config->dll) { fixupExports(); - if (!config->mingw || !config->implib.empty()) + if (!config->noimplib && (!config->mingw || !config->implib.empty())) createImportLibrary(/*asLib=*/false); assignExportOrdinals(); } diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td --- a/lld/COFF/Options.td +++ b/lld/COFF/Options.td @@ -56,6 +56,8 @@ def heap : P<"heap", "Size of the heap">; def ignore : P<"ignore", "Specify warning codes to ignore">; def implib : P<"implib", "Import library name">; +def noimplib : F<"noimplib">, + HelpText<"Don't output an import lib">; def lib : F<"lib">, HelpText<"Act like lib.exe; must be first argument if present">; def libpath : P<"libpath", "Additional library search path">; diff --git a/lld/test/COFF/noimplib.test b/lld/test/COFF/noimplib.test new file mode 100644 --- /dev/null +++ b/lld/test/COFF/noimplib.test @@ -0,0 +1,20 @@ +REQUIRES: x86 +RUN: mkdir -p %t-out +RUN: llvm-mc -triple x86_64-windows-msvc -filetype obj -o %t-out/object.obj %S/Inputs/object.s + +Test that /noimplib writes no .lib file + +RUN: rm -f %t-out/library.lib +RUN: lld-link -dll -machine:x64 -def:%S/Inputs/named.def -out:%t-out/library.dll %t-out/object.obj -entry:f -subsystem:console /noimplib +RUN: not test -f %t-out/library.lib + +Just make sure the normal stuff works and then we just add /noimplib + +RUN: lld-link -dll -machine:x64 -def:%S/Inputs/named.def -out:%t-out/library.dll %t-out/object.obj -entry:f -subsystem:console /implib:%t-out/nolibrary.lib +RUN: test -f %t-out/nolibrary.lib + +Test that it overrides /implib as well. This is how link.exe works + +RUN: rm -f %t-out/nolibrary.lib +RUN: lld-link -dll -machine:x64 -def:%S/Inputs/named.def -out:%t-out/library.dll %t-out/object.obj -entry:f -subsystem:console /implib:%t-out/nolibrary.lib /noimplib +RUN: not test -f %t-out/nolibrary.lib