summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp12
-rw-r--r--lld/test/pecoff/Inputs/executable.obj.yaml29
-rw-r--r--lld/test/pecoff/Inputs/executable.s17
-rw-r--r--lld/test/pecoff/armnt-address-of-entry-point.test6
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
+
OpenPOWER on IntegriCloud