Index: lld/COFF/Driver.cpp =================================================================== --- lld/COFF/Driver.cpp +++ lld/COFF/Driver.cpp @@ -533,10 +533,39 @@ Exports.push_back(E2); } - auto E = writeImportLibrary(getImportName(AsLib), getImplibPath(), Exports, - Config->Machine, false); - handleAllErrors(std::move(E), - [&](ErrorInfoBase &EIB) { error(EIB.message()); }); + auto HandleError = [](Error &&E) { + handleAllErrors(std::move(E), + [](ErrorInfoBase &EIB) { error(EIB.message()); }); + }; + auto LibName = getImportName(AsLib); + auto Path = getImplibPath(); + + // If the import library already exists, replace it only if the contents + // have changed. + llvm::ErrorOr> OldBuf = + MemoryBuffer::getFile(Path); + if (OldBuf) { + SmallString<128> TmpName; + if (auto EC = + sys::fs::createUniqueFile(Path + ".tmp-%%%%%%%%.lib", TmpName)) + fatal("cannot create temporary file for import library " + Path + ": " + + EC.message()); + if (Error E = writeImportLibrary(LibName, TmpName, Exports, Config->Machine, + false)) { + HandleError(std::move(E)); + } else { + auto NewBuf = check(MemoryBuffer::getFile(TmpName)); + if ((*OldBuf)->getBuffer() != NewBuf->getBuffer()) { + OldBuf->reset(); + if (auto EC = sys::fs::rename(TmpName, Path)) + HandleError(errorCodeToError(EC)); + } + } + } else { + Error E = + writeImportLibrary(LibName, Path, Exports, Config->Machine, false); + HandleError(std::move(E)); + } } static void parseModuleDefs(StringRef Path) { Index: lld/test/COFF/unchanged-importlib.test =================================================================== --- /dev/null +++ lld/test/COFF/unchanged-importlib.test @@ -0,0 +1,7 @@ +# RUN: yaml2obj < %p/Inputs/export.yaml > %t.obj +# RUN: lld-link -out:%t.dll -dll %t.obj +# RUN: touch -t 198002011200.00 %t.lib +# RUN: lld-link -out:%t.dll -dll %t.obj +# RUN: ls -l %t.lib | FileCheck --check-prefix=CHECK %s + +# CHECK: Feb 1 1980