diff options
author | Rui Ueyama <ruiu@google.com> | 2015-06-29 17:43:07 +0300 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2015-06-29 17:43:07 +0300 |
commit | 2d5e917bce390b889ffd476920b69c9256266d36 (patch) | |
tree | 624e991c057992ce8352c9aa792ca006b9d38f5c /lld/COFF | |
parent | 3cdc37c5bce813928d26b4268943ee4c604d93a1 (diff) |
COFF: Handle mangled entry symbol name.
Compilers recognize "main" function and don't mangle its name.
But if you use a different function as a user-defined entry name,
and if you didn't define that function with extern C, your entry
point function name is mangled. And the linker has to be able to
find that. This is relatively rare but can happen.
llvm-svn: 240953
Diffstat (limited to 'lld/COFF')
-rw-r--r-- | lld/COFF/Driver.cpp | 10 |
1 files changed, 10 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; |