[lld] r176430 - [ELF] no functionality change, update dynamicTable functionality
Shankar Easwaran
shankare at codeaurora.org
Sun Mar 3 18:21:16 PST 2013
Author: shankare
Date: Sun Mar 3 20:21:16 2013
New Revision: 176430
URL: http://llvm.org/viewvc/llvm-project?rev=176430&view=rev
Log:
[ELF] no functionality change, update dynamicTable functionality
Modified:
lld/trunk/lib/ReaderWriter/ELF/ExecutableWriter.h
lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
Modified: lld/trunk/lib/ReaderWriter/ELF/ExecutableWriter.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ExecutableWriter.h?rev=176430&r1=176429&r2=176430&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ExecutableWriter.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ExecutableWriter.h Sun Mar 3 20:21:16 2013
@@ -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>::write
createDefaultSections();
if (_targetInfo.isDynamic()) {
- createDefaultDynamicEntries();
+ _dynamicTable->createDefaultEntries();
buildDynamicSymbolTable(file);
}
@@ -360,7 +292,8 @@ error_code ExecutableWriter<ELFT>::write
assignSectionsWithNoSegments();
if (_targetInfo.isDynamic())
- updateDynamicTable();
+ _dynamicTable->updateDynamicTable(_hashTable.get(),
+ _dynamicSymbolTable.get());
uint64_t totalSize = _shdrtab->fileOffset() + _shdrtab->fileSize();
Modified: lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h?rev=176430&r1=176429&r2=176430&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h Sun Mar 3 20:21:16 2013
@@ -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> {
More information about the llvm-commits
mailing list