[lld] r326507 - Report an error if you try to link against .dll instead of .lib.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 1 15:11:31 PST 2018


Author: ruiu
Date: Thu Mar  1 15:11:30 2018
New Revision: 326507

URL: http://llvm.org/viewvc/llvm-project?rev=326507&view=rev
Log:
Report an error if you try to link against .dll instead of .lib.

It is a usage error to feed a .dll file instead of a .dll to COFF linker.
Previously, lld failed with a mysterious error message. Now we reject
it at the driver.

Fixes https://bugs.llvm.org/show_bug.cgi?id=36440

Differential Revision: https://reviews.llvm.org/D43964

Modified:
    lld/trunk/COFF/Driver.cpp
    lld/trunk/test/COFF/driver.test

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=326507&r1=326506&r2=326507&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Thu Mar  1 15:11:30 2018
@@ -124,39 +124,46 @@ MemoryBufferRef LinkerDriver::takeBuffer
 
 void LinkerDriver::addBuffer(std::unique_ptr<MemoryBuffer> MB,
                              bool WholeArchive) {
+  StringRef Filename = MB->getBufferIdentifier();
+
   MemoryBufferRef MBRef = takeBuffer(std::move(MB));
-  FilePaths.push_back(MBRef.getBufferIdentifier());
+  FilePaths.push_back(Filename);
 
   // File type is detected by contents, not by file extension.
   switch (identify_magic(MBRef.getBuffer())) {
   case file_magic::windows_resource:
     Resources.push_back(MBRef);
     break;
-
   case file_magic::archive:
     if (WholeArchive) {
       std::unique_ptr<Archive> File =
-          CHECK(Archive::create(MBRef),
-                MBRef.getBufferIdentifier() + ": failed to parse archive");
+          CHECK(Archive::create(MBRef), Filename + ": failed to parse archive");
 
       for (MemoryBufferRef M : getArchiveMembers(File.get()))
-        addArchiveBuffer(M, "<whole-archive>", MBRef.getBufferIdentifier());
+        addArchiveBuffer(M, "<whole-archive>", Filename);
       return;
     }
     Symtab->addFile(make<ArchiveFile>(MBRef));
     break;
-
   case file_magic::bitcode:
     Symtab->addFile(make<BitcodeFile>(MBRef));
     break;
-
+  case file_magic::coff_object:
+  case file_magic::coff_import_library:
+    Symtab->addFile(make<ObjFile>(MBRef));
+    break;
   case file_magic::coff_cl_gl_object:
-    error(MBRef.getBufferIdentifier() + ": is not a native COFF file. "
-          "Recompile without /GL");
+    error(Filename + ": is not a native COFF file. Recompile without /GL");
     break;
-
+  case file_magic::pecoff_executable:
+    if (Filename.endswith_lower(".dll")) {
+      error(Filename + ": bad file type. Did you specify a DLL instead of an "
+                       "import library?");
+      break;
+    }
+    LLVM_FALLTHROUGH;
   default:
-    Symtab->addFile(make<ObjFile>(MBRef));
+    error(MBRef.getBufferIdentifier() + ": unknown file type");
     break;
   }
 }

Modified: lld/trunk/test/COFF/driver.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/driver.test?rev=326507&r1=326506&r2=326507&view=diff
==============================================================================
--- lld/trunk/test/COFF/driver.test (original)
+++ lld/trunk/test/COFF/driver.test Thu Mar  1 15:11:30 2018
@@ -4,3 +4,8 @@ MISSING: nosuchfile.obj: {{[Nn]}}o such
 
 # RUN: lld-link --version | FileCheck -check-prefix=VERSION %s
 VERSION: {{LLD [0-9]+\.[0-9]+}}
+
+# RUN: yaml2obj < %p/Inputs/export.yaml > %t.obj
+# RUN: lld-link /out:%t.dll /dll %t.obj
+# RUN: not lld-link /out:%t.exe %t.dll 2>&1 | FileCheck -check-prefix=BADFILE %s
+BADFILE: bad file type. Did you specify a DLL instead of an import library?




More information about the llvm-commits mailing list