【问题标题】:GCC save temporary output with extra informationGCC 使用额外信息保存临时输出
【发布时间】:2016-09-06 08:29:50
【问题描述】:

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

【问题讨论】:

  • 试试-fverbose-asm
  • 有关使 asm 输出具有人类可读性的更多提示,另请参阅:How to remove “noise” from GCC/clang assembly output?
  • 好的,我认为它有帮助。谢谢!
  • -a 选项仅适用于汇编程序。它不会改变 GCC 的汇编输出。它会影响汇编器生成的汇编列表文件,该文件是汇编输入的格式化版本,显示汇编器生成的机器代码。

标签: c gcc assembly


【解决方案1】:

相关:How to remove "noise" from GCC/clang assembly output?:许多使编译器 asm 输出更易于阅读的方法。


-Wa,xyz=FILE 在正常输出旁边生成一个 extra 输出文件。它与-save-temps 正交。如果你想让它转到一个文件,你确实需要在命令行中添加一个额外的输出文件名。

例如在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。它也仅适用于 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,但您可以在规则的构建命令部分和 CFLAGS 中使用单引号防止任何其他内容(如 foo$(echo)_weirdname.c)的 shell 扩展。例如CFLAGS="-O3 -g "\'-Wa,-adhln=\$\*.lst\' make -B 'foo$(echo)weirdfil\\.o'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2021-04-08
    • 2016-10-21
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多