Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lld/COFF
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-06-29 17:43:07 +0300
committerRui Ueyama <ruiu@google.com>2015-06-29 17:43:07 +0300
commit2d5e917bce390b889ffd476920b69c9256266d36 (patch)
tree624e991c057992ce8352c9aa792ca006b9d38f5c /lld/COFF
parent3cdc37c5bce813928d26b4268943ee4c604d93a1 (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.cpp10
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;