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
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
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
-rw-r--r--lld/COFF/Driver.cpp10
-rw-r--r--lld/test/COFF/entry-mangled.test33
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
+...