前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gcc 编译一个应用程序的四个过程

gcc 编译一个应用程序的四个过程

作者头像
我与梦想有个约会
发布2023-10-21 14:12:29
2080
发布2023-10-21 14:12:29
举报
文章被收录于专栏:jiajia_deng

还是 2015 年学过的知识,这么久不用忘差不多了。本文主要记录一下方便以后查阅并加深印象。gcc 编译一个程序的四个过程分别是 预处理->汇编->编译->链接,预处理一般是导入一些头文件的信息及一些宏的替换等等,汇编是将代码编译为汇编代码,真正到编译过程才是把汇编代码编译为二进制的文件,最后链接是链接一些函数所需的库文件。以下是分布执行对应步骤的命令。

2016-03-06_133242
2016-03-06_133242

预处理 -E

代码语言:javascript
复制
gcc -E main.c -o main.i

使用 -E 命令对代码做预处理以后,代码所包含的头文件和一些宏就已经被替换到源代码中了,vim 看一下预处理后的 mian.i,就是如下状态。

代码语言:javascript
复制
....................
837 # 2 "main.c" 2
838 
839 int main(int argc, char* argv[])
840 {
841  printf("Hello main.c\n");
842  return 0;
843 }

我们可以看到已经有 800 多行代码了,实际是 #include 包含的一些文件的信息也导入了进来。

汇编 -S

汇编的过程是将预处理后的代码转换为汇编代码。

代码语言:javascript
复制
gcc -S main.i -o main.s

使用 -S 参数后,代码就被转换为汇编代码了。如下所示:

代码语言:javascript
复制
 1     .file   "main.c"
 2     .section    .rodata
 3 .LC0:
 4     .string "Hello main.c"
 5     .text
 6     .globl  main
 7     .type   main, @function
 8 main:
 9 .LFB0:
10     .cfi_startproc
11     pushq   %rbp
12     .cfi_def_cfa_offset 16
13     .cfi_offset 6, -16
14     movq    %rsp, %rbp
15     .cfi_def_cfa_register 6
16     subq    $16, %rsp
17     movl    %edi, -4(%rbp)
18     movq    %rsi, -16(%rbp)
19     movl    $.LC0, %edi
20     call    puts
21     movl    $0, %eax
22     leave
23     .cfi_def_cfa 7, 8
24     ret
25     .cfi_endproc
26 .LFE0:
27     .size   main, .-main
28     .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
29     .section    .note.GNU-stack,"",@progbits

编译 -c

编译的过程是将汇编后的代码转换为二进制的代码。

代码语言:javascript
复制
gcc -c main.s -o main.o

这个时候 main.o 里面的内容就已经是纯二进制的结构了,再用 vim 看就没什么意义了,只能看到一堆乱码。

链接

最后一步就是将已经编译好的二进制文件链接对应的库,比如我们用到了 printf 函数,那该函数的实现在哪个库里面我们就要去链接,否则程序是无法运行的。

代码语言:javascript
复制
gcc main.o -o main

链接后最终生成的就是可执行文件了。以上就是使用 gcc 编译一个源文件的整体过程。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 预处理 -E
  • 汇编 -S
  • 编译 -c
  • 链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档