编译工具集详解(一)| 学习笔记

简介: 快速学习编译工具集详解。

开发者学堂课程【剑池系列开发工具 :编译工具集详解(一)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/734/detail/13097


编译工具集详解(一)

 

内容介绍:

一、 编译原理简介

二、 预编译

三、 编译

四、 汇编

五、 链接

六、 BINUTILS 简介

七、Q&A

 

一、编译原理简介

原理和编译过程,编译编译器,编译工具主要负责就是把编译语言,翻译成机器语言。中间有很多的过程,如下图,

image.png

首先将一个 c 语言或者高级语言的东西通过预编译,生成一个预编译之后的一个文件,编译是将一些宏定义展开之类,在编程汇编代码,汇编代码后会通过汇编辑将它给翻译成机器代码,但因为是多个 c 文件在编译,翻译成一个 object 文件,可能是一个单独的文件,要再通过链接去加上一些依赖库,然后将它合起变成最后的可执行程序。这是大概的过程。在讲接内容之前,先讲一下工具链,就是套件的一个分类,大概包含哪些东西,工具一般包含两部分,两个分类,一个是针对裸程序或者实时操作系统项目类的实际操作系统,一个称为 elf 的一个工具链,有九系列的处理器,有八系列的处理器,还有对应的系列,程序类的套件,也有九和八系列的两套。然后讲一些通用的一些编译知识跟开发技巧,以某一个编译套件作为举例,以 elf 工具举例来讲一下,所有的知识内容都是适用于一般,适用于所有工具,所以可以去举一反三。

image.png

编译过程有很多,可以通过两个选项看到编译过程的一些具体的编译器拆分出来的一些行为,也可以保留看到编译过程产生的一个中间文件,因为直接不加任何选项,直接去编 gcc 或者其他,会将一些中间文件存在临时文件夹。编译完成之后就删掉了,是看不到中间文件的,两个选项,一个是 -save-temps,是用来保留中间文件用的,还有一个选项是 -v,是将中间的一些命令给打印出来。模拟了一个例子,加了两个选项,可以看到生成的文件是输入文件是main.c,生成的文件第一个是 main.i,它就是我们预处理结果的一个文件。main.s,他是一个汇编文件,main.o,它是一个 object 文件。它是一个链接生成的 a.out,是一个可执行文件。最后一个图它就是一个 -v 出来的一个结果。第一个命令大家可以看到它就是 main.i 的一个命令。是用到的预编译命令。第二个命令就是编译汇编,生成汇编文件的命令,其实是编译编译套件里面的一个核心,就是生成翻译,从高级语言翻译到汇编语言,生成的汇编指令编码,第三个是汇编器,将汇编指令编成二进制代码,最后一个比较长的是链接命令。

image.png

 

二、预编译

预编译过程例子如下:

image.png

可以看到左边是一个非常简单的一个代码。右边引用两个头文件,定义了个宏,宏定义的一个头文件里值就是刚看到的预编译命令,可以将它翻译成一个预编译之后的结果,会将宏展开,最重要的是原来 c 文件里面的 test 开头的宏,之后变成定义在头文件里面的1520,是可以直接看到的,如果有哪些小伙伴平时定义了很多宏,但不知道到底自己最后用的是哪个宏,可以推荐这种方法,就可以看到最后到底被编辑成哪个宏,又调用一个 printf 函数,是需要include〈stdio.h〉的。右边就会有 include 进来函数的一个声明。这是一个预编译过程,接下来是预编译的一些常用的选项,

第一个是 -D,可以通过命令去定义宏,第二个是可以将一个宏通过 -d 定义一个值,最后一个是 undef,相当于在头文件将定义取消。最后一个忽略它。

image.png

可能会用到的是预定义的宏,另一种说法是编译器内置的一些宏,写一些跨平台的代码,有些代码是可以用的,比方说有些代码视频 arm 用的是编译器会提供这样的宏,去区分到底是用的哪个编译器?地方到底有多少的内置的宏可以用,可以通过这么一个选项去输出编辑所有的内置宏,主体是 -dm,-e,假设输入文件为空,导进去一个 null,是输入文件为空,最后会在终端输出所有的内置宏,包括一些数据长度之类的,很多的内置宏,一般都是以两个下划线开头的内置宏,会写一些代码,可能是平头哥处理器的芯片,包括902,906都能用的一段代码,也会有这样的一个宏去使用,如果用到可以输出一些内置宏。以上是预编译的部分。

image.png

相关文章
|
Ubuntu Linux Windows
Linux源码阅读工具:ctags
Linux源码阅读工具:ctags
152 0
|
自然语言处理 编译器 Linux
【Linux篇】第十一篇——动静态库(动静态库的介绍+动静态库的打包与使用)
【Linux篇】第十一篇——动静态库(动静态库的介绍+动静态库的打包与使用)
【Linux篇】第十一篇——动静态库(动静态库的介绍+动静态库的打包与使用)
|
Java 编译器 Linux
编译工具集详解(三)| 学习笔记
快速学习编译工具集详解。
231 0
编译工具集详解(三)| 学习笔记
|
存储 编译器 开发工具
编译工具集详解(二)| 学习笔记
快速学习编译工具集详解。
93 0
 编译工具集详解(二)| 学习笔记
|
缓存 NoSQL 搜索推荐
第三课(二)|学习笔记
快速学习第三课(二)
94 0
第三课(二)|学习笔记
|
运维 算法 Cloud Native
第三课(三)|学习笔记
快速学习第三课(三)
142 0
第三课(三)|学习笔记
|
存储 SQL 算法
第六课(二)|学习笔记
快速学习第六课(二)
92 0
第六课(二)|学习笔记
|
存储 SQL Oracle
第六课(三)|学习笔记
快速学习第六课(三)
93 0
第六课(三)|学习笔记
|
负载均衡 搜索推荐 应用服务中间件
第三课(一)|学习笔记
快速学习第三课(一)
109 0
第三课(一)|学习笔记
|
存储 Oracle 关系型数据库
第六课(一)|学习笔记
快速学习第六课(一)
89 0
第六课(一)|学习笔记