ELFSectionRelTable.hxx revision 68aab0239525454d17465d927028cdbd2bfd2969
1b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien#ifndef ELF_SECTION_REL_TABLE_HXX 2b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien#define ELF_SECTION_REL_TABLE_HXX 3b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 4b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien#include "ELFReloc.h" 5b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 6b27ccae0d5900e923c13936274369f754d8e28e9Logan Chientemplate <unsigned Bitwidth> 7b27ccae0d5900e923c13936274369f754d8e28e9Logan ChienELFSectionRelTable<Bitwidth>::~ELFSectionRelTable() { 8b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien using namespace std; 968aab0239525454d17465d927028cdbd2bfd2969Logan Chien for (size_t i = 0; i < table.size(); ++i) { 1068aab0239525454d17465d927028cdbd2bfd2969Logan Chien delete table[i]; 11b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 12b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien} 13b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 14b27ccae0d5900e923c13936274369f754d8e28e9Logan Chientemplate <unsigned Bitwidth> 15b27ccae0d5900e923c13936274369f754d8e28e9Logan Chienvoid ELFSectionRelTable<Bitwidth>::print() const { 16b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien using namespace llvm; 17b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 18b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien out() << '\n' << fillformat('=', 79) << '\n'; 19b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien out().changeColor(raw_ostream::WHITE, true); 20b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien out() << "Relocation Table" << '\n'; 21b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien out().resetColor(); 22b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 23b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien for (size_t i = 0; i < this->size(); ++i) { 24b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien (*this)[i]->print(); 25b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 26b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 27b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien out() << fillformat('=', 79) << '\n'; 28b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien} 29b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 30b27ccae0d5900e923c13936274369f754d8e28e9Logan Chientemplate <unsigned Bitwidth> 31b27ccae0d5900e923c13936274369f754d8e28e9Logan Chientemplate <typename Archiver> 32b27ccae0d5900e923c13936274369f754d8e28e9Logan ChienELFSectionRelTable<Bitwidth> * 33b27ccae0d5900e923c13936274369f754d8e28e9Logan ChienELFSectionRelTable<Bitwidth>::read(Archiver &AR, 34b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien ELFSectionHeader<Bitwidth> const *sh) { 35b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 36b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien assert(sh->getType() == SHT_REL || sh->getType() == SHT_RELA); 37b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 38b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien llvm::OwningPtr<ELFSectionRelTable> rt(new ELFSectionRelTable()); 39b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 40b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien // Seek to the start of the table 41b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien AR.seek(sh->getOffset(), true); 42b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 43b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien // Count the relocation entries 44b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien size_t size = sh->getSize() / sh->getEntrySize(); 45b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 46b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien // Read every relocation entries 47b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien if (sh->getType() == SHT_REL) { 48b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien assert(sh->getEntrySize() == TypeTraits<ELFRelocRel<Bitwidth> >::size); 49b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien for (size_t i = 0; i < size; ++i) { 5068aab0239525454d17465d927028cdbd2bfd2969Logan Chien rt->table.push_back(ELFReloc<Bitwidth>::readRel(AR, i)); 51b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 52b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 53b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } else { 54b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien assert(sh->getEntrySize() == TypeTraits<ELFRelocRela<Bitwidth> >::size); 55b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien for (size_t i = 0; i < size; ++i) { 5668aab0239525454d17465d927028cdbd2bfd2969Logan Chien rt->table.push_back(ELFReloc<Bitwidth>::readRela(AR, i)); 57b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 58b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 59b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 60b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien if (!AR) { 61b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien // Unable to read the table. 62b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien return 0; 63b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 64b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 65b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien return rt.take(); 66b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien} 67b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 68b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien#endif // ELF_SECTION_REL_TABLE_HXX 69