【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具
上一篇文章學習了ar工具與nm工具,點擊鏈接查看上一篇文章:點擊鏈接
本片文章學習記錄以下三個工具:
- objdump
- size
- strings
1、objdump工具
用法:
-
反匯編目標文件,查看匯編到源碼的映射(后面代碼案例分析看具體區別)
- objdump -d func.o
- objdump -S func.o
-
查看目標文件中的詳細段信息
- objdump -h test.o
其中objdump -h的輸出需要說明一下(后面有例子說明):
1.1、代碼案例
還是以上一篇文章的代碼來說明(運行時出錯,但是不影響我們本次的實驗)
test.c
#include <stdio.h>int g_global = 0; int g_test = 1;extern int* g_pointer; extern void func();int main(int argc, char *argv[]) {printf("&g_global = %p\n", &g_global);printf("&g_test = %p\n", &g_test);printf("&g_pointer = %p\n", &g_pointer);printf("g_pointer = %p\n", g_pointer);printf("&func = %p\n", &func);printf("&main = %p\n", &main);func();return 0; }func.c
#include <stdio.h>int* g_pointer;void func() {*g_pointer = (int)"D.T.Software";return; }對上述代碼進行編譯:
- gcc -g -c func.c -o func.o
- gcc -g -c test.c -o test.o
- gcc func.c test.c -o lyy
- objdump -d func.o
結果如下:
很明顯,我們得到了func.o的反匯編文件。但是上來看這個反匯編文件,也很是不方便,如果能夠將源代碼與匯編代碼對應的看就好了。objdump -S正具有這個功能
- objdump -S func.o
結果如下:
結果顯而易見,我們可以看到源代碼與匯編語言的的對照。
- objdump -h test.o
結果如下:
上述對應的每一列的內容,在上面的表格中已經有所說明。需要注意的地方是VMA與LMA這兩列內容一般情況下是相等的。并且在上面的例子中我們看到它們對應的列都是0,其實是因為test.o目標文件是沒有鏈接的文件,它的加載地址都還是不確定的,所以在這里就直接是0.
VMM是虛擬內存地址,實際上就是進程的地址空間中的地址,此時,程序的一個副本進程,已經運行起來了,它的加載地址(LMA)就是加載到虛擬地址空間中的地址。所以LMA與VMA相等。
比如我們對可執行文件lyy進行查詢:
- objdump -h lyy
顯示如下(不全):
很明顯,此時的lyy是可執行文件,是已經鏈接好的文件,所以它的VMA與LMA都有具體的值。并且相等。
2、size工具
- size工具可以獲取目標文件中所有段的大小
如:
- size test.o
3、strings工具
- 獲取目標文件中的所有字符串常量
如:
- strings test.o
很明顯,雙引號下的字符串,都是字符串常量。
4、總結
- 學會使用objdump工具(-d -S -h這三個選項的含義)
- 學會使用size工具查看目標文件各個段的大小
- 學會使用strings工具查看目標文件的所有字符串常量
本文參考狄泰軟件學院相關課程
想學習的可以加狄泰軟件學院群,
群聊號碼:199546072
學習探討加個人(可以免費幫忙下載CSDN資源):
qq:1126137994
微信:liu1126137994
總結
以上是生活随笔為你收集整理的【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仿斗鱼、美团、网易邮箱等 弹窗效果
- 下一篇: Go语言实战--学习笔记--runner