zhcn 编程语言 GCC -c 选项:生成目标文件

GCC -c 选项:生成目标文件

我们知道,从C和C++源代码生成可执行文件需要四个过程:预处理、编译、汇编和链接。

GCC -E 选项:预处理源程序部分以 demo.c 源文件为例,展示如何预处理源文件并生成相应的demo.i 预处理文件。汇编文件部分向您展示如何编译 demo.c 或 demo.i 并生成相应的 demo.s 汇编代码文件。

[root@bogon 演示]# ls
演示程序.c
[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
[root@bogon demo]# gcc -S demo.i
[root@bogon 演示]# ls
demo.c demo.i demo.s

基于以上,我们将解释如何对获得的dmeo.s进行汇编操作,并获得相应的目标文件。所谓目标文件本质上是二进制文件,但它们没有链接,不能直接执行。

gcc -c 命令

简单理解,汇编实际上是将汇编代码转换为可执行的机器语言指令。大多数汇编语句对应于一种机器语言指令,有些汇编语句对应于多种机器语言指令。相比编译操作,汇编过程要简单得多,没有复杂的语法或语义,不需要指令优化,只需要根据汇编语句和机器指令对照表一一转换即可。

通过在gcc命令中添加-c选项(注意小写的c),GCC编译器可以将指定的文件处理到汇编阶段,并生成相应的目标文件。例如:

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

您可以看到该指令生成了一个与 demo.s 同名但扩展名为 .o 的文件。这是通过汇编操作获得的目标文件。

当然,如果您愿意,也可以在 gcc -c 命令中添加 -o 选项,将汇编操作的结果输入到指定文件中。例如:

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

请注意,与 gcc -S 一样,gcc -c 选项不限于处理 .s 文件。事实上,-c选项仅使GCC编译器处理指定文件直至汇编阶段,但不执行任何链接操作。这也意味着:

  • 如果指定的文件是源程序文件(如demo.c),则gcc -c命令会执行三个步骤:预处理、编译和汇编demo.c文件。
  • 如果指定的文件是刚刚经过预处理的文件(例如demo.i),则gcc -c命令执行两个步骤:编译和汇编demo.i文件。
  • 如果指定的文件是刚刚编译的文件(如demo.s),则gcc -c命令只执行一步,编译demo.s文件。

请注意,如果指定的文件已汇编或 GCC 编译器无法识别该文件,则 gcc -c 命令不会执行任何操作。

本节以demo.c、demo.i、demo.s为例,演示gcc -c命令的功能。

[root@bogon 演示]# ls
demo.c demo.i demo.s
[root@bogon demo]# gcc -c demo.c -o democ.o
[root@bogon 演示]# ls
demo.c demo.i democ.o demo.s
[root@bogon demo]# gcc -c demo.i -o demoi.o
[root@bogon 演示]# ls
demo.c demo.i demoi.o democ.o demo.s
[root@bogon demo]# gcc -c demo.s -o demos.o
[root@bogon 演示]# ls
demo.c demo.i demoi.o democ.o demo.s demos.o

上述操作生成的demo.o、demoi.o、demos.o包含完全相同的二进制内容,但文件名不同。

gcc 执行链接操作

一旦生成了目标文件,就可以直接使用 gcc 命令进行链接操作。例如:

[root@bogon demo]# gcc democ.o -o democ.exe
[root@bogon 演示]# ./demo.exe
你好世界!
[root@bogon demo]# gcc demoi.o -o demoi.exe
[root@bogon 演示]# ./demoi.exe
你好世界!
[root@bogon demo]# gcc demos.o -o demos.exe
[root@bogon 演示]# ./demos.exe
你好世界!

由于gcc根据指定文件的后缀.o自动判断这样的文件是目标文件,应该只进行链接操作,所以gcc这里的步骤是:仅对demo.o、demoi.o和demos进行链接操作。 .i 生成三个可执行文件:分别是 democ.exe、demoi.exe 和 demos.exe。

当您运行这三个可执行文件中的每一个时,结果完全相同,这提供了 democ.o、demo.io 和 demos.o 包含相同二进制内容的侧面验证。

我们知道,从C和C++源代码生成可执行文件需要四个过程:预处理、编译、汇编和链接。

GCC -E 选项:预处理源程序部分以 demo.c 源文件为例,展示如何预处理源文件并生成相应的demo.i 预处理文件。汇编文件部分向您展示如何编译 demo.c 或 demo.i 并生成相应的 demo.s 汇编代码文件。

[root@bogon 演示]# ls
演示程序.c
[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
[root@bogon demo]# gcc -S demo.i
[root@bogon 演示]# ls
demo.c demo.i demo.s

基于以上,我们将解释如何对获得的dmeo.s进行汇编操作,并获得相应的目标文件。所谓目标文件本质上是二进制文件,但它们没有链接,不能直接执行。

gcc -c 命令

简单理解,汇编实际上是将汇编代码转换为可执行的机器语言指令。大多数汇编语句对应于一种机器语言指令,有些汇编语句对应于多种机器语言指令。相比编译操作,汇编过程要简单得多,没有复杂的语法或语义,不需要指令优化,只需要根据汇编语句和机器指令对照表一一转换即可。

通过在gcc命令中添加-c选项(注意小写的c),GCC编译器可以将指定的文件处理到汇编阶段,并生成相应的目标文件。例如:

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

您可以看到该指令生成了一个与 demo.s 同名但扩展名为 .o 的文件。这是通过汇编操作获得的目标文件。

当然,如果您愿意,也可以在 gcc -c 命令中添加 -o 选项,将汇编操作的结果输入到指定文件中。例如:

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

请注意,与 gcc -S 一样,gcc -c 选项不限于处理 .s 文件。事实上,-c选项仅使GCC编译器处理指定文件直至汇编阶段,但不执行任何链接操作。这也意味着:

  • 如果指定的文件是源程序文件(如demo.c),则gcc -c命令会执行三个步骤:预处理、编译和汇编demo.c文件。
  • 如果指定的文件是刚刚经过预处理的文件(例如demo.i),则gcc -c命令执行两个步骤:编译和汇编demo.i文件。
  • 如果指定的文件是刚刚编译的文件(如demo.s),则gcc -c命令只执行一步,编译demo.s文件。

请注意,如果指定的文件已汇编或 GCC 编译器无法识别该文件,则 gcc -c 命令不会执行任何操作。

本节以demo.c、demo.i、demo.s为例,演示gcc -c命令的功能。

[root@bogon 演示]# ls
demo.c demo.i demo.s
[root@bogon demo]# gcc -c demo.c -o democ.o
[root@bogon 演示]# ls
demo.c demo.i democ.o demo.s
[root@bogon demo]# gcc -c demo.i -o demoi.o
[root@bogon 演示]# ls
demo.c demo.i demoi.o democ.o demo.s
[root@bogon demo]# gcc -c demo.s -o demos.o
[root@bogon 演示]# ls
demo.c demo.i demoi.o democ.o demo.s demos.o

上述操作生成的demo.o、demoi.o、demos.o包含完全相同的二进制内容,但文件名不同。

gcc 执行链接操作

一旦生成了目标文件,就可以直接使用 gcc 命令进行链接操作。例如:

[root@bogon demo]# gcc democ.o -o democ.exe
[root@bogon 演示]# ./demo.exe
你好世界!
[root@bogon demo]# gcc demoi.o -o demoi.exe
[root@bogon 演示]# ./demoi.exe
你好世界!
[root@bogon demo]# gcc demos.o -o demos.exe
[root@bogon 演示]# ./demos.exe
你好世界!

由于gcc根据指定文件的后缀.o自动判断这样的文件是目标文件,应该只进行链接操作,所以gcc这里的步骤是:仅对demo.o、demoi.o和demos进行链接操作。 .i 生成三个可执行文件:分别是 democ.exe、demoi.exe 和 demos.exe。

当您运行这三个可执行文件中的每一个时,结果完全相同,这提供了 democ.o、demo.io 和 demos.o 包含相同二进制内容的侧面验证。