LinuxGCC如何实现代码编译汇编链接过程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LinuxGCC如何实现代码编译汇编链接过程
正⽂:
每次我们程序员所写的代码是给程序员看的呢?还是给电脑看的?其实我们所写的代码只是我们程序员之间交流的⼀样特殊语⾔,电脑是看不懂的。
那么我们如何实现⼈机交流呢?这就不得不请出我们我们今天的主⾓⼈机交换的桥梁---编译器,编译器有很多,我们今天介绍的是⼀种基于 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 为后缀的。
======================(完)===================。