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 运行档. # 在 ...
随机推荐
- frame shiro 概述
权限管理 权限管理包括用户身份认证和授权两部分,简称认证授权. 身份认证包括用户口令登陆.指纹验证.刷卡等方式. 授权即访问控制,控制谁能访问哪些资源,主体身份认证后分配权限以访问自己可以访问的资源. ...
- Java中的Number和Math类简单介绍
Java Number类 一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等. 实例: int a = 5000; float b = 13.65 ...
- 团队开发心得(May)
经过之前一个多月的准备工作(包括去求调研.技术选型.知识储备等等),这个月开发工作终于步入正轨,下面谈谈我的心得体会. 个人收获方面,我选择了加入数据库小组,进行数据库方面的开发.刚开始的时候我是个小 ...
- top,job,user,file,alias
1.系统进程 2.系统资源管理 3.作业管理 4.用户管理 5.文件权限 6.别名定义 一.系统进程 1.进程的定义 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了 ...
- 转载:eclipse 搭建SSH项目(第二篇,有具体的项目例子)
原文地址:http://blog.csdn.net/yeohcooller/article/details/9316923 读博文前应该注意: 本文提纲:本文通过一个用户注册的实例讲解SSH的整合.创 ...
- Celery学习--- Celery 最佳实践之与django结合实现异步任务
django 可以轻松跟celery结合实现异步任务,只需简单配置即可 同步执行和异步执行 注意:即使Celery的任务没有执行完成,但是已经创建了任务ID.可以利用前台的定时任务发送Ajax异步请求 ...
- 映射函数map
映射函数map 语法: map(function, iterable) 迭代对象中 的每一个元素进行映射, 分别执行function函数 例子: ls =[1,2,3,4,5,6] def func ...
- Java基础面试题(进程和线程的区别)
进程和线程的区别 1.定义 进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更 ...
- Servlet 启动顺序
在servlet的配置当中,<load-on-startup>1</load-on-startup>的含义是: 标记容器是否在启动的时候就加载这个servlet. 当值为0或者 ...
- 使用MS的ScriptDom来拆解TSQL脚本
此处提供9.1.40413.0版本的DLL一共4个:Microsoft.Data.Schema.dll.Microsoft.Data.Schema.ScriptDom.dll.Microsoft.Da ...