summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/Mips/MipsDynamicTable.h
diff options
context:
space:
mode:
authorSimon Atanasyan <simon@atanasyan.com>2015-04-20 07:36:27 +0000
committerSimon Atanasyan <simon@atanasyan.com>2015-04-20 07:36:27 +0000
commit84adf3ff1579134a4b019a09ba69504d5de1fe05 (patch)
tree55541a70d5b1b9a3119daca2daa300589e46b7b7 /lld/lib/ReaderWriter/ELF/Mips/MipsDynamicTable.h
parent811922897710b9790678b588f63bb4182ce8f4ec (diff)
downloadbcm5719-llvm-84adf3ff1579134a4b019a09ba69504d5de1fe05.tar.gz
bcm5719-llvm-84adf3ff1579134a4b019a09ba69504d5de1fe05.zip
[Mips] Write DT_MIPS_OPTIONS tag to .dynamic section
If .MIPS.options section exists the DT_MIPS_OPTIONS tag should hold an address of this section. llvm-svn: 235290
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/Mips/MipsDynamicTable.h')
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsDynamicTable.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsDynamicTable.h b/lld/lib/ReaderWriter/ELF/Mips/MipsDynamicTable.h
index 9731fefd813..8f2d36edea1 100644
--- a/lld/lib/ReaderWriter/ELF/Mips/MipsDynamicTable.h
+++ b/lld/lib/ReaderWriter/ELF/Mips/MipsDynamicTable.h
@@ -66,6 +66,17 @@ public:
_dt_pltgot = this->addEntry(dyn);
}
+ void doPreFlight() override {
+ DynamicTable<ELFT>::doPreFlight();
+
+ if (_targetLayout.findOutputSection(".MIPS.options")) {
+ typename DynamicTable<ELFT>::Elf_Dyn dyn;
+ dyn.d_un.d_val = 0;
+ dyn.d_tag = DT_MIPS_OPTIONS;
+ _dt_options = this->addEntry(dyn);
+ }
+ }
+
void updateDynamicTable() override {
DynamicTable<ELFT>::updateDynamicTable();
@@ -83,6 +94,9 @@ public:
this->getSymbolTable()->size() - got.getGlobalCount();
this->_entries[_dt_localgot].d_un.d_val = got.getLocalCount();
this->_entries[_dt_pltgot].d_un.d_ptr = got.virtualAddr();
+
+ if (const auto *sec = _targetLayout.findOutputSection(".MIPS.options"))
+ this->_entries[_dt_options].d_un.d_ptr = sec->virtualAddr();
}
int64_t getGotPltTag() override { return DT_MIPS_PLTGOT; }
@@ -103,6 +117,7 @@ private:
std::size_t _dt_gotsym;
std::size_t _dt_pltgot;
std::size_t _dt_baseaddr;
+ std::size_t _dt_options;
MipsTargetLayout<ELFT> &_targetLayout;
};
OpenPOWER on IntegriCloud