ELFSectionSymTab.hxx revision ee6cdb95525abc8c7766798148302306a100b774
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> 32e586f183e46f921301281352a87f67dbdc1a43b6Logan Chiensize_t ELFSectionSymTab<Bitwidth>::getExternFuncCount() const { 33e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien size_t result = 0; 34e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien for (size_t i = 0; i < table.size(); ++i) { 35e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien if (table[i] && table[i]->isExternFunc()) { 36e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien result++; 37e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien } 38e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien } 39e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien return result; 40e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien} 41e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien 42e586f183e46f921301281352a87f67dbdc1a43b6Logan Chientemplate <unsigned Bitwidth> 4380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <typename Archiver> 4480085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth> * 4580085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::read(Archiver &AR, 4658611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFObjectTy *owner, 4758611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELFSectionHeaderTy const *sh) { 4880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 4958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien llvm::OwningPtr<ELFSectionSymTabTy> st(new ELFSectionSymTabTy()); 5080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 5180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Assert that entry size will be the same as standard. 52c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa rsl_assert(sh->getEntrySize() == TypeTraits<ELFSymbolTy>::size); 5380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 5480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Seek to the start of symbol table 5580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien AR.seek(sh->getOffset(), true); 5680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 5780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Read all symbol table entry 5880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien size_t size = sh->getSize() / sh->getEntrySize(); 5980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < size; ++i) { 6058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien st->table.push_back(ELFSymbolTy::read(AR, owner, i)); 6180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 6280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 6380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien if (!AR) { 6480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Unable to read the table. 6580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien return 0; 6680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 6780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 6880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien return st.take(); 6980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 7080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 7180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth> 7280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chienvoid ELFSectionSymTab<Bitwidth>::print() const { 7380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien using namespace llvm; 7480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 7580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << '\n' << fillformat('=', 79) << '\n'; 7680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out().changeColor(raw_ostream::WHITE, true); 7780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << "Symbol Table" << '\n'; 7880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out().resetColor(); 7980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 8080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < table.size(); ++i) { 8180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien table[i]->print(); 8280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 8380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 8480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << fillformat('=', 79) << '\n'; 8580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 8680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 8780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#endif // ELF_SECTION_SYM_TAB_HXX 88