Linux | GCC如何实现代码编译&&汇编&&链接过程
正文:
每次我们程序员所写的 代码 是给程序员看的呢?还是给电脑看的?其实我们所写的代码只是我们程序员之间交流的一样特殊语言,电脑是看不懂的。那么我们如何实现人机交流呢?这就不得不请出我们我们今天的主角人机交换的桥梁---编译器,编译器有很多,我们今天介绍的是一种基于 Linux 系统的 GCC 编译器,以下代码都是在 Linux 系统上 VI 编辑器代码 GCC 编译代码实现的。
1、GCC概述
通常我们所写的代码无论 C \ C++ 等一些高级语言其实电脑是识别不了的。代码只是我们程序员人与人之间交流的一种特殊语言 ,GCC 起初的全名是 GUN C Comlier 通俗的来说 GCC 编译器就好比是翻译官,把我们程序员写的代码翻译成电脑识别的机器语言。随着 GCC 编译器的功能不断强大,支持的语言越来越多,他的名称就变成了 GUN Comlier Collection 也称编译组织,里面包含了许多的“ 工作成员 ”,接下来我们就来看看 GCC 编译器里的成员( 编译、汇编、链接 )是怎么分工合作实现人机交互编译的。
2、编译
什么是编译?我们通过在Linux终端创建一个 点C 文件, 输入「gcc -v -o test1 test_1.c」打开文件我们可以看到一堆的英文,

先别慌,不要觉得看不懂,我们只看有用的重点,看到白色背景的方框我们可以看见,所谓编译就是「/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -o xxx.s test_1.c」里 cc1 把我们的 .C 输入文件编译成 xxx.S 的输出文件

是不是我们每次编译都要输入这么一大段的文字呢?不用,我们只要用简洁的办法「gcc -S」( S是大写的 )这个命令等价于上面的那一段字母命令来输出就可以。这样就得到一个 xxx.s 的输出文件,代码如下图:

这个还是我们程序员之间交流的另一种语言(汇编语言),但是这样的文件计算机还是不认识,所以我们还的继续下一步。
3、汇编
所谓汇编就是把上面的 .s 作为输入文件从而得到 .o 输出文件,我们同样也可以用简便的命令「gcc -c」可以得到,其实这个命令是间接的调用实现把 .c 编到 .s 再到 .o这么一个过程,也就是「gcc -c」就是会主动的先实现编译再汇编,这个时候代码已经编译成二进制文件了,如下图:

哈哈哈···是不是看不懂?看不懂就对了,这是给电脑看的,但是这时候我们编译得到一个 .o 文件,好比一个组合机器人一样,我们需要把一堆的器件连接起来,才能成为一个完整的机器,所以这个时候我们需要调用链接器来吧所有的文件都连接起来。
4、链接
什么是链接?直接看图:

如图我们可以看到,我们需要的计算机能识别运行的文件名 test1 是由「/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 -o test1 xxx.o」编译出来,但是从图中我们还可以看出,后面的 .o 文件不止一个,而是一堆,为什么会有一堆呢?明明我们只是编译了一个。其实我们不用去管这一堆文件有多少什么个每一个是什么意思,我们找到我们编译的哪一个 test1.o 文件。我们要记住的一点就是,我们可以通过链接来让我们上面 编译、汇编出来的文件和其他库文件连起来才能使 test1 文件运行,所以最终我们得到的计算机能识别运行的文件是 test1 文件,这就大功告成了。同样的,上面的命令太长了我们用一个简便「gcc -o」的命令来替代。
我们用 VI 编辑器写一个C语言输出 「hello world」的代码如图:

然后通过「 gcc -o test1 test_1.c」命令编译实现人机交互,代码如图:

