[英]is there any use for GCC -S flag with gcc -c
我想知道在我的 Makefile 中使用-S
GCC 选项是否有任何好处。
一段时间以来,我一直在编译如下所示的 C 文件:
gcc -c a.c -o a.o
gcc -c b.c -o b.o
---
gcc a.o b.o -o a.out
现在会更好吗:
gcc -S a.c -o a.s
gcc -S b.c -o b.s
---
gcc -c a.s -o a.o
gcc -c b.s -o b.o
---
gcc a.o b.o -o a.out
显然也可以选择跳过.o
阶段,直接将.s
文件组装成二进制文件。 您认为哪个选项是最好的,为什么?
-S
标志要求 gcc 生成人类可读的汇编代码 - .o 文件对于链接器来说很好,但对大多数人来说却很神秘......
它主要用于需要对已通过分析确定为瓶颈的(短)代码段进行低级优化时。 您可以比较编译器如何翻译各种版本,并选择能够为该特定实现提供最高效机器代码的版本。
它不打算在标准 makefile 中使用。
显然也可以选择跳过
.o
阶段,直接将.s
文件组装成二进制文件。
普通汇编永远不会直接转换为可执行的二进制代码,总是在中间目标文件步骤中。
gcc a.s b.s -o ab.exe
将始终调用为任一单元生成目标代码的汇编程序(两次),然后链接对象。 在命令行中添加-v
以查看gcc
执行了哪些子命令。 gcc
实际上并不是一个编译器,它只是一个根据选项和文件扩展名调用作业的驱动程序。 正确的编译器是cc1
(用于 C 代码)、 cc1plus
(用于 C++ 代码)等。
您认为哪个选项是最好的,为什么?
-S
具有生成汇编代码的优势,但是编译器将始终生成汇编代码作为中间步骤。 它只是写入临时文件的情况,有两个明显的例外:
-save-temps
:这不会使用一些临时文件名(例如在/tmp
),而是将中间代码与对象保存在同一位置(实际上有两种风格, -save-temps=obj
和-save-temps=src
)。
-pipe
:这将使用管道将代码从一个 sup 程序传输到下一个而不是文件(除了-save-temps
使-pipe
无效)。
因此,如果您想查看生成的程序集, -save-temps
可能是您要走的路。 但是,该选项也适用于保存在.i
用于 C) .ii
用于 C++)和.s
用于汇编)的预处理代码。 这在使用 C 宏时通常非常受欢迎。
如果您打算检查编译器生成的程序集,您可能会喜欢-fverbose-asm
,它会注入指示与程序集关联的 C/C++ 源代码的 asm 注释。 在这种情况下,最好不要用调试信息来混淆程序集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.