static int disassemble_file( const char * name, opdis_off_t offset ) { int rv; FILE * f; opdis_t o; opdis_buf_t buf; opdis_insn_tree_t tree; f = fopen( name, "r" ); if (! f ) { printf( "Unable to open file %s: %s\n", name, strerror(errno) ); return -1; } buf = opdis_buf_read( f, 0, 0 ); fclose( f ); o = opdis_init(); tree = opdis_insn_tree_init( 1 ); opdis_set_display( o, store_insn, tree ); rv = opdis_disasm_cflow( o, buf, (opdis_vma_t) offset ); opdis_insn_tree_foreach( tree, print_insn, (void *) name ); opdis_insn_tree_free( tree ); opdis_term( o ); return (rv > 0) ? 0 : -2; }
void disassemble_mem(void * src, size_t length) { opdis_t o; opdis_buf_t buf = opdis_buf_alloc(length, (opdis_vma_t)src); opdis_buf_fill(buf, 0, src, length); o = opdis_init(); //opdis_set_arch(o, bfd_arch_k1om, bfd_mach_k1om, NULL); //const bfd_arch_info_type *arch_info = bfd_scan_arch("i386:x86-64"); opdis_set_arch(o, bfd_arch_i386, bfd_mach_x86_64, print_insn_i386_att); opdis_disasm_linear(o, buf, (opdis_vma_t)src, length); opdis_buf_free(buf); opdis_term(o); }