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