linux上C语言的编译流程

本文将介绍如何从C/C++文本到二进制可执行文件的过程。该过程需要经过预处理->编译->链接三个步骤,文件内容从普通文本->汇编->二进制的变化。

预处理(Preprocessing)
编译(Compilation)
汇编(Assembly)
链接(Linking)

预处理概念:
预处理是在程序源代码被编译之前,由预处理器(Preprocessor)对程序源代码进行的处理。这个过程并不对程序的源代码语法进行解析,但它会把源代码分割或处理成为特定的符号为下一步的编译做准备工作。

详细讲解可见:https://www.cnblogs.com/zhjblogs/p/13646399.html

编译的概念:
这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。

汇编的概念:
汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。

链接的概念:
链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。

以下面的代码main.c为例,讲解整个编译流程

#include “stdio.h”

int main() {
	printf("hello world!");
	return 0;
}
  1. 使用 gcc -E -I./inc main.c -o main.i 命令编译main.c得到main.i,可以看到main.i远大于main.c的大小,这是因为预处理对原文件做了切割等处理。
    在这里插入图片描述

  2. 使用 gcc -S -I./inc main.c -o main.s 可以编译原文件得到其汇编语言编写的程序,下面为其程序的内容。
    在这里插入图片描述

  3. 使用 gcc -c main.s -o main.o 命令将汇编变为二进制表示

  4. 使用 下面命令行将程序链接为最后的可执行程序a.out
    ld -o a.out -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccjWjkjI.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. main.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o

该命令是使用g++ -v main.o,在collector2后得到的
在这里插入图片描述

  1. 执行a.out得到结果如下
    在这里插入图片描述

参考:
[1] https://www.cnblogs.com/knife-king/p/11090029.html
[2] https://cloud.tencent.com/developer/article/1401978
[3] How to link C++ object files with ld.stackoverflow

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值