【軟體開發底層知識修煉】八 Binutils輔助工具之- objdump工具 與 size,strings工具
阿新 • • 發佈:2018-12-12
上一篇文章學習了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命令進行反彙編:
- objdump -d func.o
結果如下:
很明顯,我們得到了func.o的反彙編檔案。但是上來看這個反彙編檔案,也很是不方便,如果能夠將原始碼與彙編程式碼對應的看就好了。objdump -S正具有這個功能
- 使用objdump -S進行反彙編
- objdump -S func.o
結果如下:
結果顯而易見,我們可以看到原始碼與組合語言的的對照。
- 使用objdump -h檢視目標檔案中的詳細段資訊
- 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