ELFSectionRelTable.hxx revision ee6cdb95525abc8c7766798148302306a100b774
1ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao/* 2ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Copyright 2011, The Android Open Source Project 3ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * 4ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 5ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * you may not use this file except in compliance with the License. 6ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * You may obtain a copy of the License at 7ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * 8ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 9ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * 10ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Unless required by applicable law or agreed to in writing, software 11ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 12ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * See the License for the specific language governing permissions and 14ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * limitations under the License. 15ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao */ 16ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao 17b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien#ifndef ELF_SECTION_REL_TABLE_HXX 18b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien#define ELF_SECTION_REL_TABLE_HXX 19b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 20b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien#include "ELFReloc.h" 21b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 22b27ccae0d5900e923c13936274369f754d8e28e9Logan Chientemplate <unsigned Bitwidth> 23b27ccae0d5900e923c13936274369f754d8e28e9Logan ChienELFSectionRelTable<Bitwidth>::~ELFSectionRelTable() { 24b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien using namespace std; 2568aab0239525454d17465d927028cdbd2bfd2969Logan Chien for (size_t i = 0; i < table.size(); ++i) { 2668aab0239525454d17465d927028cdbd2bfd2969Logan Chien delete table[i]; 27b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 28b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien} 29b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 30b27ccae0d5900e923c13936274369f754d8e28e9Logan Chientemplate <unsigned Bitwidth> 31b27ccae0d5900e923c13936274369f754d8e28e9Logan Chienvoid ELFSectionRelTable<Bitwidth>::print() const { 32b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien using namespace llvm; 33b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 34b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien out() << '\n' << fillformat('=', 79) << '\n'; 35b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien out().changeColor(raw_ostream::WHITE, true); 36b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien out() << "Relocation Table" << '\n'; 37b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien out().resetColor(); 38b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 39b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien for (size_t i = 0; i < this->size(); ++i) { 40b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien (*this)[i]->print(); 41b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 42b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 43b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien out() << fillformat('=', 79) << '\n'; 44b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien} 45b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 46b27ccae0d5900e923c13936274369f754d8e28e9Logan Chientemplate <unsigned Bitwidth> 47b27ccae0d5900e923c13936274369f754d8e28e9Logan Chientemplate <typename Archiver> 48b27ccae0d5900e923c13936274369f754d8e28e9Logan ChienELFSectionRelTable<Bitwidth> * 49b27ccae0d5900e923c13936274369f754d8e28e9Logan ChienELFSectionRelTable<Bitwidth>::read(Archiver &AR, 5058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFSectionHeaderTy const *sh) { 51b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 52c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa rsl_assert(sh->getType() == SHT_REL || sh->getType() == SHT_RELA); 53b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 54b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien llvm::OwningPtr<ELFSectionRelTable> rt(new ELFSectionRelTable()); 55b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 56b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien // Seek to the start of the table 57b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien AR.seek(sh->getOffset(), true); 58b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 59b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien // Count the relocation entries 60b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien size_t size = sh->getSize() / sh->getEntrySize(); 61b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 62b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien // Read every relocation entries 63b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien if (sh->getType() == SHT_REL) { 64c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa rsl_assert(sh->getEntrySize() == TypeTraits<ELFRelocRelTy>::size); 65b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien for (size_t i = 0; i < size; ++i) { 6658611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien rt->table.push_back(ELFRelocTy::readRel(AR, i)); 67b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 68b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 69b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } else { 70c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa rsl_assert(sh->getEntrySize() == TypeTraits<ELFRelocRelaTy>::size); 71b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien for (size_t i = 0; i < size; ++i) { 7258611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien rt->table.push_back(ELFRelocTy::readRela(AR, i)); 73b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 74b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 75b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 76b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien if (!AR) { 77b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien // Unable to read the table. 78b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien return 0; 79b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien } 80b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 81b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien return rt.take(); 82b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien} 83b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien 84b27ccae0d5900e923c13936274369f754d8e28e9Logan Chien#endif // ELF_SECTION_REL_TABLE_HXX 85