objdump命令主要是用來檢視檔案中的各個段的詳細資訊
[root@VM_0_4_centos studyCode]# objdump --help
Usage: objdump <option(s)> <file(s)>
Display information from object <file(s)>.
At least one of the following switches must be given:
-a, //顯示檔案庫的成員資訊,類似ls -l將lib*.a的資訊列出。
-f, //顯示objfile中每個檔案的整體頭部摘要資訊。
-p, //顯示特定檔案頭內容(可看到該檔案依賴哪些動態庫和GLIBC版本)
-h, //顯示目標檔案各個section的頭部摘要資訊,包括各個段的位置,大小等
-x, //顯示所有的頭部資訊,實測基本包含了-a,-f,-p和-h參數的輸出
-C, //可將低階符號轉換成便於使用者檢視的方式,可用於C++的函數顯示,和nm命令的-C一樣
-d, //從objfile中反彙編那些特定指令機器碼的section
-D, //與 -d 類似,但反彙編所有section.
-S, //反彙編且帶原始碼
-s, //顯示所有section的完整內容
-g, //顯示偵錯資訊。企圖解析儲存在檔案中的偵錯資訊並以C語言的語法顯示出來。僅僅支援某些型別的偵錯資訊。有些其他的格式被readelf -w支援
-e, //類似-g選項,但是生成的資訊是和ctags工具相相容的格式
//使用-t和-T參數,objdump也能像nm命令一樣檢視符號表
-t, //顯示符號表
-T, //顯示動態符號表
-r, //顯示重定位資訊
-R, //顯示動態鏈接重定位資訊
-j, //僅僅顯示指定名稱爲name的section的資訊
//指定目標檔案的小端。這個項將影響反彙編出來的指令。在反彙編的檔案沒描述小端資訊的時候用。
-EB --endian=big
-EL --endian=little
-l, //用檔名和行號標註相應的目的碼
-F, //顯示在檔案中的偏移地址
//這兩個參數可選定顯示的開始地址和結束地址,注意ADDR要加上0x,變成16進位制,可搭配-s,-d等參數使用
--start-address=ADDR //開始地址
--stop-address=ADDR //結束地址
比較常用的參數有:-C,-s,-j,-S,-l --start(stop)-address=ADDR
,使用這幾個參數即可檢視段資訊和反彙編
博主由於經歷有限,僅對以下使用場景有所領悟
一個簡單的例子,原始碼如下
#include "add.h"
int add(int a, int b)
{
// usleep(1);
return a+b;
}
編譯生成動態庫
想要檢視指定函數的彙編原始碼時,有兩種方式
nm | grep
快速查詢該函數的地址[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進位制)
[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
即可獲得指定函數的彙編程式碼
disassemble/m
可同時顯示原始碼)[root@VM_0_4_centos studyCode]# gdb libadd.so
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.
檢視指定段資訊
例如我們想要檢視一個動態庫的程式碼段,可如下操作
[root@VM_0_4_centos studyCode]# objdump libadd.so -s -j .text
libadd.so: file format elf64-x86-64
Contents of section .text:
05a0 488d0588 0a200048 8d3d7a0a 20005548 H.... .H.=z. .UH
05b0 29f84889 e54883f8 0e77025d c3488b05 ).H..H...w.].H..
05c0 240a2000 4885c074 f25dffe0 0f1f4000 $. .H..t.]....@.
05d0 488d0551 0a200048 8d3d4a0a 20005548 H..Q. .H.=J. .UH
05e0 29f84889 e548c1f8 034889c2 48c1ea3f ).H..H...H..H..?
05f0 4801d048 d1f87502 5dc3488b 15ef0920 H..H..u.].H....
0600 004885d2 74f25d48 89c6ffe2 0f1f4000 .H..t.]H......@.
0610 803d110a 20000075 2748833d d7092000 .=.. ..u'H.=.. .
0620 00554889 e5740c48 8d3db207 2000e85d .UH..t.H.=.. ..]
0630 ffffffe8 68ffffff 5dc605e8 09200001 ....h...].... ..
0640 f3c30f1f 4000662e 0f1f8400 00000000 [email protected].........
0650 48833d80 07200000 7426488b 057f0920 H.=.. ..t&H....
0660 004885c0 741a5548 8d3d6a07 20004889 .H..t.UH.=j. .H.
0670 e5ffd05d e957ffff ff0f1f80 00000000 ...].W..........
0680 e94bffff ff554889 e5897dfc 8975f88b .K...UH...}..u..
0690 45f88b55 fc01d05d c3 E..U...].
當然也可以搭配start/stop address來顯示指定地址的資訊,效果如下
[root@VM_0_4_centos studyCode]# objdump libadd.so -s -j .text --start-address=0x600 --stop-address=0x670
libadd.so: file format elf64-x86-64
Contents of section .text:
0600 004885d2 74f25d48 89c6ffe2 0f1f4000 .H..t.]H......@.
0610 803d110a 20000075 2748833d d7092000 .=.. ..u'H.=.. .
0620 00554889 e5740c48 8d3db207 2000e85d .UH..t.H.=.. ..]
0630 ffffffe8 68ffffff 5dc605e8 09200001 ....h...].... ..
0640 f3c30f1f 4000662e 0f1f8400 00000000 [email protected].........
0650 48833d80 07200000 7426488b 057f0920 H.=.. ..t&H....
0660 004885c0 741a5548 8d3d6a07 20004889 .H..t.UH.=j. .H.