[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