summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/ReaderWriter')
-rw-r--r--lld/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/lld/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h b/lld/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h
index 4e475e50bcd..19311d516e4 100644
--- a/lld/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h
+++ b/lld/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h
@@ -42,6 +42,10 @@ protected:
void processUndefinedSymbol(StringRef symName,
RuntimeFile<ELFT> &file) const override;
+
+ // Setup the ELF header.
+ std::error_code setELFHeader() override;
+
private:
ARMLinkingContext &_context;
ARMTargetLayout<ELFT> &_armLayout;
@@ -95,6 +99,22 @@ void ARMExecutableWriter<ELFT>::processUndefinedSymbol(
}
}
+template <class ELFT>
+std::error_code ARMExecutableWriter<ELFT>::setELFHeader() {
+ if (std::error_code ec = ExecutableWriter<ELFT>::setELFHeader())
+ return ec;
+
+ // Fixup entry point for Thumb code.
+ StringRef entryName = _context.entrySymbolName();
+ if (const AtomLayout *al = _armLayout.findAtomLayoutByName(entryName)) {
+ const auto *ea = dyn_cast<DefinedAtom>(al->_atom);
+ if (ea && ea->codeModel() == DefinedAtom::codeARMThumb)
+ this->_elfHeader->e_entry(al->_virtualAddr | 0x1);
+ }
+
+ return std::error_code();
+}
+
} // namespace elf
} // namespace lld
OpenPOWER on IntegriCloud