diff options
| author | Shankar Easwaran <shankare@codeaurora.org> | 2013-03-04 02:21:16 +0000 |
|---|---|---|
| committer | Shankar Easwaran <shankare@codeaurora.org> | 2013-03-04 02:21:16 +0000 |
| commit | 7b0ae11c8265f6d42bbdd02eacd1c8c07cb2fcc5 (patch) | |
| tree | e04fcfbab06813ceca3c32716389783b2d5d5393 | |
| parent | 58d6eb6d033bcfe10ac3964b03702d6808452fd1 (diff) | |
| download | bcm5719-llvm-7b0ae11c8265f6d42bbdd02eacd1c8c07cb2fcc5.tar.gz bcm5719-llvm-7b0ae11c8265f6d42bbdd02eacd1c8c07cb2fcc5.zip | |
[ELF] no functionality change, update dynamicTable functionality
llvm-svn: 176430
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/ExecutableWriter.h | 75 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/SectionChunks.h | 78 |
2 files changed, 82 insertions, 71 deletions
diff --git a/lld/lib/ReaderWriter/ELF/ExecutableWriter.h b/lld/lib/ReaderWriter/ELF/ExecutableWriter.h index 155a1bd1357..89e9ed4089a 100644 --- a/lld/lib/ReaderWriter/ELF/ExecutableWriter.h +++ b/lld/lib/ReaderWriter/ELF/ExecutableWriter.h @@ -58,63 +58,7 @@ private: void createDefaultSections(); - void createDefaultDynamicEntries() { - Elf_Dyn dyn; - dyn.d_un.d_val = 0; - - dyn.d_tag = DT_HASH; - _dt_hash = _dynamicTable->addEntry(dyn); - dyn.d_tag = DT_STRTAB; - _dt_strtab = _dynamicTable->addEntry(dyn); - dyn.d_tag = DT_SYMTAB; - _dt_symtab = _dynamicTable->addEntry(dyn); - dyn.d_tag = DT_STRSZ; - _dt_strsz = _dynamicTable->addEntry(dyn); - dyn.d_tag = DT_SYMENT; - _dt_syment = _dynamicTable->addEntry(dyn); - if (_layout->hasDynamicRelocationTable()) { - dyn.d_tag = DT_RELA; - _dt_rela = _dynamicTable->addEntry(dyn); - dyn.d_tag = DT_RELASZ; - _dt_relasz = _dynamicTable->addEntry(dyn); - dyn.d_tag = DT_RELAENT; - _dt_relaent = _dynamicTable->addEntry(dyn); - } - if (_layout->hasPLTRelocationTable()) { - dyn.d_tag = DT_PLTRELSZ; - _dt_pltrelsz = _dynamicTable->addEntry(dyn); - dyn.d_tag = DT_PLTGOT; - _dt_pltgot = _dynamicTable->addEntry(dyn); - dyn.d_tag = DT_PLTREL; - dyn.d_un.d_val = DT_RELA; - _dt_pltrel = _dynamicTable->addEntry(dyn); - dyn.d_un.d_val = 0; - dyn.d_tag = DT_JMPREL; - _dt_jmprel = _dynamicTable->addEntry(dyn); - } - } - - void updateDynamicTable() { - auto tbl = _dynamicTable->entries(); - tbl[_dt_hash].d_un.d_val = _hashTable->virtualAddr(); - tbl[_dt_strtab].d_un.d_val = _dynamicStringTable->virtualAddr(); - tbl[_dt_symtab].d_un.d_val = _dynamicSymbolTable->virtualAddr(); - tbl[_dt_strsz].d_un.d_val = _dynamicStringTable->memSize(); - tbl[_dt_syment].d_un.d_val = _dynamicSymbolTable->getEntSize(); - if (_layout->hasDynamicRelocationTable()) { - auto relaTbl = _layout->getDynamicRelocationTable(); - tbl[_dt_rela].d_un.d_val = relaTbl->virtualAddr(); - tbl[_dt_relasz].d_un.d_val = relaTbl->memSize(); - tbl[_dt_relaent].d_un.d_val = relaTbl->getEntSize(); - } - if (_layout->hasPLTRelocationTable()) { - auto relaTbl = _layout->getPLTRelocationTable(); - tbl[_dt_jmprel].d_un.d_val = relaTbl->virtualAddr(); - tbl[_dt_pltrelsz].d_un.d_val = relaTbl->memSize(); - auto gotplt = _layout->findOutputSection(".got.plt"); - tbl[_dt_pltgot].d_un.d_val = gotplt->virtualAddr(); - } - } + void createDefaultDynamicEntries() {} llvm::BumpPtrAllocator _alloc; @@ -138,18 +82,6 @@ private: LLD_UNIQUE_BUMP_PTR(InterpSection<ELFT>) _interpSection; LLD_UNIQUE_BUMP_PTR(HashSection<ELFT>) _hashTable; llvm::StringSet<> _soNeeded; - std::size_t _dt_hash; - std::size_t _dt_strtab; - std::size_t _dt_symtab; - std::size_t _dt_rela; - std::size_t _dt_relasz; - std::size_t _dt_relaent; - std::size_t _dt_strsz; - std::size_t _dt_syment; - std::size_t _dt_pltrelsz; - std::size_t _dt_pltgot; - std::size_t _dt_pltrel; - std::size_t _dt_jmprel; /// @} CRuntimeFile<ELFT> _runtimeFile; }; @@ -331,7 +263,7 @@ error_code ExecutableWriter<ELFT>::writeFile(const File &file, StringRef path) { createDefaultSections(); if (_targetInfo.isDynamic()) { - createDefaultDynamicEntries(); + _dynamicTable->createDefaultEntries(); buildDynamicSymbolTable(file); } @@ -360,7 +292,8 @@ error_code ExecutableWriter<ELFT>::writeFile(const File &file, StringRef path) { assignSectionsWithNoSegments(); if (_targetInfo.isDynamic()) - updateDynamicTable(); + _dynamicTable->updateDynamicTable(_hashTable.get(), + _dynamicSymbolTable.get()); uint64_t totalSize = _shdrtab->fileOffset() + _shdrtab->fileSize(); diff --git a/lld/lib/ReaderWriter/ELF/SectionChunks.h b/lld/lib/ReaderWriter/ELF/SectionChunks.h index a01c482e80f..4f901e33bec 100644 --- a/lld/lib/ReaderWriter/ELF/SectionChunks.h +++ b/lld/lib/ReaderWriter/ELF/SectionChunks.h @@ -616,6 +616,8 @@ public: void setStringSection(StringTable<ELFT> *s) { _stringSection = s; } + StringTable<ELFT> *getStringTable() const { return _stringSection; } + private: llvm::BumpPtrAllocator _symbolAllocate; StringTable<ELFT> *_stringSection; @@ -832,6 +834,8 @@ private: const SymbolTable<ELFT> *_symbolTable; }; +template <class ELFT> class HashSection; + template <class ELFT> class DynamicTable : public Section<ELFT> { typedef llvm::object::Elf_Dyn_Impl<ELFT> Elf_Dyn; typedef std::vector<Elf_Dyn> EntriesT; @@ -847,6 +851,7 @@ public: this->_msize = sizeof(Elf_Dyn); this->_type = SHT_DYNAMIC; this->_flags = SHF_ALLOC; + _layout = &ti.getTargetHandler<ELFT>().targetLayout(); } range<typename EntriesT::iterator> entries() { return _entries; } @@ -870,8 +875,81 @@ public: std::memcpy(dest, _entries.data(), this->_fsize); } + void createDefaultEntries() { + Elf_Dyn dyn; + dyn.d_un.d_val = 0; + + dyn.d_tag = DT_HASH; + _dt_hash = addEntry(dyn); + dyn.d_tag = DT_STRTAB; + _dt_strtab = addEntry(dyn); + dyn.d_tag = DT_SYMTAB; + _dt_symtab = addEntry(dyn); + dyn.d_tag = DT_STRSZ; + _dt_strsz = addEntry(dyn); + dyn.d_tag = DT_SYMENT; + _dt_syment = addEntry(dyn); + if (_layout->hasDynamicRelocationTable()) { + dyn.d_tag = DT_RELA; + _dt_rela = addEntry(dyn); + dyn.d_tag = DT_RELASZ; + _dt_relasz = addEntry(dyn); + dyn.d_tag = DT_RELAENT; + _dt_relaent = addEntry(dyn); + } + if (_layout->hasPLTRelocationTable()) { + dyn.d_tag = DT_PLTRELSZ; + _dt_pltrelsz = addEntry(dyn); + dyn.d_tag = DT_PLTGOT; + _dt_pltgot = addEntry(dyn); + dyn.d_tag = DT_PLTREL; + dyn.d_un.d_val = DT_RELA; + _dt_pltrel = addEntry(dyn); + dyn.d_un.d_val = 0; + dyn.d_tag = DT_JMPREL; + _dt_jmprel = addEntry(dyn); + } + } + + void updateDynamicTable(HashSection<ELFT> *hashTable, + DynamicSymbolTable<ELFT> *dynamicSymbolTable) { + StringTable<ELFT> *dynamicStringTable = + dynamicSymbolTable->getStringTable(); + _entries[_dt_hash].d_un.d_val = hashTable->virtualAddr(); + _entries[_dt_strtab].d_un.d_val = dynamicStringTable->virtualAddr(); + _entries[_dt_symtab].d_un.d_val = dynamicSymbolTable->virtualAddr(); + _entries[_dt_strsz].d_un.d_val = dynamicStringTable->memSize(); + _entries[_dt_syment].d_un.d_val = dynamicSymbolTable->getEntSize(); + if (_layout->hasDynamicRelocationTable()) { + auto relaTbl = _layout->getDynamicRelocationTable(); + _entries[_dt_rela].d_un.d_val = relaTbl->virtualAddr(); + _entries[_dt_relasz].d_un.d_val = relaTbl->memSize(); + _entries[_dt_relaent].d_un.d_val = relaTbl->getEntSize(); + } + if (_layout->hasPLTRelocationTable()) { + auto relaTbl = _layout->getPLTRelocationTable(); + _entries[_dt_jmprel].d_un.d_val = relaTbl->virtualAddr(); + _entries[_dt_pltrelsz].d_un.d_val = relaTbl->memSize(); + auto gotplt = _layout->findOutputSection(".got.plt"); + _entries[_dt_pltgot].d_un.d_val = gotplt->virtualAddr(); + } + } + private: EntriesT _entries; + std::size_t _dt_hash; + std::size_t _dt_strtab; + std::size_t _dt_symtab; + std::size_t _dt_rela; + std::size_t _dt_relasz; + std::size_t _dt_relaent; + std::size_t _dt_strsz; + std::size_t _dt_syment; + std::size_t _dt_pltrelsz; + std::size_t _dt_pltgot; + std::size_t _dt_pltrel; + std::size_t _dt_jmprel; + TargetLayout<ELFT> *_layout; }; template <class ELFT> class InterpSection : public Section<ELFT> { |

