zhcn 编程语言 非公開: GCC -S 选项:编译非汇编文件

GCC -S 选项:编译非汇编文件

我们知道,从C和C++源代码生成可执行文件需要四个过程:预处理、编译、汇编和链接。其中“ GCC -E选项:预处理源程序”一节以demo.c源程序文件为例,使用GCC进行预处理操作,并转换相应的demo.i预处理文件。产生 。

[root@bogon demo]# cat demo.c
#include <stdio.h>
int main() {
放(“你好,世界!”);
返回 0。
}
[root@bogon demo]# gcc -E demo.c -o demo.i
[root@bogon 演示]# ls
演示.c 演示.i

基于此,本节介绍如何将获得的预处理文件编译并重新处理成相应的汇编文件。

gcc -S 命令

编译是整个程序构建的核心,也是最复杂的部分之一。所谓编译,简单理解,就是将预处理得到的程序代码,经过一系列词法分析、句法分析、语义分析和优化,处理成当前机器支持的汇编代码。

通过在gcc命令中添加-S(大写)选项,GCC编译器直到编译阶段都可以只处理指定的文件,并生成相应的汇编代码文件。例如:

[root@bogon demo]# gcc -S demo.i
[root@bogon 演示]# ls
demo.c demo.i demo.s

你会看到 gcc -S 命令生成了一个名为 demo.s 的文件,这是一个编译好的汇编代码文件。即默认情况下,编译操作会创建一个与指定文件同名、后缀为.s的新文件,并将编译结果保存到该文件中。

当然,如果您愿意,也可以在 gcc -S 命令中添加 -o 选项,让 GCC 编译器将编译结果保存到您指定的文件中。例如:

[root@bogon demo]# gcc -S demo.i -o test.i
[root@bogon 演示]# ls
demo.c demo.i demo.s test.i

注意,gcc -S 命令操作的文件不必是预处理过的.i 文件。 -S 选项的作用是强制GCC 编译器处理指定的文件,直到编译阶段结束。这意味着 gcc -S 命令不仅可以操作源代码文件,还可以操作预处理的 .i 文件。

  • 如果操作对象是.i文件,GCC编译器只需要编译该文件即可。
  • 如果操作对象是.c或.cpp源代码文件,GCC编译器分两步进行预处理和编译。

因此,如果想直接获取demo.c文件对应的汇编文件,可以使用gcc -S命令。

[root@bogon demo]# gcc -S demo.c -o demo.s
[root@bogon 演示]# ls
演示.c 演示.s

因此,可以直接获取demo.c对应的demo.s汇编文件。

对于最终生成的.s汇编文件,有兴趣的读者可以运行cat demo.s命令查看文件内容。基于此,如果您想提高文件中汇编代码的可读性,可以使用 -fverbose-asm 选项。 GCC 编译器会自动向您的汇编代码添加必要的注释。例如:

[root@bogon demo]# gcc -S demo.c -fverbose-asm

我们知道,从C和C++源代码生成可执行文件需要四个过程:预处理、编译、汇编和链接。其中“ GCC -E选项:预处理源程序”一节以demo.c源程序文件为例,使用GCC进行预处理操作,并转换相应的demo.i预处理文件。产生 。

[root@bogon demo]# cat demo.c
#include <stdio.h>
int main() {
放(“你好,世界!”);
返回 0。
}
[root@bogon demo]# gcc -E demo.c -o demo.i
[root@bogon 演示]# ls
演示.c 演示.i

基于此,本节介绍如何将获得的预处理文件编译并重新处理成相应的汇编文件。

gcc -S 命令

编译是整个程序构建的核心,也是最复杂的部分之一。所谓编译,简单理解,就是将预处理得到的程序代码,经过一系列词法分析、句法分析、语义分析和优化,处理成当前机器支持的汇编代码。

通过在gcc命令中添加-S(大写)选项,GCC编译器直到编译阶段都可以只处理指定的文件,并生成相应的汇编代码文件。例如:

[root@bogon demo]# gcc -S demo.i
[root@bogon 演示]# ls
demo.c demo.i demo.s

你会看到 gcc -S 命令生成了一个名为 demo.s 的文件,这是一个编译好的汇编代码文件。即默认情况下,编译操作会创建一个与指定文件同名、后缀为.s的新文件,并将编译结果保存到该文件中。

当然,如果您愿意,也可以在 gcc -S 命令中添加 -o 选项,让 GCC 编译器将编译结果保存到您指定的文件中。例如:

[root@bogon demo]# gcc -S demo.i -o test.i
[root@bogon 演示]# ls
demo.c demo.i demo.s test.i

注意,gcc -S 命令操作的文件不必是预处理过的.i 文件。 -S 选项的作用是强制GCC 编译器处理指定的文件,直到编译阶段结束。这意味着 gcc -S 命令不仅可以操作源代码文件,还可以操作预处理的 .i 文件。

  • 如果操作对象是.i文件,GCC编译器只需要编译该文件即可。
  • 如果操作对象是.c或.cpp源代码文件,GCC编译器分两步进行预处理和编译。

因此,如果想直接获取demo.c文件对应的汇编文件,可以使用gcc -S命令。

[root@bogon demo]# gcc -S demo.c -o demo.s
[root@bogon 演示]# ls
演示.c 演示.s

因此,可以直接获取demo.c对应的demo.s汇编文件。

对于最终生成的.s汇编文件,有兴趣的读者可以运行cat demo.s命令查看文件内容。基于此,如果您想提高文件中汇编代码的可读性,可以使用 -fverbose-asm 选项。 GCC 编译器会自动向您的汇编代码添加必要的注释。例如:

[root@bogon demo]# gcc -S demo.c -fverbose-asm