其实 GCC 就像是一个集合,作为翻译组织来调用不同工具来为他服务从而实现了人机交换的语言编译器。由于GCC是非常智能人性化的,很多事情都给我省了。我们写完代码没必要按照上面复杂的步骤来实现编译,我们只要通过一个『 gcc -o 【输出文件名】 【输入的 .c 文件 】』一条命令就可以一步实现人机交互。
注意:gcc 编译对文件后缀名很敏感,如果是编译 C 语言必须是以 .c 为后缀的。
======================(完)===================
Linux | GCC如何实现代码编译&&汇编&&链接过程的更多相关文章
- GCC编译和链接过程
GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分.GCC原本作为GNU操作 ...
- C语言预处理 编译 汇编 链接四个阶段
c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接. 编译过程 编译过程又可以分成两个阶段:编译和会汇编. 编译 编译是读取源程序(字符流),对之进行词法和语法的分析,将高 ...
- <三>从编译器角度理解C++代码编译和链接原理
1代码 点击查看代码 **sum.cpp** int gdata=10; int sum(int a,int b){ return a+b; } **main.cpp** extern int gda ...
- Linux中程序的编译和链接过程
1.从源码到可执行程序的步骤:预编译.编译.链接.strip 预编译:预编译器执行.譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的. 编译: 编译器来执行.把源码.c .S编程机器码. ...
- C++, Java和C#的编译、链接过程解析
总是感觉java是解释性语言,转载下一篇感觉写的容易理解的文章 转自 http://www.cnblogs.com/rush/p/3155665.html 1.1.1 摘要 我们知道计算机不能直接理解 ...
- gcc 编译 汇编 链接
要想研究使用 gcc, gcc-multilib 这个包是一定要安装的, 它允许通过 -m32 和 -m64 选项来选择生成 32 位或者 64 的 ELF 文件. 我们知道程序的默认起点是 _sta ...
- C/C++程序编译流程(预处理->编译->汇编->链接)
程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内 ...
- 【Linux】【Jenkins】代码编译和执行过程中的问题汇总
1.问题1:java.io.FileNotFoundException: /root/.jenkins/workspace/Videoyi_AutoTest_Maven/config-log4j\lo ...
- Linux - gcc 的简易用法 (编译、参数与链结)
# 仅将原始码编译成为目标档,并不制作连结等功能: [root@www ~]# gcc -c hello.c # 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档. # 在 ...
随机推荐
- CSS 0.5px 细线边框的原理和实现方式
细线边框的具体实现方法有:伪元素缩放或渐变,box-shadow模拟,svg画线,border-image裁剪等.要实现小于1px的线条,有个先决条件:屏幕的分辨率要足够高,设备像素比要大于1,即cs ...
- 【转】Twitter Storm: 在生产集群上运行topology
Twitter Storm: 在生产集群上运行topology 发表于 2011 年 10 月 07 日 由 xumingming 作者: xumingming | 可以转载, 但必须以超链接形式标明 ...
- 风险管理,未雨绸缪——《代码之殇》读书笔记II
这次的内容主要是关于软件开发过程中的风险管理,包括项目用时估计.产品的发布与更新.承诺兑现的重要性. ①项目用时估计 有人会质疑项目用时估计的可靠性,因为就事而言,这次的任务可能和上次不一样了,开发环 ...
- 机器学习vs深度学习及其知识点
人工智能如火如荼,可以遇见这将会是近10年最大的创新机会.那么到底什么是人工智能? 机器学习和神经网络什么关系? 卷积神经网络中的矩阵内积是怎么计算的?
- 查看windows所有exe的启动参数。
在cmd中输入 wmicprocess 即可查看到所有进程的启动参数和运行参数.
- oracle使用索引和不使用索引性能分析
首先准备一张百万条数据的表,这样分析数据差距更形象! 下面用分页表数据对表进行分析,根据EMP_ID 字段排序,使用索引和不使用索引性能差距! sql查询语法准备,具体业务根据具体表书写sql语法: ...
- 用C#自定义一个简单的集合
闲来无聊来自己做了一个简单的'集合',用来加深自己对集合的理解 class listNode { private object value; public listNode(object _value ...
- 显示iOS所有系统字体
显示iOS所有系统字体 源码地址: https://github.com/YouXianMing/UI-Component-Collection 效果图: 便于你开发中寻找适合自己的字体, demo中 ...
- 将亚马逊aws的ec2服务器的登陆方式改为密码登陆
1.在用密钥登陆ec2后,为root用户创建密码: sudo passwd root 系统会让你输入两次密码 2.切换为root用户,并且编辑sshd_config文件,PasswordAuthent ...
- 铁乐学python_day01-和python有关的唠嗑
铁乐学python_day01-和python有关的唠嗑 文:铁乐与猫 2018-03-16 01_python的历史 python的创始人为荷兰人吉多·范罗苏姆(Guido van Rossum). ...