【发布时间】:2011-12-22 17:46:05
【问题描述】:
如何使用 gcc 编译为程序集而不是可执行文件。我知道有一个 -S 标志,但是我在 makefile 中的什么地方使用它。例如,如果我使用标志 -O3 -o exe_name,我应该将 -S 标志放在哪里?
【问题讨论】:
-
你的意思是目标文件而不是程序集?
如何使用 gcc 编译为程序集而不是可执行文件。我知道有一个 -S 标志,但是我在 makefile 中的什么地方使用它。例如,如果我使用标志 -O3 -o exe_name,我应该将 -S 标志放在哪里?
【问题讨论】:
您可以要求 GCC 生成程序集文件,而不是目标文件(或可执行文件)。
例如:
gcc -Wall -c test.c
将从 test.c (test.o) 生成一个目标文件。
gcc -Wall -o test test.c
将从 test.c 中生成一个名为“test”的可执行文件
gcc -Wall -S test.c
将从 test.c (test.s) 生成一个汇编文件
【讨论】:
-S 的文档说Stop after the stage of compilation proper; do not assemble.
几乎可以放在任何地方。
gcc -O3 -S -o output.asm ...
将生成的程序集存储在output.asm。
【讨论】:
-S 写类似filename.s 所以我认为-o 参数是不必要的
我建议也使用-fverbose-asm,因为生成的汇编程序有一些生成的 cmets 可以“解释”代码。例如:
gcc -S -fverbose-asm -O2 foo.c
将在foo.s(带有一些cmets)中生成通过编译foo.c产生的汇编代码
要了解 GCC 优化的作用,甚至可以尝试 -fdump-tree-all(但这会产生 数百 个文件!)。
【讨论】: