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 运行档. # 在 ...
随机推荐
- BaseDAL数据层基类1
/// <summary> /// EF数据库操作基类 /// </summary> /// <typeparam name="T"></ ...
- 软工读书笔记 week 6 ——《疯狂的程序员》Part 1
这本小说以主人公绝影上大学后初次接触编程开始讲起,这周主要看的就是绝影还在大学的那段经历,虽然故事背景很多年前,但很多地方仍然会引发我的共鸣. 第一个梦想 在“第一个梦想”一节讲了作业布置做一个通讯录 ...
- paypal文档
https://blog.csdn.net/daily886/article/details/73164643?ref=myread.
- 5.FileWriter 和 BufferWriter
FileWriter 和 BufferWriter的使用场景 IO这块,各种Writer,Reader,让人眼晕 而在网上基本找不到在什么时候用哪个类,并且网上的IO demo 很多用法都是错的 在 ...
- beautifulsoup之CSS选择器
BeautifulSoup支持大部分的CSS选择器,其语法为:向tag或soup对象的.select()方法中传入字符串参数,选择的结果以列表形式返回. tag.select("string ...
- Oracle EBS 报错:此责任无可用函数。 更改责任或与您的系统管理员联系。
解决:修改配置文件 1.FND: Diagnostics (FND:诊断) 启用设为”是” 2.Utilities:Diagnostics (公用程序 ...
- [微信] 客服接口调用的时候返回 40003 Invalid OpenID
首先确认收件人在24小时内主动向公众号发过消息.该消息的 FromUserId 即是客服消息的 touser 参数的 OpenId 2017-05-19 更新:可以使用UTF-8了 string ur ...
- Oracle诊断工具 - ORA-2730x Troubleshooting Tool
通常情况下,ORA-27300 ORA-27301 ORA-27302错误的原因是操作系统的系统调用错误或者操作系统配置问题,错误格式:ORA-27300: OS system dependent o ...
- SweetAlert插件 弹框插件
sweetalert是一个漂亮的弹窗 中文网址: http://mishengqiang.com/sweetalert/ 它需要2个文件:sweetalert-dev.js和sweetalert.cs ...
- Beautifulsoup模块安装之pip命令
1.在python引用 BeautifulSoup >>>from bs4 import BeautifulSoup 发现没有该模块 2.Linux输入 # pip install ...