add code sample to fix doc build
[dyninst.git] / parseAPI / doc / code_sample.cc
1 /*
2    Copyright (C) 2015 Alin Mindroc
3    (mindroc dot alin at gmail dot com)
4
5    This is a sample program that shows how to use InstructionAPI in order to
6    6  print the assembly code and functions in a provided binary.
7
8
9    This program is free software; you can redistribute it and/or
10    modify it under the terms of the GNU Lesser General Public
11    11  License as published by the Free Software Foundation; either
12    version 2.1 of the License, or (at your option) any later version.
13    */
14 #include <iostream>
15 #include "CodeObject.h"
16 #include "InstructionDecoder.h"
17 using namespace std;
18 using namespace Dyninst;
19 using namespace ParseAPI;
20
21 using namespace InstructionAPI;
22 int main(int argc, char **argv){
23     if(argc != 2){
24         printf("Usage: %s <binary path>\n", argv[0]);
25         return -1;
26     }
27     char *binaryPath = argv[1];
28
29     SymtabCodeSource *sts;
30     CodeObject *co;
31     Instruction::Ptr instr;
32     SymtabAPI::Symtab *symTab;
33     std::string binaryPathStr(binaryPath);
34     bool isParsable = SymtabAPI::Symtab::openFile(symTab, binaryPathStr);
35     if(isParsable == false){
36         const char *error = "error: file can not be parsed";
37         cout << error;
38         return - 1;
39     }
40     sts = new SymtabCodeSource(binaryPath);
41     co = new CodeObject(sts);
42     //parse the binary given as a command line arg
43     co->parse();
44
45     //get list of all functions in the binary
46     const CodeObject::funclist &all = co->funcs();
47     if(all.size() == 0){
48         const char *error = "error: no functions in file";
49         cout << error;
50         return - 1;
51     }
52     auto fit = all.begin();
53     Function *f = *fit;
54     //create an Instruction decoder which will convert the binary opcodes to strings
55     InstructionDecoder decoder(f->isrc()->getPtrToInstruction(f->addr()),
56             InstructionDecoder::maxInstructionLength,
57             f->region()->getArch());
58     for(;fit != all.end(); ++fit){
59         Function *f = *fit;
60         //get address of entry point for current function
61
62         Address crtAddr = f->addr();
63         int instr_count = 0;
64         instr = decoder.decode((unsigned char *)f->isrc()->getPtrToInstruction(crtAddr));
65         auto fbl = f->blocks().end();
66         fbl--;
67         Block *b = *fbl;
68         Address lastAddr = b->last();
69         //if current function has zero instructions, don’t output it
70         if(crtAddr == lastAddr)
71             continue;
72         cout << "\n\n\"" << f->name() << "\" :";
73         while(crtAddr < lastAddr){
74             //decode current instruction
75             instr = decoder.decode((unsigned char *)f->isrc()->getPtrToInstruction(crtAddr));
76             cout << "\n" << hex << crtAddr;
77             cout << ": \"" << instr->format() << "\"";
78             //go to the address of the next instruction
79             crtAddr += instr->size();
80             instr_count++;
81         }
82     }
83     return 0;
84 }