1. 准备代码hello.c
1 #include <linux/module.h> 2 #include <linux/init.h> 3 #include <linux/kernel.h> 4 5 MODULE_LICENSE("GPL"); 6 MODULE_AUTHOR("baoli"); 7 MODULE_DESCRIPTION("hello world module"); 8 9 static int __init hello_init(void) 10 { 11 int * p = 0; 12 printk(KERN_WARNING "hello world.\n"); 13 *p = 1; 14 15 return 0; 16 } 17 18 static void __exit hello_exit(void) 19 { 20 printk(KERN_WARNING "hello exit!\n"); 21 } 22 23 module_init(hello_init); 24 module_exit(hello_exit);
2. 反汇编分析
执行:objdump -d hello.o > assemble.txt
汇编代码如下:
1 hello.o: file format elf64-x86-64 2 3 Disassembly of section .init.text: 4 5 0000000000000000 <init_module>: 6 MODULE_LICENSE("GPL"); 7 MODULE_AUTHOR("baoli"); 8 MODULE_DESCRIPTION("hello world module"); 9 10 static int __init hello_init(void) 11 { 12 0: 55 push %rbp 13 1: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 14 8: 48 89 e5 mov %rsp,%rbp 15 b: e8 00 00 00 00 callq 10 <init_module+0x10> 16 10: c7 04 25 00 00 00 00 movl $0x1,0x0 17 17: 01 00 00 00 18 1b: 31 c0 xor %eax,%eax 19 1d: 5d pop %rbp 20 1e: c3 retq 21 22 Disassembly of section .exit.text: 23 24 0000000000000000 <cleanup_module>: 25 0: 55 push %rbp 26 1: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 27 8: 48 89 e5 mov %rsp,%rbp 28 b: e8 00 00 00 00 callq 10 <cleanup_module+0x10> 29 10: 5d pop %rbp 30 11: c3 retq
3. objdump总结
objdump -D -b binary -m i386 a.bin
-D表示对全部文件进行反汇编,-b表示二进制,-m表示指令集架构,a.bin就是我们要反汇编的二进制文件
objdump -m可以查看更多支持的指令集架构,如i386:x86-64,i8086等
1)objdump -d:反汇编目标文件中包含的可执行指令。
2)如果需要混合显示源码和汇编代码,需要加上-S选项,并且在编译目标文件时加上-g。
3)如果在编译目标文件时没有加-g选项,则-S相当于-d。
4)-S选项生成的混合代码,有时文件结构混乱,可读性较差。推荐使用-d选项,直接阅读汇编代码。