目录
- 常用参数介绍
- 应用场景
简介
objdump命令主要是用来查看文件中的各个段的详细信息
常用参数介绍
1 | [root@VM_0_4_centos studyCode] |
比较常用的参数有:-C,-s,-j,-S,-l --start(stop)-address=ADDR
,使用这几个参数即可查看段信息和反汇编
应用场景
博主由于经历有限,仅对以下使用场景有所领悟
一个简单的例子,源码如下
1 |
|
编译生成动态库
想要查看指定函数的汇编源码时,有两种方式
使用
nm | grep
快速查找该函数的地址1
2[root@VM_0_4_centos studyCode]# nm -C libadd.so | grep add
0000000000000685 T add(int, int)获得地址0x685后,然后使用
objdump -S -l --start-address=XXXX
的方式可以直接显示XXX地址开始的汇编代码和源代码(注意XXXX部分的地址前面需要加上0x表示16进制)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36[root@VM_0_4_centos studyCode]# objdump libadd.so -S -l -C --start-address=0x685
libadd.so: file format elf64-x86-64
Disassembly of section .text:
0000000000000685 <add(int, int)>:
_Z3addii():
/home/yu.tian/studyCode/add.cpp:4
#include "add.h"
int add(int a, int b)
{
685: 55 push %rbp
686: 48 89 e5 mov %rsp,%rbp
689: 89 7d fc mov %edi,-0x4(%rbp)
68c: 89 75 f8 mov %esi,-0x8(%rbp)
/home/yu.tian/studyCode/add.cpp:6
// usleep(1);
return a+b;
68f: 8b 45 f8 mov -0x8(%rbp),%eax
692: 8b 55 fc mov -0x4(%rbp),%edx
695: 01 d0 add %edx,%eax
/home/yu.tian/studyCode/add.cpp:7
}
697: 5d pop %rbp
698: c3 retq
Disassembly of section .fini:
000000000000069c <_fini>:
_fini():
69c: 48 83 ec 08 sub $0x8,%rsp
6a0: 48 83 c4 08 add $0x8,%rsp
6a4: c3 retq即可获得指定函数的汇编代码
第二种方式为进入GDB使用disassemble命令反汇编,(
disassemble/m
可同时显示源码)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30[root@VM_0_4_centos studyCode]
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-115.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/yu.tian/studyCode/libadd.so...done.
(gdb) disas/m add
Dump of assembler code for function add(int, int):
4 {
0x0000000000000685 <+0>: push %rbp
0x0000000000000686 <+1>: mov %rsp,%rbp
0x0000000000000689 <+4>: mov %edi,-0x4(%rbp)
0x000000000000068c <+7>: mov %esi,-0x8(%rbp)
5 // usleep(1);
6 return a+b;
0x000000000000068f <+10>: mov -0x8(%rbp),%eax
0x0000000000000692 <+13>: mov -0x4(%rbp),%edx
0x0000000000000695 <+16>: add %edx,%eax
7 }
0x0000000000000697 <+18>: pop %rbp
0x0000000000000698 <+19>: retq
End of assembler dump.
查看指定段信息
例如我们想要查看一个动态库的代码段,可如下操作
1 | [root@VM_0_4_centos studyCode] |
当然也可以搭配start/stop address来显示指定地址的信息,效果如下
1 | [root@VM_0_4_centos studyCode] |