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