GCC使用额外信息保存临时输出

时间:2016-09-06 08:29:50

标签: c gcc assembly

我想分析我正在编译的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)

1 个答案:

答案 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'