forked from OSchip/llvm-project
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 llvm-svn: 326507
This commit is contained in:
parent
036ed36f0a
commit
cdd5fb5087
|
@ -124,40 +124,47 @@ MemoryBufferRef LinkerDriver::takeBuffer(std::unique_ptr<MemoryBuffer> MB) {
|
|||
|
||||
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_cl_gl_object:
|
||||
error(MBRef.getBufferIdentifier() + ": is not a native COFF file. "
|
||||
"Recompile without /GL");
|
||||
break;
|
||||
|
||||
default:
|
||||
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(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:
|
||||
error(MBRef.getBufferIdentifier() + ": unknown file type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,3 +4,8 @@ MISSING: nosuchfile.obj: {{[Nn]}}o such file or directory
|
|||
|
||||
# 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?
|
||||
|
|
Loading…
Reference in New Issue