我必須找出我在內存中的指令的大小(實際上,我在內存中有一個小的代碼段,並且想要獲得第一條指令的大小)。 我花了一些時間來查找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