ELFSymbol.h revision 5c543a0761c5a7f72565351bc16ec31d6f675602
11e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#ifndef ELF_SECTION_SYMTAB_ENTRY_H
21e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#define ELF_SECTION_SYMTAB_ENTRY_H
31e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
41e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#include "ELFTypes.h"
51e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
62956c0e06b1c51f521645a076802686976c4b2f6TDYa#include <llvm/ADT/OwningPtr.h>
7d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa#include <elf.h>
82956c0e06b1c51f521645a076802686976c4b2f6TDYa
91e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#include <string>
10d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa#include <cassert>
11d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa#include <cstdlib>
12937df4784a064c4f32b3354f76ef9c4361711173TDYa#include <algorithm>
131e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
141e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#include <stdint.h>
151e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
161e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYatemplate <size_t Bitwidth> class ELFObject;
171e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYatemplate <size_t Bitwidth> class ELFSectionSymTabEntry;
181e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYatemplate <size_t Bitwidth> class ELFSectionSymTabEntry_CRTP;
191e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
201e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
211e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaclass ELFSectionSymTabEntryHelperMixin {
221e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaprotected:
231e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  static char const *getTypeStr(uint8_t);
241e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  static char const *getBindingAttributeStr(uint8_t);
251e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  static char const *getVisibilityStr(uint8_t);
261e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa};
271e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
281e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
291e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYatemplate <size_t Bitwidth>
301e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaclass ELFSectionSymTabEntry_CRTP : private ELFSectionSymTabEntryHelperMixin {
311e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYapublic:
321e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth);
331e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
341e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  typedef ELFSectionSymTabEntry<Bitwidth> ConcreteELFSectionSymTabEntry;
351e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
361e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaprotected:
371e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  ELFObject<Bitwidth> const *owner;
381e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
391e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  size_t index;
401e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
411e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  word_t st_name;
421e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  byte_t st_info;
431e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  byte_t st_other;
441e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  half_t st_shndx;
451e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  addr_t st_value;
461e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  xword_t st_size;
471e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
48d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  mutable void *my_addr;
49d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
501e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaprotected:
51d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  ELFSectionSymTabEntry_CRTP() { my_addr = 0; }
52d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  ~ELFSectionSymTabEntry_CRTP() {
53d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    if (my_addr != 0 &&
54d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        getType() == STT_OBJECT &&
55d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        getSectionIndex() == SHN_COMMON) {
56d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      std::free(my_addr);
57d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    }
58d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  }
591e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
601e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYapublic:
611e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  size_t getIndex() const {
621e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return index;
631e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
641e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
651e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  word_t getNameIndex() const {
661e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return st_name;
671e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
681e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
691e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  char const *getName() const;
701e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
711e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa// I don't want to include elf.h in .h file, so define those macro by ourself.
721e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#define ELF_ST_BIND(i)   ((i)>>4)
731e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#define ELF_ST_TYPE(i)   ((i)&0xf)
741e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#define ELF_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
751e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  byte_t getType() const {
761e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return ELF_ST_TYPE(st_info);
771e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
781e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
791e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  byte_t getBindingAttribute() const {
801e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return ELF_ST_BIND(st_info);
811e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
821e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#undef ELF_ST_BIND
831e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#undef ELF_ST_TYPE
841e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#undef ELF_ST_INFO
851e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
861e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#define ELF_ST_VISIBILITY(o) ((o)&0x3)
871e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  byte_t getVisibility() const {
881e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return ELF_ST_VISIBILITY(st_other);
891e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
901e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#undef ELF_ST_VISIBILITY
911e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
921e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  half_t getSectionIndex() const {
931e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return st_shndx;
941e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
951e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
961e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  addr_t getValue() const {
971e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return st_value;
981e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
991e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1001e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  xword_t getSize() const {
1011e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return st_size;
1021e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
1031e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
104d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  void *getAddress() const;
105d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
1065c543a0761c5a7f72565351bc16ec31d6f675602TDYa  void setAddress(void *addr) {
1075c543a0761c5a7f72565351bc16ec31d6f675602TDYa    my_addr = addr;
1085c543a0761c5a7f72565351bc16ec31d6f675602TDYa  }
1095c543a0761c5a7f72565351bc16ec31d6f675602TDYa
1101e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  bool isValid() const {
1111e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    // FIXME: Should check the correctness of the section header.
1121e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return true;
1131e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
1141e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1151e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  template <typename Archiver>
1162956c0e06b1c51f521645a076802686976c4b2f6TDYa  static ConcreteELFSectionSymTabEntry *
1171e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  read(Archiver &AR, ELFObject<Bitwidth> const *owner, size_t index = 0);
1181e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1191e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  void print(bool shouldPrintHeader = false) const;
1201e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1211e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaprivate:
1221e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  ConcreteELFSectionSymTabEntry *concrete() {
1231e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return static_cast<ConcreteELFSectionSymTabEntry *>(this);
1241e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
1251e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1261e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  ConcreteELFSectionSymTabEntry const *concrete() const {
1271e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return static_cast<ConcreteELFSectionSymTabEntry const *>(this);
1281e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
1291e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa};
1301e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1311e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa//==================Inline Member Function Definition==========================
1321e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1331e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#include "ELFSectionHeaderTable.h"
1341e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#include "ELFSection.h"
1351e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#include "ELFSectionStrTab.h"
1361e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
137d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa#include "ELFObject.h"
138d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa#include "ELFSectionHeaderTable.h"
139d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa#include "ELFSectionProgBits.h"
140d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa#include "ELFSectionNoBits.h"
141d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
1421e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYatemplate <size_t Bitwidth>
1431e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYainline char const *ELFSectionSymTabEntry_CRTP<Bitwidth>::getName() const {
1441e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  ELFSectionHeaderTable<Bitwidth> const &shtab =
1451e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    *owner->getSectionHeaderTable();
1465b5dd5a0d5e07a6048abc6866a3ffdc0d0d4bc34TDYa  size_t const index = shtab.getByName(std::string(".strtab"))->getIndex();
1471e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  ELFSection<Bitwidth> const *section = owner->getSectionByIndex(index);
1481e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  ELFSectionStrTab<Bitwidth> const &strtab =
1491e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    *static_cast<ELFSectionStrTab<Bitwidth> const *>(section);
1501e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  return strtab[getNameIndex()];
1511e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa}
1521e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1531e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYatemplate <size_t Bitwidth>
1541e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYatemplate <typename Archiver>
1552956c0e06b1c51f521645a076802686976c4b2f6TDYainline ELFSectionSymTabEntry<Bitwidth> *
1561e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaELFSectionSymTabEntry_CRTP<Bitwidth>::read(Archiver &AR,
1571e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa                                           ELFObject<Bitwidth> const *owner,
1581e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa                                           size_t index) {
1591e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  if (!AR) {
1601e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    // Archiver is in bad state before calling read function.
1611e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    // Return NULL and do nothing.
1622956c0e06b1c51f521645a076802686976c4b2f6TDYa    return 0;
1631e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
1641e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1652956c0e06b1c51f521645a076802686976c4b2f6TDYa  llvm::OwningPtr<ConcreteELFSectionSymTabEntry> sh(
1661e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    new ConcreteELFSectionSymTabEntry());
1671e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1681e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  if (!sh->serialize(AR)) {
1691e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    // Unable to read the structure.  Return NULL.
1702956c0e06b1c51f521645a076802686976c4b2f6TDYa    return 0;
1711e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
1721e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1731e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  if (!sh->isValid()) {
1741e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    // SymTabEntry read from archiver is not valid.  Return NULL.
1752956c0e06b1c51f521645a076802686976c4b2f6TDYa    return 0;
1761e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
1771e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1781e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  // Set the section header index
1791e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  sh->index = index;
1801e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1811e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  // Set the owner elf object
1821e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  sh->owner = owner;
1831e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1842956c0e06b1c51f521645a076802686976c4b2f6TDYa  return sh.take();
1851e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa}
1861e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
1871e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYatemplate <size_t Bitwidth>
1881e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYainline void ELFSectionSymTabEntry_CRTP<Bitwidth>::
1891e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  print(bool shouldPrintHeader) const {
1905d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa  using namespace llvm;
1914a70163096c79402c2742d63c86c188fa35ff189TDYa
1921e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  if (shouldPrintHeader) {
1935d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa    out() << '\n' << fillformat('=', 79) << '\n';
1945d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa    out().changeColor(raw_ostream::WHITE, true);
1955d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa    out() << "ELF Symbol Table Entry "
1965d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa          << this->getIndex() << '\n';
1975d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa    out().resetColor();
1985d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa    out() << fillformat('-', 79) << '\n';
1991e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  } else {
2005d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa    out() << fillformat('-', 79) << '\n';
2015d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa    out().changeColor(raw_ostream::YELLOW, true);
2025d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa    out() << "ELF Symbol Table Entry "
2035d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa          << this->getIndex() << " : " << '\n';
2045d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa    out().resetColor();
2051e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
2061e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
2071e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#define PRINT_LINT(title, value) \
2085d6763916b66a6e6bb9d4fe73311d0c9d1ca4821TDYa  out() << format("  %-11s : ", (char const *)(title)) << (value) << '\n'
2091e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  PRINT_LINT("Name",        getName()                                    );
2101e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  PRINT_LINT("Type",        getTypeStr(getType())                        );
2111e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  PRINT_LINT("Bind",        getBindingAttributeStr(getBindingAttribute()));
2121e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  PRINT_LINT("Visibility",  getVisibilityStr(getVisibility())            );
2131e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  PRINT_LINT("Shtab Index", getSectionIndex()                            );
2141e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  PRINT_LINT("Value",       getValue()                                   );
2151e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  PRINT_LINT("Size",        getSize()                                    );
2161e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#undef PRINT_LINT
2171e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
2181e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa// TODO: Horizontal type or vertical type can use option to decide.
2191e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#if 0
2201e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  using namespace term::color;
2211e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  using namespace std;
2221e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
2231e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  cout << setw(20) << getName() <<
2241e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa          setw(10) << getTypeStr(getType()) <<
2251e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa          setw(10) << getBindingAttributeStr(getBindingAttribute()) <<
2261e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa          setw(15) << getVisibilityStr(getVisibility()) <<
2271e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa          setw(10) << getSectionIndex() <<
2281e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa          setw(7) << getValue() <<
2291e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa          setw(7) << getSize() <<
2301e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa          endl;
2311e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#endif
2321e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa}
2331e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
234d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYatemplate <size_t Bitwidth>
235d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYavoid *ELFSectionSymTabEntry_CRTP<Bitwidth>::getAddress() const {
236d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  if (my_addr != 0) {
237d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    return my_addr;
238d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  }
239d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  size_t idx = (size_t)getSectionIndex();
240d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  switch (getType()) {
241d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    default:
242d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      break;
243d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
244d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    case STT_OBJECT:
245d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      switch (idx) {
246d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        default:
247d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          {
248d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            ELFSectionHeaderTable<Bitwidth> const *header =
249d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa              owner->getSectionHeaderTable();
250d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            assert(((*header)[idx]->getType() == SHT_PROGBITS ||
251d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa                    (*header)[idx]->getType() == SHT_NOBITS) &&
252d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa                   "STT_OBJECT with not BITS section.");
253d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            ELFSection<Bitwidth> const *sec = owner->getSectionByIndex(idx);
254d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            assert(sec != 0 && "STT_OBJECT with null section.");
255d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
256d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            ELFSectionBits<Bitwidth> const &st =
257d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa              static_cast<ELFSectionBits<Bitwidth> const &>(*sec);
258d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            my_addr = const_cast<unsigned char *>(&st[0] + (off_t)getValue());
259d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          }
260d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          break;
261d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
262d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_COMMON:
263d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          {
264d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            int r = posix_memalign(&my_addr,
265937df4784a064c4f32b3354f76ef9c4361711173TDYa                                   std::max((size_t)getValue(),
266937df4784a064c4f32b3354f76ef9c4361711173TDYa                                            sizeof(void *)),
267d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa                                   (size_t)getSize());
268d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            assert(r==0 && "posix_memalign failed.");
269d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          }
270d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          break;
271d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
272d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_ABS:
273d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_UNDEF:
274d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_XINDEX:
275d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          assert(0 && "STT_OBJECT with special st_shndx.");
276d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          break;
277d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      }
278d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      break;
279d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
280d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
281d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    case STT_FUNC:
282d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      switch (idx) {
283d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        default:
284d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          {
285d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            ELFSectionHeaderTable<Bitwidth> const *header =
286d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa              owner->getSectionHeaderTable();
287d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            assert((*header)[idx]->getType() == SHT_PROGBITS &&
288d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa                   "STT_FUNC with not PROGBITS section.");
289d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            ELFSection<Bitwidth> const *sec = owner->getSectionByIndex(idx);
290d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            assert(sec != 0 && "STT_FUNC with null section.");
291d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
292d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            ELFSectionProgBits<Bitwidth> const &st =
293d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa              static_cast<ELFSectionProgBits<Bitwidth> const &>(*sec);
294d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            my_addr = const_cast<unsigned char *>(&st[0] + (off_t)getValue());
295d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          }
296d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          break;
297d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
298d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_ABS:
299d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_COMMON:
300d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_UNDEF:
301d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_XINDEX:
302d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          assert(0 && "STT_FUNC with special st_shndx.");
303d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          break;
304d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      }
305d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      break;
306d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
307d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
308d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    case STT_SECTION:
309d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      switch (idx) {
310d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        default:
311d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          {
312d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            ELFSectionHeaderTable<Bitwidth> const *header =
313d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa              owner->getSectionHeaderTable();
314d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            assert(((*header)[idx]->getType() == SHT_PROGBITS ||
315d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa                    (*header)[idx]->getType() == SHT_NOBITS) &&
316d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa                   "STT_SECTION with not BITS section.");
317d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            ELFSection<Bitwidth> const *sec = owner->getSectionByIndex(idx);
318d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            assert(sec != 0 && "STT_SECTION with null section.");
319d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
320d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            ELFSectionBits<Bitwidth> const &st =
321d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa              static_cast<ELFSectionBits<Bitwidth> const &>(*sec);
322d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa            my_addr = const_cast<unsigned char *>(&st[0] + (off_t)getValue());
323d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          }
324d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          break;
325d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
326d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_ABS:
327d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_COMMON:
328d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_UNDEF:
329d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa        case SHN_XINDEX:
330d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          assert(0 && "STT_SECTION with special st_shndx.");
331d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa          break;
332d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      }
333d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      break;
334d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa
335d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    case STT_NOTYPE:
3365c543a0761c5a7f72565351bc16ec31d6f675602TDYa      return 0;
3375c543a0761c5a7f72565351bc16ec31d6f675602TDYa
3385c543a0761c5a7f72565351bc16ec31d6f675602TDYa    case STT_COMMON:
339d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    case STT_FILE:
340d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    case STT_TLS:
341d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    case STT_LOOS:
342d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    case STT_HIOS:
343d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    case STT_LOPROC:
344d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa    case STT_HIPROC:
345d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      assert(0 && "Not implement.");
346d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa      return 0;
347d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  }
348d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa  return my_addr;
349d91d1813cc1b99b171f16dc0f7ec4c58b7fc9cfeTDYa}
3501e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3511e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3521e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3531e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3541e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYatemplate <>
3551e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaclass ELFSectionSymTabEntry<32> : public ELFSectionSymTabEntry_CRTP<32> {
3561e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  friend class ELFSectionSymTabEntry_CRTP<32>;
3571e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3581e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaprivate:
3591e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  ELFSectionSymTabEntry() {
3601e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
3611e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3621e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  template <typename Archiver>
3631e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  bool serialize(Archiver &AR) {
3641e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR.prologue(TypeTraits<ELFSectionSymTabEntry>::size);
3651e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3661e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_name;
3671e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_value;
3681e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_size;
3691e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_info;
3701e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_other;
3711e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_shndx;
3721e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3731e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR.epilogue(TypeTraits<ELFSectionSymTabEntry>::size);
3741e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return AR;
3751e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
3761e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3771e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYapublic:
3781e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa};
3791e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3801e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYatemplate <>
3811e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaclass ELFSectionSymTabEntry<64> : public ELFSectionSymTabEntry_CRTP<64> {
3821e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  friend class ELFSectionSymTabEntry_CRTP<64>;
3831e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3841e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaprivate:
3851e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  ELFSectionSymTabEntry() {
3861e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
3871e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3881e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  template <typename Archiver>
3891e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  bool serialize(Archiver &AR) {
3901e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR.prologue(TypeTraits<ELFSectionSymTabEntry>::size);
3911e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3921e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_name;
3931e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_info;
3941e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_other;
3951e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_shndx;
3961e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_value;
3971e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR & st_size;
3981e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
3991e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    AR.epilogue(TypeTraits<ELFSectionSymTabEntry>::size);
4001e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa    return AR;
4011e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  }
4021e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
4031e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYapublic:
4041e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa};
4051e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
4061e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
4071e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#endif // ELF_SECTION_SYMTAB_ENTRY_H
408