繁体   English   中英

gcc -c 对 GCC -S 标志有什么用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM