From 23314e1ca628594504347dc42f3728d8285c8dee Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 23 Jul 2014 20:51:04 +0000 Subject: [PATCH] [PECOFF] Fix entry point address. Because of a bug, the entry point address in the PE/COFF header was not correct. llvm-svn: 213802 --- lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h | 2 ++ lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp | 8 ++++---- lld/test/pecoff/Inputs/entry.obj.yaml | 7 +++++++ lld/test/pecoff/entry.test | 6 ++++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h b/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h index 9d5c379..57aae83 100644 --- a/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h +++ b/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h @@ -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); } diff --git a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp index 73fa4f7..22dd2f0 100644 --- a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp +++ b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp @@ -968,14 +968,14 @@ void PECOFFWriter::build(const File &linkedFile) { // 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(section) - ->getAtomVirtualAddress(_ctx.entrySymbolName()); + ->getAtomVirtualAddress(_ctx.getEntrySymbolName()); if (entryPointAddress != 0) peHeader->setAddressOfEntryPoint(entryPointAddress); + } else { + peHeader->setAddressOfEntryPoint(0); } } if (section->getSectionName() == ".data") diff --git a/lld/test/pecoff/Inputs/entry.obj.yaml b/lld/test/pecoff/Inputs/entry.obj.yaml index 595ea18..ba4d5b20 100644 --- a/lld/test/pecoff/Inputs/entry.obj.yaml +++ b/lld/test/pecoff/Inputs/entry.obj.yaml @@ -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 ... diff --git a/lld/test/pecoff/entry.test b/lld/test/pecoff/entry.test index 404cf43..f4472d8 100644 --- a/lld/test/pecoff/entry.test +++ b/lld/test/pecoff/entry.test @@ -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 -- 2.7.4