예제 #1
0
파일: symbol.cpp 프로젝트: LLNL/STAT
bool DysectAPI::CodeLocation::findSymbol(SymtabAPI::Symtab* symtab, string name, string libName, vector<DysectAPI::CodeLocation*>& symbols, bool isRegex) {
  assert(symtab != 0);

  bool exit = false;
  vector<SymtabAPI::Symbol *> symtabSymbols;
  vector<SymtabAPI::Symbol *> foundSymtabSymbols;
  set<pair<Dyninst::Address, string> > lOffsets;

  foundSymtabSymbols.clear();
  symtabSymbols.clear();

  // XXX: Include class specialization!
  if (name[0] == '~') {
    name.erase(0, 1);
    exit = true;
  }
  string symbolExpr = string(name);
  symbolExpr.append("<*>");
  //boost::regex expression(symbolExpr);

  if(!symtab->findSymbol(foundSymtabSymbols, name, SymtabAPI::Symbol::ST_FUNCTION, anyName, isRegex) && !isRegex) {

    // Try to search for template specialization
    symtab->findSymbol(foundSymtabSymbols, symbolExpr, SymtabAPI::Symbol::ST_FUNCTION, anyName, true);
  }

  if(foundSymtabSymbols.empty()) {
    //return Err::verbose(false, "No symbols found for '%s'", name.c_str());
    return false;
  }


  for(int i = 0; i < foundSymtabSymbols.size(); i++) {
    DysectAPI::CodeLocation* dsym = new DysectAPI::CodeLocation();
    dsym->libName = libName;

    SymtabAPI::Symbol* ssym = foundSymtabSymbols[i];

    string* str = new string(ssym->getPrettyName());
    Dyninst::Address offset = ssym->getOffset();
    if (exit == true) //TODO: This may not work if code optimized (i.e. MPI functions)
      offset = offset + ssym->getSize() - 1; // this is computing the exit!

    if(lOffsets.find(pair<Dyninst::Address, string> (offset, *str)) != lOffsets.end()) {
      continue;
    }
    lOffsets.insert(pair<Dyninst::Address, string> (offset, *str));

    dsym->offsets.insert(pair<Dyninst::Address, string*>(offset, str));

    symbols.push_back(dsym);
  }

  return true;
}
예제 #2
0
파일: symbol.cpp 프로젝트: wujieqian/STAT
bool DysectAPI::CodeLocation::findSymbol(SymtabAPI::Symtab* symtab, string name, string libName, vector<DysectAPI::CodeLocation*>& symbols, bool isRegex) {
  assert(symtab != 0);

  vector<SymtabAPI::Symbol *> symtabSymbols;
  vector<SymtabAPI::Symbol *> foundSymtabSymbols;
  vector<Dyninst::Address> lOffsets;

  foundSymtabSymbols.clear();
  symtabSymbols.clear();

  // XXX: Include class specialization!
  string symbolExpr = string(name);
  symbolExpr.append("<*>");
  //boost::regex expression(symbolExpr);
  
  if(!symtab->findSymbol(foundSymtabSymbols, name, SymtabAPI::Symbol::ST_FUNCTION, anyName, isRegex) && !isRegex) {

    // Try to search for template specialization
    symtab->findSymbol(foundSymtabSymbols, symbolExpr, SymtabAPI::Symbol::ST_FUNCTION, anyName, true);
  }

  if(foundSymtabSymbols.empty()) {
    //return Err::verbose(false, "No symbols found for '%s'", name.c_str());
    return false;
  }


  for(int i = 0; i < foundSymtabSymbols.size(); i++) {
    DysectAPI::CodeLocation* dsym = new DysectAPI::CodeLocation();
    dsym->libName = libName;

    SymtabAPI::Symbol* ssym = foundSymtabSymbols[i];

    string* str = new string(ssym->getPrettyName());
    Dyninst::Address offset = ssym->getOffset();

    // XXX: Search for pair instead of plain offset
    if(dsym->offsets.find(offset) != dsym->offsets.end()) {
      continue;
    }

    dsym->offsets.insert(pair<Dyninst::Address, string*>(offset, str));

    symbols.push_back(dsym);
  }
  
  return true;
}
예제 #3
0
파일: IA_IAPI.C 프로젝트: dyninst/dyninst
std::pair<bool, Address> IA_IAPI::getCFT() const
{
   if(validCFT) return cachedCFT;
    Expression::Ptr callTarget = curInsn().getControlFlowTarget();
	if (!callTarget) return make_pair(false, 0);
       // FIXME: templated bind(),dammit!
    callTarget->bind(thePC[_isrc->getArch()].get(), Result(s64, current));
    parsing_printf("%s[%d]: binding PC %s in %s to 0x%x...", FILE__, __LINE__,
                   thePC[_isrc->getArch()]->format(curInsn().getArch()).c_str(), curInsn().format().c_str(), current);

    Result actualTarget = callTarget->eval();
#if defined(os_vxworks)

    int reloc_target = current;
#if defined(arch_x86)
    ++reloc_target;
#endif

    if (actualTarget.convert<Address>() == reloc_target) {
        // We have a zero offset branch.  Consider relocation information.
        SymtabCodeRegion *scr = dynamic_cast<SymtabCodeRegion *>(_cr);
        SymtabCodeSource *scs = dynamic_cast<SymtabCodeSource *>(_obj->cs());

        if (!scr && scs) {
            set<CodeRegion *> regions;
            assert( scs->findRegions(reloc_target, regions) == 1 );
            scr = dynamic_cast<SymtabCodeRegion *>(*regions.begin());
        }

        SymtabAPI::Symbol *sym = NULL;
        if (scr) {
            std::vector<SymtabAPI::relocationEntry> relocs =
                scr->symRegion()->getRelocations();

            for (unsigned i = 0; i < relocs.size(); ++i) {
                if (relocs[i].rel_addr() == reloc_target) {
                    sym = relocs[i].getDynSym();
                    if (sym && sym->getOffset()) {
                        parsing_printf(" <reloc hit> ");
                        actualTarget = Result(s64, sym->getOffset());
                    }
                    break;
                }
            }
        }

        if (sym && sym->getOffset() == 0) {
            // VxWorks external call.
            // Need some external means to find the target.
            Address found;
            const std::string &sym_name = sym->getMangledName();
            if (wtxFindFunction(sym_name.c_str(), 0x0, found)) {
                parsing_printf(" <wtx search hit> ");
                actualTarget = Result(s64, found);

                // We've effectively found a plt call.  Update linkage table.
                _obj->cs()->linkage()[found] = sym_name;

            } else {
                parsing_printf(" <wtx fail %s> ", sym_name.c_str());
                actualTarget.defined = false;
            }
        }
    }
#endif

    if(actualTarget.defined)
    {
       cachedCFT = std::make_pair(true, actualTarget.convert<Address>());
       parsing_printf("SUCCESS (CFT=0x%x)\n", cachedCFT.second);
    }
    else
    {
       cachedCFT = std::make_pair(false, 0); 
        parsing_printf("FAIL (CFT=0x%x), callTarget exp: %s\n",
                       cachedCFT.second,callTarget->format(curInsn().getArch()).c_str());
    }
    validCFT = true;

    if(isLinkerStub()) {
        parsing_printf("Linker stub detected: Correcting CFT.  (CFT=0x%x)\n",
                       cachedCFT.second);
    }

    return cachedCFT;
}