10f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang/*
20f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * Copyright 2012, The Android Open Source Project
30f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang *
40f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
50f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * you may not use this file except in compliance with the License.
60f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * You may obtain a copy of the License at
70f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang *
80f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
90f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang *
100f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * Unless required by applicable law or agreed to in writing, software
110f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
120f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * See the License for the specific language governing permissions and
140f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang * limitations under the License.
150f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang */
160f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
170f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#include "ELFObjectLoaderImpl.h"
180f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
190f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#include <llvm/Support/ELF.h>
200f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
210f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang// The following files are included from librsloader.
220f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#include "ELFObject.h"
230f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#include "ELFSectionSymTab.h"
240f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#include "ELFSymbol.h"
250f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang#include "utils/serialize.h"
260f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
27c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/ExecutionEngine/SymbolResolverInterface.h"
28ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h"
290f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
300f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changusing namespace bcc;
310f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
320f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changbool ELFObjectLoaderImpl::load(const void *pMem, size_t pMemSize) {
330f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  ArchiveReaderLE reader(reinterpret_cast<const unsigned char *>(pMem),
340f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang                         pMemSize);
350f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
36e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
37e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang  mObject = ELFObject<64>::read(reader);
38e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
390f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  mObject = ELFObject<32>::read(reader);
40e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
410f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  if (mObject == NULL) {
420f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    ALOGE("Unable to load the ELF object!");
430f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    return false;
440f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  }
450f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
460f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // Retrive the pointer to the symbol table.
47e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
48e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang  mSymTab = static_cast<ELFSectionSymTab<64> *>(
49c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray                 mObject->getSectionByName(".symtab"));
50e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
51e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang  mSymTab = static_cast<ELFSectionSymTab<32> *>(
52e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang                 mObject->getSectionByName(".symtab"));
53e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
540f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  if (mSymTab == NULL) {
550f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    ALOGW("Object doesn't contain any symbol table.");
560f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  }
570f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
580f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  return true;
590f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang}
600f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
610f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changbool ELFObjectLoaderImpl::relocate(SymbolResolverInterface &pResolver) {
620f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  mObject->relocate(SymbolResolverInterface::LookupFunction, &pResolver);
630f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
640f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  if (mObject->getMissingSymbols()) {
650f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    ALOGE("Some symbols are found to be undefined during relocation!");
660f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    return false;
670f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  }
680f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
690f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  return true;
700f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang}
710f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
720f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changbool ELFObjectLoaderImpl::prepareDebugImage(void *pDebugImg,
730f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang                                            size_t pDebugImgSize) {
740f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // Update the value of sh_addr in pDebugImg to its corresponding section in
750f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  // the mObject.
76e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
77e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang  llvm::ELF::Elf64_Ehdr *elf_header =
78e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang      reinterpret_cast<llvm::ELF::Elf64_Ehdr *>(pDebugImg);
79e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
800f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  llvm::ELF::Elf32_Ehdr *elf_header =
81e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang       reinterpret_cast<llvm::ELF::Elf32_Ehdr *>(pDebugImg);
82e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
830f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
840f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  if (elf_header->e_shoff > pDebugImgSize) {
85e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
86e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang    ALOGE("Invalid section header table offset found! (e_shoff = %ld)",
87e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang	  elf_header->e_shoff);
88e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
890f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    ALOGE("Invalid section header table offset found! (e_shoff = %d)",
900f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang          elf_header->e_shoff);
91e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
920f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    return false;
930f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  }
940f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
950f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  if ((elf_header->e_shoff +
960f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang       sizeof(llvm::ELF::Elf32_Shdr) * elf_header->e_shnum) > pDebugImgSize) {
97e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
98e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang    ALOGE("Invalid image supplied (debug image doesn't contain all the section"
99e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang	  "header or corrupted image)! (e_shoff = %ld, e_shnum = %d)",
100e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang	  elf_header->e_shoff, elf_header->e_shnum);
101e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
1020f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    ALOGE("Invalid image supplied (debug image doesn't contain all the section"
1030f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang          "header or corrupted image)! (e_shoff = %d, e_shnum = %d)",
1040f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang          elf_header->e_shoff, elf_header->e_shnum);
105e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
1060f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    return false;
1070f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  }
1080f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
109e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
110e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang  llvm::ELF::Elf64_Shdr *section_header_table =
111e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang      reinterpret_cast<llvm::ELF::Elf64_Shdr *>(
112e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang          reinterpret_cast<uint8_t*>(pDebugImg) + elf_header->e_shoff);
113e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
1140f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  llvm::ELF::Elf32_Shdr *section_header_table =
1150f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang      reinterpret_cast<llvm::ELF::Elf32_Shdr *>(
1160f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang          reinterpret_cast<uint8_t*>(pDebugImg) + elf_header->e_shoff);
117e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
1180f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
1190f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  for (unsigned i = 0; i < elf_header->e_shnum; i++) {
1200f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    if (section_header_table[i].sh_flags & llvm::ELF::SHF_ALLOC) {
121e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
122e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang      ELFSectionBits<64> *section =
123e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang          static_cast<ELFSectionBits<64> *>(mObject->getSectionByIndex(i));
124e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
1250f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang      ELFSectionBits<32> *section =
1260f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang          static_cast<ELFSectionBits<32> *>(mObject->getSectionByIndex(i));
127e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
1280f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang      if (section != NULL) {
129be07e239b10f91169f795cbe602552792d4d0415Ian Rogers        uintptr_t address = reinterpret_cast<uintptr_t>(section->getBuffer());
130e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
131e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang        LOG_FATAL_IF(address > 0xFFFFFFFFFFFFFFFFu, "Out of bound address for Elf64_Addr");
132e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang        section_header_table[i].sh_addr = static_cast<llvm::ELF::Elf64_Addr>(address);
133e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
134be07e239b10f91169f795cbe602552792d4d0415Ian Rogers        LOG_FATAL_IF(address > 0xFFFFFFFFu, "Out of bound address for Elf32_Addr");
135be07e239b10f91169f795cbe602552792d4d0415Ian Rogers        section_header_table[i].sh_addr = static_cast<llvm::ELF::Elf32_Addr>(address);
136e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
1370f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang      }
1380f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    }
1390f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  }
1400f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
1410f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  return true;
1420f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang}
1430f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
1440f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Changvoid *ELFObjectLoaderImpl::getSymbolAddress(const char *pName) const {
1450f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  if (mSymTab == NULL) {
1460f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    return NULL;
1470f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  }
1480f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
149e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
150e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang  const ELFSymbol<64> *symbol = mSymTab->getByName(pName);
151e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
1529795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  const ELFSymbol<32> *symbol = mSymTab->getByName(pName);
153e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
1540f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  if (symbol == NULL) {
1550f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    ALOGV("Request symbol '%s' is not found in the object!", pName);
1560f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang    return NULL;
1570f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  }
1580f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
1590f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  return symbol->getAddress(mObject->getHeader()->getMachine(),
1600f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang                            /* autoAlloc */false);
1610f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang}
1620f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang
1639795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liaosize_t ELFObjectLoaderImpl::getSymbolSize(const char *pName) const {
1649795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  if (mSymTab == NULL) {
1659795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    return 0;
1669795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  }
1679795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
168e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
169e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang  const ELFSymbol<64> *symbol = mSymTab->getByName(pName);
170e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
1719795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  const ELFSymbol<32> *symbol = mSymTab->getByName(pName);
172e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
1739795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
1749795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  if (symbol == NULL) {
1759795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    ALOGV("Request symbol '%s' is not found in the object!", pName);
1769795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    return 0;
1779795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  }
1789795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
1799795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  return static_cast<size_t>(symbol->getSize());
1809795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
1819795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao}
1829795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
1839795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liaobool
1849795754a34648d962f00ced51183b759b9eaf2b2Shih-wei LiaoELFObjectLoaderImpl::getSymbolNameList(android::Vector<const char *>& pNameList,
1859795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao                                       ObjectLoader::SymbolType pType) const {
1869795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  if (mSymTab == NULL) {
1879795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    return false;
1889795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  }
1899795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
1909795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  unsigned elf_type;
1919795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  switch (pType) {
1929795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    case ObjectLoader::kFunctionType: {
1939795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao      elf_type = llvm::ELF::STT_FUNC;
1949795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao      break;
1959795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    }
1969795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    case ObjectLoader::kUnknownType: {
1979795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao      break;
1989795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    }
1999795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    default: {
2009795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao      assert(false && "Invalid symbol type given!");
2019795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao      return false;
2029795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    }
2039795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  }
2049795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
2059795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  for (size_t i = 0, e = mSymTab->size(); i != e; i++) {
206e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#ifdef __LP64__
207e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang    ELFSymbol<64> *symbol = (*mSymTab)[i];
208e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#else
2099795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    ELFSymbol<32> *symbol = (*mSymTab)[i];
210e524a6fede773ad8ea7d4a3ca11976585002387aWeiTang#endif
2119795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    if (symbol == NULL) {
2129795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao      continue;
2139795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    }
2149795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
2159795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    if ((pType == ObjectLoader::kUnknownType) ||
2169795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao        (symbol->getType() == elf_type)) {
2179795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao      const char *symbol_name = symbol->getName();
2189795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao      if (symbol_name != NULL) {
2199795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao        pNameList.push_back(symbol_name);
2209795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao      }
2219795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao    }
2229795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  }
2239795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
2249795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao  return true;
2259795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao}
2269795754a34648d962f00ced51183b759b9eaf2b2Shih-wei Liao
2270f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr ChangELFObjectLoaderImpl::~ELFObjectLoaderImpl() {
2280f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  delete mObject;
2290f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang  return;
2300f9cad99f9e3c4db42e9836cc0e316c3a84448f5Zonr Chang}
231