1. 程式人生 > >【軟體開發底層知識修煉】八 Binutils輔助工具之- objdump工具 與 size,strings工具

【軟體開發底層知識修煉】八 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
  1. 然後使用objdump -d命令進行反彙編:
  • objdump -d func.o

結果如下:
在這裡插入圖片描述

很明顯,我們得到了func.o的反彙編檔案。但是上來看這個反彙編檔案,也很是不方便,如果能夠將原始碼與彙編程式碼對應的看就好了。objdump -S正具有這個功能

  1. 使用objdump -S進行反彙編
  • objdump -S func.o

結果如下:
在這裡插入圖片描述

結果顯而易見,我們可以看到原始碼與組合語言的的對照。

  1. 使用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