diff --git a/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h b/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h index 9d5c37937f28..57aae835c25d 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 73fa4f7195eb..22dd2f01ca9e 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 595ea18fc9f6..ba4d5b2002e0 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 404cf431ea50..f4472d8bae88 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