轉:https://www.pianshen.com/article/3362131908/
objdump命令是用查看目標文件或者可執行的目標文件的構成的gcc工具。
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選項,直接閱讀匯編代碼。