ELFSectionSymTab.hxx revision 388f443ba0c474ffcc2e06f8d2a668c4488c3c1b
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> 43e586f183e46f921301281352a87f67dbdc1a43b6Logan Chiensize_t ELFSectionSymTab<Bitwidth>::getExternFuncCount() const { 44e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien size_t result = 0; 45e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien for (size_t i = 0; i < table.size(); ++i) { 46e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien if (table[i] && table[i]->isExternFunc()) { 47e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien result++; 48e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien } 49e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien } 50e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien return result; 51e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien} 52e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien 53e586f183e46f921301281352a87f67dbdc1a43b6Logan Chientemplate <unsigned Bitwidth> 54388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chienvoid ELFSectionSymTab<Bitwidth>::getFuncNameList(size_t size, 55388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien char const **list) const { 56388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien for (size_t i = 0, j = 0; i < table.size() && j < size; ++i) { 57388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien if (table[i] && table[i]->isConcreteFunc()) { 58388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien list[j++] = table[i]->getName(); 59388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien } 60388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien } 61388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien} 62388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien 63388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chientemplate <unsigned Bitwidth> 6480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <typename Archiver> 6580085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth> * 6680085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::read(Archiver &AR, 6758611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFObjectTy *owner, 6858611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFSectionHeaderTy const *sh) { 6980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 7058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien llvm::OwningPtr<ELFSectionSymTabTy> st(new ELFSectionSymTabTy()); 7180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 7280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Assert that entry size will be the same as standard. 73c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa rsl_assert(sh->getEntrySize() == TypeTraits<ELFSymbolTy>::size); 7480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 7580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Seek to the start of symbol table 7680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien AR.seek(sh->getOffset(), true); 7780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 7880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Read all symbol table entry 7980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien size_t size = sh->getSize() / sh->getEntrySize(); 8080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < size; ++i) { 8158611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien st->table.push_back(ELFSymbolTy::read(AR, owner, i)); 8280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 8380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 8480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien if (!AR) { 8580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Unable to read the table. 8680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien return 0; 8780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 8880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 8980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien return st.take(); 9080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 9180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 9280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth> 9380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chienvoid ELFSectionSymTab<Bitwidth>::print() const { 9480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien using namespace llvm; 9580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 9680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << '\n' << fillformat('=', 79) << '\n'; 9780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out().changeColor(raw_ostream::WHITE, true); 9880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << "Symbol Table" << '\n'; 9980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out().resetColor(); 10080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 10180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < table.size(); ++i) { 10280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien table[i]->print(); 10380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 10480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 10580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << fillformat('=', 79) << '\n'; 10680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 10780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 10880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#endif // ELF_SECTION_SYM_TAB_HXX 109