1ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao/* 2ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Copyright 2011, The Android Open Source Project 3ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * 4ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 5ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * you may not use this file except in compliance with the License. 6ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * You may obtain a copy of the License at 7ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * 8ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 9ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * 10ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Unless required by applicable law or agreed to in writing, software 11ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 12ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * See the License for the specific language governing permissions and 14ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * limitations under the License. 15ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao */ 16ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao 1780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#ifndef ELF_SECTION_SYM_TAB_HXX 1880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#define ELF_SECTION_SYM_TAB_HXX 1980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 2080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#include "ELFSectionHeader.h" 2180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#include "ELFSymbol.h" 22c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa#include "utils/rsl_assert.h" 2380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 2480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth> 2580085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::~ELFSectionSymTab() { 2680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < table.size(); ++i) { 2780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien delete table[i]; 2880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 2980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 3080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 3180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth> 32388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chiensize_t ELFSectionSymTab<Bitwidth>::getFuncCount() const { 33388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien size_t result = 0; 34388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien for (size_t i = 0; i < table.size(); ++i) { 35388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien if (table[i] && table[i]->isConcreteFunc()) { 36388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien result++; 37388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien } 38388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien } 39388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien return result; 40388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien} 41388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien 42388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chientemplate <unsigned Bitwidth> 43783eac3300b33db8d654dffc4effae8be458e5b5Logan Chieninline size_t ELFSectionSymTab<Bitwidth>::getExternFuncCount() const { 44783eac3300b33db8d654dffc4effae8be458e5b5Logan Chien size_t result = 0; 45783eac3300b33db8d654dffc4effae8be458e5b5Logan Chien for (size_t i = 0; i < table.size(); ++i) { 46783eac3300b33db8d654dffc4effae8be458e5b5Logan Chien if (table[i] && table[i]->isExternFunc()) { 47783eac3300b33db8d654dffc4effae8be458e5b5Logan Chien result++; 48783eac3300b33db8d654dffc4effae8be458e5b5Logan Chien } 49783eac3300b33db8d654dffc4effae8be458e5b5Logan Chien } 50783eac3300b33db8d654dffc4effae8be458e5b5Logan Chien return result; 51783eac3300b33db8d654dffc4effae8be458e5b5Logan Chien} 52783eac3300b33db8d654dffc4effae8be458e5b5Logan Chien 53783eac3300b33db8d654dffc4effae8be458e5b5Logan Chientemplate <unsigned Bitwidth> 54167b7f684354d1702aac0b3efd76c790cda3e837TDYainline void ELFSectionSymTab<Bitwidth>::buildNameMap() { 5532f7d036daa15302abd64e94fcb2dc718b375020TDYa for (size_t i = 0; i < table.size(); ++i) { 5632f7d036daa15302abd64e94fcb2dc718b375020TDYa ELFSymbolTy *symbol = table[i]; 5732f7d036daa15302abd64e94fcb2dc718b375020TDYa if ( symbol ) { 5832f7d036daa15302abd64e94fcb2dc718b375020TDYa name_map[symbol->getName()] = symbol; 5932f7d036daa15302abd64e94fcb2dc718b375020TDYa } 6032f7d036daa15302abd64e94fcb2dc718b375020TDYa } 6132f7d036daa15302abd64e94fcb2dc718b375020TDYa} 6232f7d036daa15302abd64e94fcb2dc718b375020TDYa 6332f7d036daa15302abd64e94fcb2dc718b375020TDYatemplate <unsigned Bitwidth> 64167b7f684354d1702aac0b3efd76c790cda3e837TDYainline ELFSymbol<Bitwidth> const * 6532f7d036daa15302abd64e94fcb2dc718b375020TDYaELFSectionSymTab<Bitwidth>::getByName(std::string const &name) const { 6632f7d036daa15302abd64e94fcb2dc718b375020TDYa typename llvm::StringMap<ELFSymbolTy *>::const_iterator symbol = 6732f7d036daa15302abd64e94fcb2dc718b375020TDYa name_map.find(name); 6832f7d036daa15302abd64e94fcb2dc718b375020TDYa if (symbol == name_map.end()) { 6932f7d036daa15302abd64e94fcb2dc718b375020TDYa return NULL; 7032f7d036daa15302abd64e94fcb2dc718b375020TDYa } 7132f7d036daa15302abd64e94fcb2dc718b375020TDYa return symbol->getValue(); 7232f7d036daa15302abd64e94fcb2dc718b375020TDYa} 7332f7d036daa15302abd64e94fcb2dc718b375020TDYa 7432f7d036daa15302abd64e94fcb2dc718b375020TDYatemplate <unsigned Bitwidth> 759d7e2ca48de8bfc839f6c0f61cf0d70c36546124Logan Chieninline void 769d7e2ca48de8bfc839f6c0f61cf0d70c36546124Logan ChienELFSectionSymTab<Bitwidth>::getFuncNameList(size_t size, 779d7e2ca48de8bfc839f6c0f61cf0d70c36546124Logan Chien char const **list) const { 78388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien for (size_t i = 0, j = 0; i < table.size() && j < size; ++i) { 79388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien if (table[i] && table[i]->isConcreteFunc()) { 80388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien list[j++] = table[i]->getName(); 81388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien } 82388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien } 83388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien} 84388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien 85388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chientemplate <unsigned Bitwidth> 8680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <typename Archiver> 8780085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth> * 8880085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::read(Archiver &AR, 8958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFObjectTy *owner, 9058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFSectionHeaderTy const *sh) { 9180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 9258611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien llvm::OwningPtr<ELFSectionSymTabTy> st(new ELFSectionSymTabTy()); 9380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 9480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Assert that entry size will be the same as standard. 95c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa rsl_assert(sh->getEntrySize() == TypeTraits<ELFSymbolTy>::size); 9680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 9780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Seek to the start of symbol table 9880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien AR.seek(sh->getOffset(), true); 9980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 10080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Read all symbol table entry 10180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien size_t size = sh->getSize() / sh->getEntrySize(); 10280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < size; ++i) { 10358611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien st->table.push_back(ELFSymbolTy::read(AR, owner, i)); 10480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 10580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 10680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien if (!AR) { 10780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Unable to read the table. 10880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien return 0; 10980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 11080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 11180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien return st.take(); 11280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 11380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 11480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth> 11580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chienvoid ELFSectionSymTab<Bitwidth>::print() const { 11680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien using namespace llvm; 11780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 11880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << '\n' << fillformat('=', 79) << '\n'; 11980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out().changeColor(raw_ostream::WHITE, true); 12080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << "Symbol Table" << '\n'; 12180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out().resetColor(); 12280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 12380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < table.size(); ++i) { 12480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien table[i]->print(); 12580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 12680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 12780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << fillformat('=', 79) << '\n'; 12880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 12980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 13080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#endif // ELF_SECTION_SYM_TAB_HXX 131