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