gcc,一个神奇的编译器
gcc是“GNU Compiler Collection”的缩写,从字面意思可以知道它是一个编译器集。gcc不止可以编译器c语言,还能用于c++,java,object-C等语言程序。但是在这里,我们的嵌入式学习中,目前只去关注gcc在C语言方面的编译功能。
.什么是交叉编译器
在嵌入式系统开发中,经常用到与交叉编译相关的术语,例如:交叉编译器,交叉连接器,交叉编译环境等。
嵌入式产品的资源往往有限,如果它的资源和我们平时用的桌面计算机(后面称为开发主机或简称主机,host machine)一样,那就不需要交叉编译了。嵌入式系统的内存通常是几十兆字节,且只有闪存而没有硬盘这种大容量存储设备。在这种资源有限的环境中,不可能将开发工具安装在嵌入式设备中(后面称为目标机,target machine),然后像平时做桌面软件开发那样在嵌入式设备上直接进行软件开发,因此,嵌入式的开发工作一般是在主机上进行的。
那么当目标机的处理器和主机的处理器不同时(比如目标机是ARM处理器,而主机是X86处理器),如何保证在主机上编译的程序可以在目标机上运行呢?
当使用编译gcc时,需要指定目标机处理器和主机处理器型号,如果不加以指定,则认为主机与目标机是一样的,且与当前编译它的环境一致。如果在gcc编译时,指定主机与目标机处理器型号不一致,则生成的编译器就是交叉编译器(cross compiler),即生成的编译器将在指定主机上进行编译活动,但在编译器生成的程序却运行于目标机上。
gcc会对代码完成预处理,编译,汇编和链接四个步骤。



这里注意:汇编文件的后缀是s(小s)表示:在后期阶段不在进行预处理操作,所以我们不能在这里面写预处理的语句在里面;汇编文件的后缀是S(大S)表示:会进行预处理、汇编等操作,所以我们可以在这里面加入预处理的命令。
gcc实用选项:
-S:生成汇编
-I:指定头文件路径
-g:包含调试信息
-On:n=0~3,编译器优化,n越大优化等级越高
-Wall:提示更多的警告信息
-D:编译器时定义宏,注意-D和宏之间没有空格
-E:生成预处理文件
-c:只编译,不链接
-C 告诉预处理器不要丢弃注释。配合`-E'选项使用。
-M:生成与.c和头文件的依赖关系以用于Makefile,包括系统库的头文件
-MM:生成与.c和头文件的依赖关系以用于Makefile,不包括系统库的头文件
-o:生成目标文件。eg: -o filename。将经过gcc处理的结果保存为filename。如果这个选项被忽略,生成的可执行文件默认为a.out,,假设源文件为file.c,目标文件默认为file.o,汇编文件默认为file.s。
gcc -v可以查看gcc的版本信息,但是要是在gcc -v 后面加上一个源文件例如,gcc -v main.c,这样可以获得gcc所使用的系统头文件。

加上源文件选项 :


产生映射文件

gcc的-Wl选项用于指定传递给连接器的选项,-Map=main.map选项由gcc传递给连接器以只是连接器为我们生成名为main.map的映射文件。在使用-Wl选项时,如果后面的选项如有多个,则需要用逗号分开。
映射文件除了包含nm工具获取的信息外,还包含了各符号来源于哪一个库以及库中的哪一个目标文件等更为详细的信息。
在链接选项中:

参考链接:http://blog.chinaunix.net/uid-20528014-id-358180.html
gcc,一个神奇的编译器的更多相关文章
- 第一个C语言编译器是怎样编写的?
首先向C语言之父Dennis MacAlistair Ritchie致敬! 当今几乎所有的实用的编译器/解释器(以下统称编译器)都是用C语言编写的,有一些语言比如Clojure,Jython等是基于J ...
- modifytime是一个神奇的column name----这边文章是错的totally,因为我的实验不彻底。timestamp属性很神奇,头一个timestamp,会自动的成DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
在mysql里边modifytime是一个神奇的column name,试一下. 请执行sql语句 CREATE TABLE `test_time` ( `modifytime` timestamp ...
- javascript编写一个简单的编译器(理解抽象语法树AST)
javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...
- 一个神奇的???whatever~~
一个神奇的类,用来封装消息数据,统一数据传递接口,从unity引擎源码拷贝而来. #include <iostream> #include <assert.h> #includ ...
- 我发起并创立了一个 C 语言编译器 开源项目 InnerC
本文是 VMBC / D# 项目 的 系列文章, 有关 VMBC / D# , 见 <我发起并创立了一个 VMBC 的 子项目 D#>(以下简称 <D#>) https: ...
- 记一个神奇的WAS问题:sibuswsgw-sibuswsgw_console.jar invalid LOC header (bad signature) 分类: WebSphere 2015-08-06 23:21 9人阅读 评论(0) 收藏
今天晚上,出现了一个神奇的WAS问题,详细问题异常信息如下: [15-8-6 22:13:29:146 CST] 00000013 ApplicationMg A WSVR0203I: 应用程序:is ...
- 微信图片上传,遇到一个神奇的jgp
微信图片上传,获取图片base64遇到一个神奇的 jgp var imgFn = function (event) { event.preventDefault(); var id = '#'+$ ...
- JS高级---一个神奇的原型链
一个神奇的原型链 <script> var divObj=document.getElementById("dv"); console.dir(divObj); //d ...
- Bugku-CTF之这是一个神奇的登陆框
Day32 这是一个神奇的登陆框 http://123.206.87.240:9001/sql/ flag格式flag{}
随机推荐
- iOS:CALayer核心动画层
CALayer:核心动画层 简介: Core Animation 是跨平台的,支持iOS环境和Mac OS X环境 学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView, ...
- JavaScript 创建类/对象的几种方式
在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的. JS对象是一种复合类型,它允许你通过变量 ...
- ISP图像调试工程师——色彩还原(熟悉图像预处理和后处理技术)
http://blog.sina.com.cn/s/blog_5e125dcf0100k8s3.html 色彩还原: https://wenku.baidu.com/view/123fb51a6edb ...
- 分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下载)
阅读目录 简介 系统特色 系统介绍 - 首页 系统介绍 - 列表页 系统介绍 - 明细页(表单) 系统介绍 - 菜单/按钮 系统介绍 - 权限中心 系统介绍 - 数据权限 系统介绍 - 字段权限 系统 ...
- [Functional Programming ADT] Adapt Redux Actions/Reducers for Use with the State ADT
By using the State ADT to define how our application state transitions over time, we clear up the ne ...
- Notepad++的使用
\t 制表符. \n 新行. . 匹配任意字符. | 匹配表达式左边和右边的字符. 例如, "ab|bc" 匹配 "ab" 或者 "bc&quo ...
- 前端性能优化:使用Array.prototype.join代替字符串连接
来源:GBin1.com 有一种非常简单的客户端优化方式,就是用Array.prototype.join代替原有的基本的字符连接的写法.在这个系列的第一篇中,我在代码中使用了基本字符连接: htmlS ...
- 升级_开阔视野之Oracle图形化升级(dbca建库后升级)—10.2.0.1.0升为10.2.0.5.0
***********************************************声明*************************************************** ...
- Spring集成ActiveMQ配置 --转
转自:http://suhuanzheng7784877.iteye.com/blog/969865 集成环境 Spring采用2.5.6版本,ActiveMQ使用的是5.4.2,从apache站点可 ...
- python 静态成员变量
python 静态成员变量 python 也可以定义静态成员变量,就是类的变量. 注意python的静态成员变量只能通过 类.变量名 的形式获取 class A: a1 = 0 def __init_ ...