我想分析我正在编译的C程序的汇编输出。
为了启用GCC保存临时文件,我在编译时添加了-save-temps
选项。
在另一个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)
答案 0 :(得分:1)
相关:How to remove "noise" from GCC/clang assembly output?:许多方法可以使编译器asm输出更容易阅读。
-Wa,xyz=FILE
在正常输出旁边生成额外输出文件。它与-save-temps
正交。如果要将其转到文件,则需要在命令行上输出额外的输出文件名。
e.g。在Makefile pattern rule中:
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -Wa,-adhln=$*.lst $< -o $@
将它放在一个名为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=$*.lst
添加到CFLAGS
即可,而不是覆盖模式规则。这仍然只适用于使用Make的构建系统,而不适用于最终不会生成Makefile的替代品(例如scons
),因为$*
扩展到模式规则的主干是特定的制作。它也只适用于Make模式规则,而不适用于明确的foo.o : foo.c foo.h
样式规则。
e.g。
$ 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,但您可以使用规则的构建命令部分和CFLAGS中的单引号来保护shell扩展(如foo$(echo)_weirdname.c
)。例如CFLAGS="-O3 -g "\'-Wa,-adhln=\$\*.lst\' make -B 'foo$(echo)weirdfil\\.o'