[lld] r213802 - [PECOFF] Fix entry point address.

Rui Ueyama ruiu at google.com
Wed Jul 23 13:51:04 PDT 2014


Author: ruiu
Date: Wed Jul 23 15:51:04 2014
New Revision: 213802

URL: http://llvm.org/viewvc/llvm-project?rev=213802&view=rev
Log:
[PECOFF] Fix entry point address.

Because of a bug, the entry point address in the PE/COFF header
was not correct.

Modified:
    lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
    lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
    lld/trunk/test/pecoff/Inputs/entry.obj.yaml
    lld/trunk/test/pecoff/entry.test

Modified: lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h?rev=213802&r1=213801&r2=213802&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h Wed Jul 23 15:51:04 2014
@@ -303,6 +303,8 @@ private:
       StringRef entrySym = _ctx->allocate(_ctx->decorateSymbol(getEntry()));
       _undefinedAtoms._atoms.push_back(
           new (_alloc) SimpleUndefinedAtom(*this, entrySym));
+      _ctx->setHasEntry(true);
+      _ctx->setEntrySymbolName(entrySym);
       if (_ctx->deadStrip())
         _ctx->addDeadStripRoot(entrySym);
     }

Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=213802&r1=213801&r2=213802&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Wed Jul 23 15:51:04 2014
@@ -968,14 +968,14 @@ void PECOFFWriter::build(const File &lin
       // Find the virtual address of the entry point symbol if any.  PECOFF spec
       // says that entry point for dll images is optional, in which case it must
       // be set to 0.
-      if (_ctx.entrySymbolName().empty() && _ctx.isDll()) {
-        peHeader->setAddressOfEntryPoint(0);
-      } else {
+      if (_ctx.hasEntry()) {
         uint64_t entryPointAddress =
             dyn_cast<AtomChunk>(section)
-                ->getAtomVirtualAddress(_ctx.entrySymbolName());
+                ->getAtomVirtualAddress(_ctx.getEntrySymbolName());
         if (entryPointAddress != 0)
           peHeader->setAddressOfEntryPoint(entryPointAddress);
+      } else {
+        peHeader->setAddressOfEntryPoint(0);
       }
     }
     if (section->getSectionName() == ".data")

Modified: lld/trunk/test/pecoff/Inputs/entry.obj.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/entry.obj.yaml?rev=213802&r1=213801&r2=213802&view=diff
==============================================================================
--- lld/trunk/test/pecoff/Inputs/entry.obj.yaml (original)
+++ lld/trunk/test/pecoff/Inputs/entry.obj.yaml Wed Jul 23 15:51:04 2014
@@ -23,4 +23,11 @@ symbols:
     SimpleType:      IMAGE_SYM_TYPE_NULL
     ComplexType:     IMAGE_SYM_DTYPE_NULL
     StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
+
+  - Name:            _bar
+    Value:           4
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
 ...

Modified: lld/trunk/test/pecoff/entry.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/entry.test?rev=213802&r1=213801&r2=213802&view=diff
==============================================================================
--- lld/trunk/test/pecoff/entry.test (original)
+++ lld/trunk/test/pecoff/entry.test Wed Jul 23 15:51:04 2014
@@ -25,3 +25,9 @@ WINMAIN: _WinMainCRTStartup
 # RUN: FileCheck -check-prefix=WWINMAIN %s < %t.log
 
 WWINMAIN: _wWinMainCRTStartup
+
+# RUN: lld -flavor link /out:%t.exe /alternatename:_main=_foo \
+# RUN:   /alternatename:_mainCRTStartup=_bar -- %t.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=MAINADDR %s
+
+MAINADDR: AddressOfEntryPoint: 0x1004





More information about the llvm-commits mailing list