2016-09-06 38 views
1

我想分析我正在編譯的C程序的程序集輸出。 爲了讓GCC保存臨時文件,我在編譯時添加了-save-temps選項。GCC保存帶有額外信息的臨時輸出

在另一個link我發現下面的GCC選項在彙編代碼中產生額外的輸出。如何結合-save-temps使用此選項來生成更易讀的裝配輸出?我也想確保我正在查看的彙編文件對應於GCC生成的二進制文件。

-a[sub-option...] turn on listings 
       Sub-options [default hls]: 
       c  omit false conditionals 
       d  omit debugging directives 
       g  include general info 
       h  include high-level source 
       l  include assembly 
       m  include macro expansions 
       n  omit forms processing 
       s  include symbols 
       =FILE list to FILE (must be last sub-option) 
+3

嘗試'-fverbose-asm'。 – fuz

+3

有關**使asm輸出可讀**的更多提示,另請參閱:[如何從GCC/clang程序集輸出中刪除「噪聲」(http://stackoverflow.com/a/38552509/224132) –

+0

好吧,我認爲它有幫助。謝謝 ! – Raj

回答

1

相關:How to remove "noise" from GCC/clang assembly output?:很多方法可以讓編譯器ASM輸出更易於閱讀。


-Wa,xyz=FILE作出了額外輸出文件旁邊的正常輸出。它與-save-temps正交。如果你想要它到一個文件,你需要在命令行上額外的輸出文件名。

例如在Makefile pattern rule

%.o : %.c 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) -Wa,-adhln=$*.lst $< -o [email protected] 

假如把它放在一個名爲makefile文件(縮進是一個真正的TAB,而不是空格),那麼你可以:

$ CFLAGS='-O3 -g -fverbose-asm' make rnd10.o 
cc -c -O3 -g -fverbose-asm -Wa,-adhln=rnd10.lst rnd10.c -o rnd10.o 

$ ll rnd10.* 
-rw-rw-r-- 1 peter peter 912 Mar 3 2016 rnd10.c 
-rw-rw-r-- 1 peter peter 25K Sep 6 08:23 rnd10.lst 
-rw-rw-r-- 1 peter peter 12K Sep 6 08:23 rnd10.o 

所以無論是和的.o上市是由同一個命令創建的。如果您使用的是-save-temps,那麼也會有預處理的源代碼和實際用於彙編程序的.s,但在同一時間保存這些代碼和列表可能沒有多大意義。 (我選擇.lst,因爲它不是在將聚集格式)


可能能夠與剛剛加入-Wa,-adhln=$*.lstCFLAGS,而不是重寫模式規則脫身。這仍然只適用於使用Make的構建系統,而不是最終不會生成Makefile的替代方案(例如scons),因爲擴展到模式規則的主幹的$*特定於Make。它也只適用於製作模式規則,而不是明確的foo.o : foo.c foo.h樣式規則。

例如

$ rm Makefile 
$ CFLAGS='-O3 -g -fverbose-asm -Wa,-adhln=$*.lst' make rnd10.o 
cc -O3 -g -fverbose-asm -Wa,-adhln=rnd10.lst -c -o rnd10.o rnd10.c 

有趣的事實:請doesn't even work with spaces in filenames,但你可以從別的shell擴展保護(如foo$(echo)_weirdname.c)與規則的構建命令部分單引號,並在CFLAGS。例如CFLAGS="-O3 -g "\'-Wa,-adhln=\$\*.lst\' make -B 'foo$(echo)weirdfil\\.o'