我必须找出我在内存中的指令的大小(实际上,我在内存中有一个小的代码段,并且想要获得第一条指令的大小)。 我花了一些时间来查找libopcodes和libbfd。我红头,并试图拿出一个简单的解决方案,但它似乎像我missunderstood的东西,因为该方案老是死机:libopcodes:得到一个指令的大小
int main(int argc, char **argv) {
disassemble_info *dis = malloc(sizeof(*dis));
assert(dis != NULL);
dis->arch = bfd_arch_i386;
dis->read_memory_func = buffer_read_memory;
dis->buffer_length = 64;
dis->buffer = malloc(dis->buffer_length);
memset(dis->buffer, 0x90, dis->buffer_length);
disassemble_init_for_target(dis);
int instr_size = print_insn_i386(0, dis);
printf("instruction size is %d\n", instr_size);
return 0;
}
预期的结果将是1(nop
)的指令大小。
编辑:
对不起你们,我是一个愚蠢的人。
memset(dis, 0, sizeof(*dis));
增加了flavor(bfd_target_elf_flavour),mach(bfd_mach_x86_64)和endian(BFD_ENDIAN_LITTLE)。没有帮助,但我不知道什么味道。我还添加了init_disassemble_info(dis,NULL,NULL); 编程接收到的信号SIGSEGV,分段故障。 0x0000000000000000在?? () (gdb)bt #0 0x0000000000000000 in ?? () #1 0x00007ffff7b1c749在? ()from /usr/lib/libopcodes-2.22.90-system.20120924.so #2 0x0000000000400b5c in main(argc = 1,argv = 0x7fffffffe428)at /home/sebastian/prog/libredirect/libredirect/test.c: 36 – 2013-03-12 01:30:30
您可能希望更新程序清单以包含您尝试的内容,并粘贴/格式化gdb堆栈跟踪。 – 2013-03-12 01:37:14
另一项:您正在设置缓冲区和buffer_length,但不是buffer_vma。顺便说一句,检查出这个文件:https://github.com/mkfs/opdis/blob/master/opdis/opdis.c;它利用libopcodecs。我一直在研究它以确定您的程序中可能缺少哪些步骤。这对你也可能有用。 – 2013-03-12 01:50:00