2016-02-14 59 views
0

我想查看我的簡單C應用程序的程序集。所以,我試圖使用objdump來生成二進制程序集,並且它會生成大約4.3MB大小的文件,其中103228行彙編代碼爲。然後,我試圖通過向gcc提供-S & -save-temps標誌來完成此操作。爲什麼objdump生成的程序集很龐大?

我已經使用以下三個命令:

1. arm-linux-gnueabi-objdump -d hello_simple > hello_simple.dump 
2. arm-linux-gnueabi-gcc -save-temps -static hello_simple.c -o hello_simple -lm 
3. arm-linux-gnueabi-gcc -S -static hello_simple.c -o hello_simple.asm -lm 

在2 & 3的情況下,恰好相同的結果產生的,即,65行彙編代碼。我明白objdump也會產生一些額外的細節。

但是,爲什麼有一個巨大的區別?

EDIT1:我用下面的命令來建立一個二進制:

arm-linux-gnueabi-gcc -static hello_simple.c -o hello_simple -lm 

EDIT2:雖然,-static-lm標誌可以看這裏沒有必要,但是,我必須執行在模擬器中的二進制在編譯時添加一些組件組件後,使其成爲必需。

那麼,在執行跟蹤分析過程中,我應該認爲哪個彙編代碼最相關? (我知道這是另一個問題,但在相同的答案中可以方便地使用它。)

+0

.debug_info我猜?試着首先去掉 –

+1

如果你的程序使用了'-static'鏈接,它還會包含'libc'和其他鏈接到可執行文件的庫。那些也會被'objdump'傾倒。 –

+0

re:你最後的編輯。 '-static -lm'對**命令3沒有任何影響。**它們顯然對其他命令有所作用,因爲這些* do *會產生二進制文件。 –

回答

3

第二個是爲您的函數保存asm。

第一個也有CRT啓動代碼。而且,由於您靜態鏈接了它,所以您調用的所有庫函數。

請注意,對於3,-static-lm不要做任何事情,因爲你沒有鏈接。 gcc foo.c -S -O3 -fverbose-asm -o- | less通常很方便。

我注意到你的命令行中沒有包含-O3-march=。您應該優化編譯,並讓gcc優化目標硬件的代碼。


.s是機器生成的asm的標準後綴。 (手寫asm:.S:gcc foo.S將首先通過cpp運行它)。 gcc -S產生一個.s,同樣的方法-c產生一個.o

對於x86而言,.asm通常僅用於Intel語法(NASM/YASM),但IDK對ARM的約定是什麼。


所以,它的彙編代碼,我應該我執行跟蹤的分析中認爲是最相關的?

這取決於你想學的東西!如果您很清楚每個庫函數調用的「昂貴」(根據指令數量,污染分支預測器的分支數量以及數據高速緩存污染),則無需通過執行圖書館電話。如果你有一些內部循環使用的數學庫函數,那麼如果代碼對時間要求很高,那麼值得一看。但是,通常情況下,調試器中的分析器或單步執行對此非常有用。只是有很多庫代碼的反彙編輸出通常只是混亂。

相關問題