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