symboltable.cc
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:4k
源码类别:

Windows CE

开发平台:

C/C++

  1. /**********  * Copyright (c) 2004 Greg Parker.  All rights reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in the  *    documentation and/or other materials provided with the distribution.  *  * THIS SOFTWARE IS PROVIDED BY GREG PARKER ``AS IS'' AND ANY EXPRESS OR  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  **********/ #include "section.h" #include "symboltable.h" #include "stringtable.h" SymbolTable::SymbolTable(Image& newImage)     : Section(newImage) {      // symbol table with single empty symbol, unless replaced by read().     mSymbols.push_back(new Symbol(string(""), mImage.sections()[0], 0, 0, 0)); } void SymbolTable::read(Elf32_Shdr *shdr) {      Section::read(shdr);     vector<Section *>& sections = mImage.sections();     Section *section = sections[swap32(shdr->sh_link)];     StringTable *strtab = dynamic_cast<StringTable *>(section);     Elf32_Sym *sym = (Elf32_Sym *)mContents;     Elf32_Sym *end = (Elf32_Sym *)(mContents + mSize);     mSymbols.erase(mSymbols.begin(), mSymbols.end());     for ( ; sym < end; ++sym) {         mSymbols.push_back(new Symbol(mImage, *strtab, sym));     } } void SymbolTable::forceSection(const Section* s)
  2. {
  3. uint32_t i=0;
  4.     vector<Symbol *>::iterator iter;
  5.     for (iter = mSymbols.begin(); iter != mSymbols.end(); ++iter)
  6.     {
  7.         Symbol *sym = *iter;
  8. sym->libSection(s,i);
  9. if (sym->name() != s->name())
  10. i += 4;
  11. }
  12. }
  13. // strip all local symbols // strip all globals symbols not mentioned in keep[] (if it exists) void SymbolTable::strip(vector<string> *keep) {     vector<Symbol *> newSymbols;     newSymbols.push_back(new Symbol(string(""), mImage.sections()[0], 0, 0, 0));     vector<Symbol *>::iterator iter;     for (iter = mSymbols.begin(); iter != mSymbols.end(); ++iter)     {         Symbol *sym = *iter;         const string &name = sym->name();         if (name == "PealArmStub"  ||  name == "_PealArmStub") {             // PealArmStub is special - never strip it             newSymbols.push_back(sym);         }         else if (!sym->isGlobal()) {             // local symbol - strip it         }          else if (!sym->isUsed() && keep  &&                    keep->end() == find(keep->begin(), keep->end(), name))         {             // keep list exists, but doesn't have this symbol - strip it         }          else {             newSymbols.push_back(sym);         }     }     mSymbols = newSymbols; } void SymbolTable::addSymbol(Symbol *sym) {     mSymbols.push_back(sym); } void SymbolTable::emit(Elf32_Shdr *shdr, uint8_t *&buf, uint32_t& bufLen) {     // construct mContents and mSize     mSize = mSymbols.size() * sizeof(Elf32_Sym);     Elf32_Sym *newContents = (Elf32_Sym *)malloc(mSize);     for (unsigned int i = 0; i < mSymbols.size(); i++) {         newContents[i] = mSymbols[i]->asElf(mImage);     }     mContents = (uint8_t *)newContents;     // set mLink to strtab     mLink = find(mImage.sections().begin(), mImage.sections().end(), mImage.strtab()) - mImage.sections().begin();     Section::emit(shdr, buf, bufLen); }
  14. bool symbolCompare(const Symbol* a, const Symbol* b) 
  15. {
  16.     return a->name() < b->name();
  17. }
  18. void SymbolTable::sortSymbols() 
  19. sort(mSymbols.begin(), mSymbols.end(), symbolCompare); 
  20. }