[英]Why assembly produced by objdump is huge?
我正在嘗試查看我的簡單C應用程序的程序集。 因此,我嘗試通過使用objdump
從二進制文件生成程序集,該程序集可生成約4.3MB大小的文件,並包含103228行匯編代碼 。 然后,我嘗試通過向gcc
提供-S
& -save-temps
標志來做到這一點。
我使用了以下三個命令:
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
標志在這里看起來似乎沒有必要,但是在編譯了一些匯編組件的時間之后,我必須在模擬器上執行此二進制文件,這是必須的。
那么,在我分析執行跟蹤時,應該考慮哪個匯編代碼最相關? (我知道這是另一個問題,但是用相同的答案覆蓋將很方便。)
后兩個只是將asm保存為您的功能。
第一個也具有CRT啟動代碼。 而且,由於您是靜態鏈接的,因此您調用的所有庫函數。
請注意,對於3, -static
和-lm
不執行任何操作,因為您沒有鏈接。 gcc foo.c -S -O3 -fverbose-asm -o- | less
gcc foo.c -S -O3 -fverbose-asm -o- | less
通常很方便。
我注意到您的命令行都沒有包含-O3
或-march=
。 您應該進行優化編譯,並讓gcc針對目標硬件優化代碼。
.s
是機器生成的asm的標准后綴。 ( .S
代表手寫asm:gcc foo.S將首先通過cpp運行它)。 gcc -S
產生一個.s
,同樣的方式-c
產生一個.o
。
對於x86, .asm
通常僅用於Intel語法(NASM / YASM),但是IDK是ARM的約定。
那么,在我分析執行跟蹤時,應該考慮哪個匯編代碼最相關?
這取決於您要學習的內容! 如果您很好地了解了每個庫函數調用的“昂貴”程度(在指令數量,污染分支預測變量的分支數量以及數據緩存污染方面),那么您無需跟蹤執行過程圖書館電話。 如果您有一些內部循環使用的數學庫函數,那么在代碼對時間要求嚴格的情況下,有必要對其進行研究。
但是,通常,探查器或調試器中的單步調試對此很有用。 僅具有大量庫代碼的反匯編輸出通常很混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.