本文整理汇总了C++中Symtab::getAllRegions方法的典型用法代码示例。如果您正苦于以下问题:C++ Symtab::getAllRegions方法的具体用法?C++ Symtab::getAllRegions怎么用?C++ Symtab::getAllRegions使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Symtab
的用法示例。
在下文中一共展示了Symtab::getAllRegions方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: createMemoryBackingStore
bool BinaryEdit::createMemoryBackingStore(mapped_object *obj) {
// We want to create a buffer for every section in the
// binary so that we can store updates.
Symtab *symObj = obj->parse_img()->getObject();
vector<Region*> regs;
symObj->getAllRegions(regs);
for (unsigned i = 0; i < regs.size(); i++) {
memoryTracker *newTracker = NULL;
if (regs[i]->getRegionType() == Region::RT_BSS || (regs[i]->getMemSize() == 0))
{
continue;
}
else {
newTracker = new memoryTracker(regs[i]->getMemOffset(),
regs[i]->getMemSize(),
regs[i]->getPtrToRawData());
}
newTracker->alloced = false;
if (!memoryTracker_)
memoryTracker_ = new codeRangeTree();
memoryTracker_->insert(newTracker);
}
return true;
}
示例2: writeFile
bool BinaryEdit::writeFile(const std::string &newFileName)
{
// Step 1: changes.
inst_printf(" writing %s ... \n", newFileName.c_str());
Symtab *symObj = mobj->parse_img()->getObject();
// link to the runtime library if tramp guards are currently enabled
if ( !symObj->isStaticBinary() && !BPatch::bpatch->isTrampRecursive() ) {
assert(!runtime_lib.empty());
symObj->addLibraryPrereq((*runtime_lib.begin())->fileName());
}
if( symObj->isStaticBinary() && isDirty() ) {
if( !doStaticBinarySpecialCases() ) {
cerr << "Failed to write file " << newFileName << ": static binary handler failed" << endl;
return false;
}
}
delayRelocation_ = false;
relocate();
vector<Region*> oldSegs;
symObj->getAllRegions(oldSegs);
//Write any traps to the mutatee
if (canUseTraps()) {
trapMapping.shouldBlockFlushes(false);
trapMapping.flush();
}
// Now, we need to copy in the memory of the new segments
for (unsigned i = 0; i < oldSegs.size(); i++) {
codeRange *segRange = NULL;
if (!memoryTracker_->find(oldSegs[i]->getMemOffset(), segRange)) {
#if 0
// Looks like BSS
if (newSegs[i].name == ".bss")
#endif
continue;
//inst_printf (" segment name: %s\n", newSegs[i].name.c_str());
//assert(0);
}
//inst_printf(" ==> memtracker: Copying to 0x%lx from 0x%lx\n",
//newSegs[i].loadaddr, segRange->get_local_ptr());
memoryTracker* mt = dynamic_cast<memoryTracker*>(segRange);
assert(mt);
if(mt->dirty) {
oldSegs[i]->setPtrToRawData(segRange->get_local_ptr(), oldSegs[i]->getMemSize());
}
//newSegs[i].data = segRange->get_local_ptr();
}
// Okay, that does it for the old stuff.
// Now we need to get the new stuff. That's all the allocated memory. First, big
// buffer to hold it.
void *newSectionPtr = malloc(highWaterMark_ - lowWaterMark_);
pdvector<codeRange *> writes;
memoryTracker_->elements(writes);
for (unsigned i = 0; i < writes.size(); i++) {
assert(newSectionPtr);
memoryTracker *tracker = dynamic_cast<memoryTracker *>(writes[i]);
assert(tracker);
//inst_printf("memory tracker: 0x%lx load=0x%lx size=%d %s\n",
//tracker->get_local_ptr(), tracker->get_address(), tracker->get_size(),
//tracker->alloced ? "[A]" : "");
if (!tracker->alloced) continue;
// Copy whatever is in there into the big buffer, at the appropriate address
assert(tracker->get_address() >= lowWaterMark_);
Address offset = tracker->get_address() - lowWaterMark_;
assert((offset + tracker->get_size()) < highWaterMark_);
void *ptr = (void *)(offset + (Address)newSectionPtr);
memcpy(ptr, tracker->get_local_ptr(), tracker->get_size());
}
// Righto. Now, that includes the old binary - by design -
// so skip it and see what we're talking about size-wise. Which should
// be less than the highWaterMark, so we can double-check.
// Next, make a new section. We have the following parameters:
// Offset vaddr: we get this from Symtab - "first free address with sufficient space"
// std::string name: without reflection, ".dyninstInst"
// unsigned long flags: these are a SymtabAPI abstraction. We're going with text|data because
// we might have both.
// bool loadable: heck yeah...
Region *newSec = NULL;
symObj->findRegion(newSec, ".dyninstInst");
if (newSec) {
// We're re-instrumenting - will fail for now
fprintf(stderr, "ERROR: unable to open/reinstrument previously instrumented binary %s!\n", newFileName.c_str());
//.........这里部分代码省略.........