2016-09-06 57 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'