ELFSectionSymTab.hxx revision 167b7f684354d1702aac0b3efd76c790cda3e837
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> 43167b7f684354d1702aac0b3efd76c790cda3e837TDYainline void ELFSectionSymTab<Bitwidth>::buildNameMap() { 4432f7d036daa15302abd64e94fcb2dc718b375020TDYa for (size_t i = 0; i < table.size(); ++i) { 4532f7d036daa15302abd64e94fcb2dc718b375020TDYa ELFSymbolTy *symbol = table[i]; 4632f7d036daa15302abd64e94fcb2dc718b375020TDYa if ( symbol ) { 4732f7d036daa15302abd64e94fcb2dc718b375020TDYa name_map[symbol->getName()] = symbol; 4832f7d036daa15302abd64e94fcb2dc718b375020TDYa } 4932f7d036daa15302abd64e94fcb2dc718b375020TDYa } 5032f7d036daa15302abd64e94fcb2dc718b375020TDYa} 5132f7d036daa15302abd64e94fcb2dc718b375020TDYa 5232f7d036daa15302abd64e94fcb2dc718b375020TDYatemplate <unsigned Bitwidth> 53167b7f684354d1702aac0b3efd76c790cda3e837TDYainline ELFSymbol<Bitwidth> const * 5432f7d036daa15302abd64e94fcb2dc718b375020TDYaELFSectionSymTab<Bitwidth>::getByName(std::string const &name) const { 5532f7d036daa15302abd64e94fcb2dc718b375020TDYa typename llvm::StringMap<ELFSymbolTy *>::const_iterator symbol = 5632f7d036daa15302abd64e94fcb2dc718b375020TDYa name_map.find(name); 5732f7d036daa15302abd64e94fcb2dc718b375020TDYa if (symbol == name_map.end()) { 5832f7d036daa15302abd64e94fcb2dc718b375020TDYa return NULL; 5932f7d036daa15302abd64e94fcb2dc718b375020TDYa } 6032f7d036daa15302abd64e94fcb2dc718b375020TDYa return symbol->getValue(); 6132f7d036daa15302abd64e94fcb2dc718b375020TDYa} 6232f7d036daa15302abd64e94fcb2dc718b375020TDYa 6332f7d036daa15302abd64e94fcb2dc718b375020TDYatemplate <unsigned Bitwidth> 64167b7f684354d1702aac0b3efd76c790cda3e837TDYainline size_t ELFSectionSymTab<Bitwidth>::getExternFuncCount() const { 65e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien size_t result = 0; 66e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien for (size_t i = 0; i < table.size(); ++i) { 67e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien if (table[i] && table[i]->isExternFunc()) { 68e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien result++; 69e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien } 70e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien } 71e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien return result; 72e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien} 73e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien 74e586f183e46f921301281352a87f67dbdc1a43b6Logan Chientemplate <unsigned Bitwidth> 75388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chienvoid ELFSectionSymTab<Bitwidth>::getFuncNameList(size_t size, 76388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien char const **list) const { 77388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien for (size_t i = 0, j = 0; i < table.size() && j < size; ++i) { 78388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien if (table[i] && table[i]->isConcreteFunc()) { 79388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien list[j++] = table[i]->getName(); 80388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien } 81388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien } 82388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien} 83388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien 84388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chientemplate <unsigned Bitwidth> 8580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <typename Archiver> 8680085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth> * 8780085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::read(Archiver &AR, 8858611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFObjectTy *owner, 8958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFSectionHeaderTy const *sh) { 9080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 9158611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien llvm::OwningPtr<ELFSectionSymTabTy> st(new ELFSectionSymTabTy()); 9280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 9380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Assert that entry size will be the same as standard. 94c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa rsl_assert(sh->getEntrySize() == TypeTraits<ELFSymbolTy>::size); 9580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 9680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Seek to the start of symbol table 9780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien AR.seek(sh->getOffset(), true); 9880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 9980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Read all symbol table entry 10080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien size_t size = sh->getSize() / sh->getEntrySize(); 10180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < size; ++i) { 10258611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien st->table.push_back(ELFSymbolTy::read(AR, owner, i)); 10380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 10480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 10580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien if (!AR) { 10680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Unable to read the table. 10780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien return 0; 10880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 10980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 11080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien return st.take(); 11180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 11280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 11380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth> 11480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chienvoid ELFSectionSymTab<Bitwidth>::print() const { 11580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien using namespace llvm; 11680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 11780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << '\n' << fillformat('=', 79) << '\n'; 11880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out().changeColor(raw_ostream::WHITE, true); 11980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << "Symbol Table" << '\n'; 12080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out().resetColor(); 12180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 12280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < table.size(); ++i) { 12380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien table[i]->print(); 12480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 12580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 12680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << fillformat('=', 79) << '\n'; 12780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 12880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 12980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#endif // ELF_SECTION_SYM_TAB_HXX 130