ELFSymbol.hxx revision f3f63d6ded54ea520f5066979b53c2356092692d
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ELF_SYMBOL_HXX 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ELF_SYMBOL_HXX 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ELFSectionHeaderTable.h" 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ELFSection.h" 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ELFSectionStrTab.h" 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ELFObject.h" 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ELFSectionHeaderTable.h" 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ELFSectionProgBits.h" 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ELFSectionNoBits.h" 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/rsl_assert.h" 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate <unsigned Bitwidth> 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline char const *ELFSymbol_CRTP<Bitwidth>::getName() const { 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFSectionHeaderTableTy const &shtab = *owner->getSectionHeaderTable(); 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t const index = shtab.getByName(std::string(".strtab"))->getIndex(); 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFSectionTy const *section = owner->getSectionByIndex(index); 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFSectionStrTabTy const &strtab = 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *static_cast<ELFSectionStrTabTy const *>(section); 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return strtab[getNameIndex()]; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate <unsigned Bitwidth> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate <typename Archiver> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline ELFSymbol<Bitwidth> * 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectELFSymbol_CRTP<Bitwidth>::read(Archiver &AR, 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFObjectTy const *owner, 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t index) { 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!AR) { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Archiver is in bad state before calling read function. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Return NULL and do nothing. 34e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood return 0; 35b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood } 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project llvm::OwningPtr<ELFSymbolTy> sh(new ELFSymbolTy()); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!sh->serialize(AR)) { 40e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood // Unable to read the structure. Return NULL. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!sh->isValid()) { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // SymTabEntry read from archiver is not valid. Return NULL. 46e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood return 0; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 49b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood // Set the section header index 50b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood sh->index = index; 51b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 52b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood // Set the owner elf object 53b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood sh->owner = owner; 54b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 55b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood return sh.take(); 56b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood} 57b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate <unsigned Bitwidth> 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline void ELFSymbol_CRTP<Bitwidth>::print(bool shouldPrintHeader) const { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project using namespace llvm; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (shouldPrintHeader) { 63e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood out() << '\n' << fillformat('=', 79) << '\n'; 64b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood out().changeColor(raw_ostream::WHITE, true); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out() << "ELF Symbol Table Entry " 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project << this->getIndex() << '\n'; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out().resetColor(); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out() << fillformat('-', 79) << '\n'; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 70e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood out() << fillformat('-', 79) << '\n'; 7158bda987665af759c379cd494ff4873ac61acf29Mike Lockwood out().changeColor(raw_ostream::YELLOW, true); 7258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood out() << "ELF Symbol Table Entry " 73b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood << this->getIndex() << " : " << '\n'; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out().resetColor(); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define PRINT_LINT(title, value) \ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out() << format(" %-11s : ", (char const *)(title)) << (value) << '\n' 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PRINT_LINT("Name", getName() ); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PRINT_LINT("Type", getTypeStr(getType()) ); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PRINT_LINT("Bind", getBindingAttributeStr(getBindingAttribute())); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PRINT_LINT("Visibility", getVisibilityStr(getVisibility()) ); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PRINT_LINT("Shtab Index", getSectionIndex() ); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PRINT_LINT("Value", getValue() ); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PRINT_LINT("Size", getSize() ); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#undef PRINT_LINT 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// TODO: Horizontal type or vertical type can use option to decide. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project using namespace term::color; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project using namespace std; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cout << setw(20) << getName() << 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setw(10) << getTypeStr(getType()) << 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setw(10) << getBindingAttributeStr(getBindingAttribute()) << 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setw(15) << getVisibilityStr(getVisibility()) << 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setw(10) << getSectionIndex() << 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setw(7) << getValue() << 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setw(7) << getSize() << 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project endl; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate <unsigned Bitwidth> 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid *ELFSymbol_CRTP<Bitwidth>::getAddress(bool autoAlloc) const { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (my_addr != 0) { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return my_addr; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t idx = (size_t)getSectionIndex(); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (getType()) { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 112b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood break; 113b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 114b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood case STT_OBJECT: 115b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood switch (idx) { 116b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood default: 117b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood { 118b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood#ifndef NDEBUG 119b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood ELFSectionHeaderTableTy const *header = 120b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood owner->getSectionHeaderTable(); 121b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood rsl_assert(((*header)[idx]->getType() == SHT_PROGBITS || 122b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood (*header)[idx]->getType() == SHT_NOBITS) && 123b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood "STT_OBJECT with not BITS section."); 124b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood#endif 125b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood ELFSectionTy const *sec = owner->getSectionByIndex(idx); 126b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood rsl_assert(sec != 0 && "STT_OBJECT with null section."); 127b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 128b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood ELFSectionBitsTy const &st = 129b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood static_cast<ELFSectionBitsTy const &>(*sec); 130b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood my_addr = const_cast<unsigned char *>(&st[0] + (off_t)getValue()); 131b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood } 132b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood break; 133b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 134b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood case SHN_COMMON: 135b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood { 136e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood if (!autoAlloc) { 13758bda987665af759c379cd494ff4873ac61acf29Mike Lockwood return NULL; 13858bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 13958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood#if 0 140e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood#if _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 141e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood if (posix_memalign(&my_addr, 14258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood std::max((size_t)getValue(), sizeof(void*)), 14358bda987665af759c379cd494ff4873ac61acf29Mike Lockwood (size_t)getSize()) != 0) { 14458bda987665af759c379cd494ff4873ac61acf29Mike Lockwood rsl_assert(0 && "posix_memalign failed."); 14558bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 14658bda987665af759c379cd494ff4873ac61acf29Mike Lockwood#else 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project my_addr = memalign(std::max((size_t)getValue(), sizeof(void *)), 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (size_t)getSize()); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(my_addr != NULL && "memalign failed."); 151b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood#endif 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (my_addr) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(my_addr, '\0', getSize()); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t align = std::max((size_t)getValue(), sizeof(void*)); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project my_addr = const_cast<ELFObjectTy *>(owner)-> 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allocateSHNCommonData((size_t)getSize(), align); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!my_addr) { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(0 && "Unable to allocate memory for SHN_COMMON."); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project abort(); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 167e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood case SHN_ABS: 168e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood case SHN_UNDEF: 16958bda987665af759c379cd494ff4873ac61acf29Mike Lockwood case SHN_XINDEX: 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(0 && "STT_OBJECT with special st_shndx."); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 175e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood 176b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood case STT_FUNC: 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (idx) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef NDEBUG 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFSectionHeaderTableTy const *header = 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->getSectionHeaderTable(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert((*header)[idx]->getType() == SHT_PROGBITS && 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "STT_FUNC with not PROGBITS section."); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFSectionTy const *sec = owner->getSectionByIndex(idx); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(sec != 0 && "STT_FUNC with null section."); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFSectionProgBitsTy const &st = 19058bda987665af759c379cd494ff4873ac61acf29Mike Lockwood static_cast<ELFSectionProgBitsTy const &>(*sec); 19158bda987665af759c379cd494ff4873ac61acf29Mike Lockwood my_addr = const_cast<unsigned char *>(&st[0] + (off_t)getValue()); 19258bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 193e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood break; 194e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood 195e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood case SHN_ABS: 196e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood case SHN_COMMON: 197c21a08f747f6fd1d7b8c98176ff70abc57cf58a0Mike Lockwood case SHN_UNDEF: 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHN_XINDEX: 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(0 && "STT_FUNC with special st_shndx."); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STT_SECTION: 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (idx) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef NDEBUG 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFSectionHeaderTableTy const *header = 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->getSectionHeaderTable(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(((*header)[idx]->getType() == SHT_PROGBITS || 213105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project (*header)[idx]->getType() == SHT_NOBITS) && 214105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project "STT_SECTION with not BITS section."); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 216105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project ELFSectionTy const *sec = owner->getSectionByIndex(idx); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(sec != 0 && "STT_SECTION with null section."); 2189a940e8b3d61539392c1a9f925be13cca8b5103dDavid 'Digit' Turner 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFSectionBitsTy const &st = 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static_cast<ELFSectionBitsTy const &>(*sec); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project my_addr = const_cast<unsigned char *>(&st[0] + (off_t)getValue()); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHN_ABS: 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHN_COMMON: 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHN_UNDEF: 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHN_XINDEX: 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(0 && "STT_SECTION with special st_shndx."); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STT_NOTYPE: 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (idx) { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef NDEBUG 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFSectionHeaderTableTy const *header = 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner->getSectionHeaderTable(); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(((*header)[idx]->getType() == SHT_PROGBITS || 242b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood (*header)[idx]->getType() == SHT_NOBITS) && 243b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood "STT_SECTION with not BITS section."); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ELFSectionTy const *sec = owner->getSectionByIndex(idx); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(sec != 0 && "STT_SECTION with null section."); 247b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 248b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood ELFSectionBitsTy const &st = 249b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood static_cast<ELFSectionBitsTy const &>(*sec); 250b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood my_addr = const_cast<unsigned char *>(&st[0] + (off_t)getValue()); 251b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood } 252b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood break; 253b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 254b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood case SHN_ABS: 255b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood case SHN_COMMON: 256b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood case SHN_XINDEX: 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rsl_assert(0 && "STT_SECTION with special st_shndx."); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHN_UNDEF: 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STT_COMMON: 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STT_FILE: 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STT_TLS: 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STT_LOOS: 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STT_HIOS: 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STT_LOPROC: 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STT_HIPROC: 272e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood rsl_assert(0 && "Not implement."); 273e3635c9693c4cd9650684f14e19dcabcea0d488aMike Lockwood return 0; 27458bda987665af759c379cd494ff4873ac61acf29Mike Lockwood } 275b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood return my_addr; 276b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood} 277b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood 278b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood#endif // ELF_SYMBOL_HXX 279b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood