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