/* do we need this? --aij raw_insts_t * raw_insts_of_file(const char *filename) { //segs = NULL; raw_insts_t *ret = new raw_insts_t; asm_program_t *prog = new asm_program_t; bfd *abfd = initialize_bfd(filename); initialize_sections(abfd, prog); prog->functions = identify_functions(prog->sections, abfd); for(map<address_t, asm_function_t *>::const_iterator it = prog->functions.begin(); it != prog->functions.end(); it++){ asm_function_t *f = it->second; bfd_vma pc = f->start_addr; // Disassemble the function while(pc <= f->end_addr){ bfd_byte *ptr = get_ptr_to_instr(prog, pc); raw_inst_t *temp = new raw_inst_t; temp->length = instr->length; temp->bytes = ptr; temp->address = instr->address; ret->push_back(temp); pc += instr->length; } } return ret; } */ asm_program_t * disassemble_program(const char *filename) { asm_program_t *prog = new asm_program_t; //segs = NULL; bfd *abfd = initialize_bfd(filename); prog->abfd = abfd; initialize_sections(abfd, prog); prog->functions = identify_functions(prog->sections, abfd); unsigned long total_instrs =0; set<asm_function_t *> functions; for(map<address_t, asm_function_t *>::const_iterator it = prog->functions.begin(); it != prog->functions.end(); it++){ // Give each function a unique ID (for BGL) // and fill in control flow graph, etc for function asm_function_t *f = it->second; //f->cg_num = cg_num++; disassemble_function(f, prog); functions.insert(f); if(is_debug_on("stats")){ for(map<address_t, Instruction *>::const_iterator iit = f->instmap.begin(); iit != f->instmap.end(); iit++){ total_instrs++; } } } print_debug("stats", "Size of program %u (instrs)\n", total_instrs); //create_callgraph(prog); return prog; }
int main(int argc, char** argv, char** envp) { if(argc!=1) { fprintf(stderr, "%s: usage: %s\n", argv[0], argv[0]); return EXIT_FAILURE; } disassemble_function("_exit"); return EXIT_SUCCESS; }