diff options
-rw-r--r-- | lld/COFF/Driver.cpp | 10 | ||||
-rw-r--r-- | lld/test/COFF/entry-mangled.test | 33 |
2 files changed, 43 insertions, 0 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index bde1a6c56001..b07cb995249c 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -580,6 +580,16 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) { break; } + // Windows specific -- if entry point is not found, + // search for its mangled names. + if (!Config->EntryName.empty() && !Symtab.find(Config->EntryName)) { + StringRef Name; + Symbol *Sym; + std::tie(Name, Sym) = Symtab.findMangled(Config->EntryName); + if (Sym) + Symtab.rename(Config->EntryName, Name); + } + // Windows specific -- resolve dllexported symbols. for (Export &E : Config->Exports) { StringRef Name; diff --git a/lld/test/COFF/entry-mangled.test b/lld/test/COFF/entry-mangled.test new file mode 100644 index 000000000000..770594093be1 --- /dev/null +++ b/lld/test/COFF/entry-mangled.test @@ -0,0 +1,33 @@ +# RUN: yaml2obj < %s > %t.obj +# RUN: lld -flavor link2 /out:%t.exe /entry:main %t.obj + +--- +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: 000000000000 +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 6 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 + Selection: IMAGE_COMDAT_SELECT_ANY + - Name: '?main@@YAHXZ' + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +... |