本文将介绍如何从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

linux上C语言的编译流程相关推荐

  1. Linux上C语言程序编译过程详解

    点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 本文将介绍如何将高层的C/C++语言编写的程序转换 ...

  2. 文件系统层次结构标准和Linux上下载源代码配置编译安装

    一.文件系统层次结构标准 FHS_3.0 标准文档 /bin 存储一些二进制可执行命令文件, /usr/bin 也存放了一些基于用户的命令文件. /sbin 存储了很多系统命令, /usr/sbin ...

  3. c mysql linux,linux上C语言连接mysql

    linux下C语言连接mysql 环境:fedora16 1)安装:# yum install mysql mysql-devel   //mysql-devel同样需要安装,开发中要用到/usr/i ...

  4. (转)linux上nginx源码编译安装

    亲测有效: 转:  https://segmentfault.com/a/1190000007116797https://segmentfault.com/a/1190000007116797 ngi ...

  5. linux上安装osg_Linux下编译OSG全过程

    ziyan0621@126.com 在 Windows 下用 OSG 开发软件已经有了很长一段时间,最近由于有需要在 Linux 下开发一 套 3D 软件,所以查了一些 Linux 下 OSG 使用的 ...

  6. linux上c语言hdc句柄,控制台窗口的绘图

    最近和别人聊天,聊到了控制台绘图,曾经学了一些windows的API编程,却没想到直接在控制台窗口上进行绘图 今天有时间,便把代码写了出来 #include #include /*********** ...

  7. linux lzma c语言接口,编译squashfs和lzma

    编译squashfs和lzma 早年写的笔记,压箱底了,翻出来晒晒 目          录 南瓜文件系统(Squashfs)采用gzip或lamz(更高压缩率)来制作只读的映像文件.LZMA 是 7 ...

  8. linux 上 gcc -m32 编译报错解决方案

    最近在linux上使用gcc -m32 编译库时提示错误: /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4. ...

  9. linux怎么用gcc运行程序设计,linux应用程序设计--GCC程序编译

    GCC程序编译 linux系统下的GCC(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作之一.GCC可以在多种硬件平台上编译出可执行程序,其执行效率与一 ...

最新文章

  1. imp 只导入索引_使用imp导入表和索引至不同表空间方法
  2. Flex布局(一)flex-direction
  3. 李宏毅线性代数11: 正交(Orthogonality)
  4. python数学建模可视化_数学建模之流程图和数据可视化
  5. 追寻终极数据库 - 事务/分析混合处理系统的交付挑战 (3)
  6. 基于GDAL库,读取海洋风场数据(.nc格式)c++版
  7. android cydia使用教程,Android Hook工具Cydia Substrate使用
  8. [leetcode]5340. 统计有序矩阵中的负数
  9. Everyting 文件查找工具
  10. DataFormatString 的使用
  11. H5音乐播放器skPlayer,已支持拉取网易云音乐歌单。
  12. 2021数学建模B题详细思路
  13. 从单体式架构迁移到微服务架构
  14. gym101908 C. Pizza Cutter(平面几何欧拉定理,树状数组求逆序对)
  15. 祝朋友生日前程似锦的句子:愿未来锦上添花
  16. 《微机原理第五版》期末知识总结(第五章---第七章)
  17. win10+node@16 安装特定版本 node-sass
  18. Leetcode-“二分查找”-爱吃香蕉的珂珂
  19. EAI技术和概念解析
  20. 互联网那些事儿!4年前 VS 4年后

热门文章

  1. java为什么项目中需要使用接口
  2. OCR - 微软windows 11系统自带的Windows OCR功能初体验
  3. 工业机器人用铸铁牌号_铸铁材料牌号国际对照表
  4. 【Leetcode】122. Best Time to Buy and Sell Stock II买卖股票的最佳时机 II
  5. HDC2021技术分论坛:吐司盒子?芝士码?HarmonyOS音视频测试来啦
  6. 公开课《夏季服装秀》_荔枝班_新浪博客
  7. 5G手机已经成主流_Android5g手机为5种不同状态的5G手机做准备
  8. 当电子工程师十余年,感慨万千!
  9. telnet命令详解及使用示例
  10. linux-node后台启动