summaryrefslogtreecommitdiff
path: root/lld/COFF/InputFiles.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/COFF/InputFiles.cpp')
-rw-r--r--lld/COFF/InputFiles.cpp30
1 files changed, 19 insertions, 11 deletions
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index 0b7dbea8cdd9..2a6b63cbacca 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -117,8 +117,6 @@ static coff_symbol_generic *cloneSymbol(COFFSymbolRef sym) {
// Skip importing DllMain thunks from import libraries.
static bool fixupDllMain(COFFLinkerContext &ctx, llvm::object::Archive *file,
const Archive::Symbol &sym, bool &skipDllMain) {
- if (skipDllMain)
- return true;
const Archive::Child &c =
CHECK(sym.getMember(), file->getFileName() +
": could not get the member for symbol " +
@@ -128,13 +126,13 @@ static bool fixupDllMain(COFFLinkerContext &ctx, llvm::object::Archive *file,
file->getFileName() +
": could not get the buffer for a child buffer of the archive");
if (identify_magic(mb.getBuffer()) == file_magic::coff_import_library) {
- if (ctx.config.warnExportedDllMain) {
+ if (ctx.config.warnImportedDllMain) {
// We won't place DllMain symbols in the symbol table if they are
// coming from a import library. This message can be ignored with the flag
- // '/ignore:exporteddllmain'
+ // '/ignore:importeddllmain'
Warn(ctx)
<< file->getFileName()
- << ": skipping exported DllMain symbol [exporteddllmain]\nNOTE: this "
+ << ": skipping imported DllMain symbol [importeddllmain]\nNOTE: this "
"might be a mistake when the DLL/library was produced.";
}
skipDllMain = true;
@@ -204,14 +202,24 @@ void ArchiveFile::parse() {
}
}
- // Read the symbol table to construct Lazy objects.
bool skipDllMain = false;
+ StringRef mangledDllMain, impMangledDllMain;
+
+ // The calls below will fail if we haven't set the machine type yet. Instead
+ // of failing, it is preferable to skip this "imported DllMain" check if we
+ // don't know the machine type at this point.
+ if (!file->isEmpty() && ctx.config.machine != IMAGE_FILE_MACHINE_UNKNOWN) {
+ mangledDllMain = archiveSymtab->mangle("DllMain");
+ impMangledDllMain = uniqueSaver().save("__imp_" + mangledDllMain);
+ }
+
+ // Read the symbol table to construct Lazy objects.
for (const Archive::Symbol &sym : file->symbols()) {
- // If the DllMain symbol was exported by mistake, skip importing it
- // otherwise we might end up with a import thunk in the final binary which
- // is wrong.
- if (sym.getName() == "__imp_DllMain" || sym.getName() == "DllMain") {
- if (fixupDllMain(ctx, file.get(), sym, skipDllMain))
+ // If an import library provides the DllMain symbol, skip importing it, as
+ // we should be using our own DllMain, not another DLL's DllMain.
+ if (!mangledDllMain.empty() && (sym.getName() == mangledDllMain ||
+ sym.getName() == impMangledDllMain)) {
+ if (skipDllMain || fixupDllMain(ctx, file.get(), sym, skipDllMain))
continue;
}
archiveSymtab->addLazyArchive(this, sym);