diff options
-rw-r--r-- | lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp | 12 | ||||
-rw-r--r-- | lld/test/pecoff/Inputs/executable.obj.yaml | 29 | ||||
-rw-r--r-- | lld/test/pecoff/Inputs/executable.s | 17 | ||||
-rw-r--r-- | lld/test/pecoff/armnt-address-of-entry-point.test | 6 |
4 files changed, 61 insertions, 3 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp index 9a15901e82c..08930b9ba21 100644 --- a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp +++ b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp @@ -1160,11 +1160,17 @@ void PECOFFWriter::build(const File &linkedFile) { // says that entry point for dll images is optional, in which case it must // be set to 0. if (_ctx.hasEntry()) { + AtomChunk *atom = cast<AtomChunk>(section); uint64_t entryPointAddress = - dyn_cast<AtomChunk>(section) - ->getAtomVirtualAddress(_ctx.getEntrySymbolName()); - if (entryPointAddress != 0) + atom->getAtomVirtualAddress(_ctx.getEntrySymbolName()); + + if (entryPointAddress) { + // NOTE: ARM NT assumes a pure THUMB execution, so adjust the entry + // point accordingly + if (_ctx.getMachineType() == llvm::COFF::IMAGE_FILE_MACHINE_ARMNT) + entryPointAddress |= 1; peHeader->setAddressOfEntryPoint(entryPointAddress); + } } else { peHeader->setAddressOfEntryPoint(0); } diff --git a/lld/test/pecoff/Inputs/executable.obj.yaml b/lld/test/pecoff/Inputs/executable.obj.yaml new file mode 100644 index 00000000000..73ba0fe7191 --- /dev/null +++ b/lld/test/pecoff/Inputs/executable.obj.yaml @@ -0,0 +1,29 @@ +--- +header: + Machine: IMAGE_FILE_MACHINE_ARMNT + Characteristics: [ ] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_PURGEABLE, IMAGE_SCN_MEM_16BIT, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: '7047' +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 2 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 1 + - Name: mainCRTStartup + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +... diff --git a/lld/test/pecoff/Inputs/executable.s b/lld/test/pecoff/Inputs/executable.s new file mode 100644 index 00000000000..1c58f7331b2 --- /dev/null +++ b/lld/test/pecoff/Inputs/executable.s @@ -0,0 +1,17 @@ + +# void mainCRTStartup(){} + + .syntax unified + .thumb + .text + + .def mainCRTStartup + .scl 2 + .type 32 + .endef + .global mainCRTStartup + .align 2 + .thumb_func +mainCRTStartup: + bx lr + diff --git a/lld/test/pecoff/armnt-address-of-entry-point.test b/lld/test/pecoff/armnt-address-of-entry-point.test new file mode 100644 index 00000000000..3013b230bbd --- /dev/null +++ b/lld/test/pecoff/armnt-address-of-entry-point.test @@ -0,0 +1,6 @@ +# RUN: yaml2obj -format coff -o %t.obj %p/Inputs/executable.obj.yaml +# RUN: lld -flavor link /out:%t.exe %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: AddressOfEntryPoint: 0x1001 + |