[lld] r240953 - COFF: Handle mangled entry symbol name.

Rui Ueyama ruiu at google.com
Mon Jun 29 07:43:07 PDT 2015


Author: ruiu
Date: Mon Jun 29 09:43:07 2015
New Revision: 240953

URL: http://llvm.org/viewvc/llvm-project?rev=240953&view=rev
Log:
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.

Added:
    lld/trunk/test/COFF/entry-mangled.test
Modified:
    lld/trunk/COFF/Driver.cpp

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=240953&r1=240952&r2=240953&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Mon Jun 29 09:43:07 2015
@@ -580,6 +580,16 @@ bool LinkerDriver::link(llvm::ArrayRef<c
       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;

Added: lld/trunk/test/COFF/entry-mangled.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/entry-mangled.test?rev=240953&view=auto
==============================================================================
--- lld/trunk/test/COFF/entry-mangled.test (added)
+++ lld/trunk/test/COFF/entry-mangled.test Mon Jun 29 09:43:07 2015
@@ -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
+...





More information about the llvm-commits mailing list