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] |