我必须找出我在内存中的一条指令的大小(实际上,我在内存中有一个小代码段并且想获得第一条指令的大小)。我花了一些时间才找到 libopcodes 和 libbfd。我把标题改成了红色,并试图想出一个简单的解决方案,但似乎我误解了一些东西,因为程序总是崩溃:
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));
您可以窃取 Linux 内核中的一些代码。如果复制到用户模式程序中,它应该可以正常工作。
看看 arch/x86/lib 和 arch/x86/tools那里有一个操作码映射文件,以及一个读取它以在名为 innat.c 的文件中生成一个表的 awk 脚本。那里还有一些其他文件使用该表来实现解码器。
确定指令大小就足够了。
当然,这假设您对 GPL 没有问题。
我是一名优秀的程序员,十分优秀!