| Date: | Sun, 20 Sep 2015 15:11:05 +0300 |
|---|---|
| From: | Alin MÃndroc <mindroc.alin@xxxxxxxxx> |
| Subject: | [DynInst_API:] Some documentation patches + code sample |
|
Hi everyone,
I have attached some code patches to the documentation, as following:  CodeSource.tex: Added underscore in front of the names of the members of the "Hint" struct, as they are named in the source code  Iterating.tex: Changed "findModule" to "findModuleByName"; also, quotes around "foo" came out as bogus unicode chars, so I replaced them  LineInformation.tex: Fixed link for code sample which pointed to wrong section  Symtab.C, Symtab.h: Added capital "O" for "getNumberofSymbols" and "getNumberofRegions", as they are named in the documentation Also, an example that I have missed in your documentation was how to parse a file and get the assembly instructions for each function, a compilable piece of code together with build guidelines, like the sample in the manual for parseAPI which shows how to generate a CFG. So I have also attached a code sample with this functionality, which can be built exactly like in the ParseAPI manual, section 3.1. I am not sure where to place it in the manual, so I have attached only the source code. Regards, Alin #include <iostream>
#include "CodeObject.h"
#include "InstructionDecoder.h"
using namespace std;
using namespace Dyninst;
using namespace ParseAPI;
using namespace InstructionAPI;
int main(int argc, char **argv){
if(argc != 2){
printf("Usage: %s <binary path>\n", argv[0]);
return -1;
}
char *binaryPath = argv[1];
SymtabCodeSource *sts;
CodeObject *co;
CodeRegion *cr;
Instruction::Ptr instr;
SymtabAPI::Symtab *symTab;
std::string binaryPathStr(binaryPath);
bool isParsable = SymtabAPI::Symtab::openFile(symTab, binaryPathStr);
if(isParsable == false){
const char *error = "error: file can not be parsed";
cout << error;
return - 1;
}
sts = new SymtabCodeSource(binaryPath);
co = new CodeObject(sts);
//parse the binary given as a command line arg
co->parse();
//get list of all functions in the binary
const CodeObject::funclist &all = co->funcs();
if(all.size() == 0){
const char *error = "error: no functions in file";
cout << error;
return - 1;
}
auto fit = all.begin();
Function *f = *fit;
//create an Instruction decoder which will convert the binary opcodes to strings
InstructionDecoder decoder(f->isrc()->getPtrToInstruction(f->addr()),
InstructionDecoder::maxInstructionLength,
f->region()->getArch());
for(;fit != all.end(); ++fit){
Function *f = *fit;
//get address of entry point for current function
Address crtAddr = f->addr();
int instr_count = 0;
instr = decoder.decode((unsigned char *)f->isrc()->getPtrToInstruction(crtAddr));
auto fbl = f->blocks().end();
fbl--;
Block *b = *fbl;
Address lastAddr = b->last();
//if current function has zero instructions, don't output it
if(crtAddr == lastAddr)
continue;
cout << "\n\n\"" << f->name() << "\" :";
while(crtAddr < lastAddr){
//decode current instruction
instr = decoder.decode((unsigned char *)f->isrc()->getPtrToInstruction(crtAddr));
cout << "\n" << hex << crtAddr;
cout << ": \"" << instr->format() << "\"";
//go to the address of the next instruction
crtAddr += instr->size();
instr_count++;
}
}
return 0;
}
Attachment:
patches.zip |
| [← Prev in Thread] | Current Thread | [Next in Thread→] |
|---|---|---|
| ||
| Previous by Date: | Re: [DynInst_API:] RFC: updating module definitions in Dyninst and Symtab, Bill Williams |
|---|---|
| Next by Date: | [DynInst_API:] BPatch_dynamicTargetExpr on return statements, Marc BrÃnink |
| Previous by Thread: | Re: [DynInst_API:] Snippet register get modified by EmitStackAlign, Bill Williams |
| Next by Thread: | Re: [DynInst_API:] Some documentation patches + code sample, Bill Williams |
| Indexes: | [Date] [Thread] |