簡體   English   中英

為什么objdump產生的程序集很大?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM