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

[root@bogon demo]# ls
demo.c
[root@bogon demo]# cat demo.c
#include <stdio.h>
int main(){
   puts("Hello,World!");
   return 0;
}
[root@bogon demo]# gcc -E demo.c -o demo.i
[root@bogon demo]# ls
demo.c  demo.i
[root@bogon demo]# gcc -S demo.i
[root@bogon demo]# ls
demo.c  demo.i  demo.s

在此基础上,本节继续讲解如何对已得到的 dmeo.s 执行汇编操作,并得到相应的目标文件。所谓目标文件,其本质为二进制文件,但由于尚未经过链接操作,所以无法直接运行。

简单地理解,汇编其实就是将汇编代码转换成可以执行的机器指令。大部分汇编语句对应一条机器指令,有的汇编语句对应多条机器指令。相对于编译操作,汇编过程会简单很多,它并没有复杂的语法,也没有语义,也不需要做指令优化,只需要根据汇编语句和机器指令的对照表一一翻译即可。

通过为 gcc 指令添加 -c 选项(注意是小写字母 c),即可让 GCC 编译器将指定文件加工至汇编阶段,并生成相应的目标文件。例如:

[root@bogon demo]# gcc -c demo.s
[root@bogon demo]# 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 demo]# ls
demo.c  demo.i  demo.o  demo.s  test.o


需要强调的一点是,和 gcc -S 类似,gcc -c 选项并非只能用于加工 .s 文件。事实上,-c 选项只是令 GCC 编译器将指定文件加工至汇编阶段,但不执行链接操作。这也就意味着:

  • 如果指定文件为源程序文件(例如 demo.c),则 gcc -c 指令会对 demo.c 文件执行预处理、编译以及汇编这 3 步操作;
  • 如果指定文件为刚刚经过预处理后的文件(例如 demo.i),则 gcc -c 指令对 demo.i 文件执行编译和汇编这 2 步操作;
  • 如果指定文件为刚刚经过编译后的文件(例如 demo.s),则 gcc -c 指令只对 demo.s 文件执行汇编这 1 步操作。

注意,如果指定文件已经经过汇编,或者 GCC 编译器无法识别,则 gcc -c 指令不做任何操作。

gcc执行链接操作

得到生成目标文件之后,接下来就可以直接使用 gcc 指令继续执行链接操作,例如:

[root@bogon demo]# gcc democ.o -o democ.exe
[root@bogon demo]# ./democ.exe
Hello,World!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值