Linux编译器GCC的使用
嵌入式Linux编译器GCC的使用
1、GCC概述
作为自由软件的旗舰项目,Richard Stallman在十多年前刚开始写作GCC的时候,还只是仅仅把它当作一个C程序语言的编译器,GCC的意思也只是GNU C Compiler而已。
经过了这么多年的发展,GCC已经不仅仅能支持C语言,它现在还支持Ada语言、C++语言、Java语言、Objective C语言、PASCAL语言、COBOL语言,并支持函数式编程和逻辑编程的Mercury语言等。而GCC也不再单只GNU C语言编译器的意思了,而是变成了GNU编译器家族了。
GCC的编译流程分为了4个步骤,分别为:
l 预处理(Pre-Processing)
l 编译(Compiling)
l 汇编(Assembling)
l 链接(Linking)
编译器通过程序的扩展名可分辨编写原始程序源码所用的语言,由于不同的程序所需要执行编译的步骤是不同的,因此GCC根据不同的后缀名对它们进行分别处理,下表指出了不同后缀名的处理方式:
GCC所支持后缀名解释
后缀名 | 所对应的语言 | 编译流程 |
.c | C原始程序 | 预处理、编译、汇编 |
.C/.cc/.cxx | C++原始程序 | 预处理、编译、汇编 |
.m | Objective-C原始程序 | 预处理、编译、汇编 |
.i | 已经过预处理的C原始程序 | 编译、汇编 |
.ii | 已经过预处理的C++原始程序 | 编译、汇编 |
.s/.S | 汇编语言原始程序 | 汇编 |
.h | 预处理文件(头文件) | (一般不出现在指令行) |
.o | 目标文件 | 链接 |
.a/.so | 编译后的库文件 | 链接 |
2、GCC编译流程分析
GCC使用的基本语法为:
Gcc [ option | filename ]
l option是GCC使用时的一些选项,通过指定不同的选项GCC可以实现其强大的功能。
l 这里的filename则是GCC要编译的文件,GCC会根据用户所指定的编译选项以及所识别的文件后缀名来对编译文件进行相应的处理。
这里从编译流程的角度讲解GCC的常见使用方法。首先,这里有一段简单的C语言程序,该程序由两个文件组成,其中“hello.h”为头文件,在“hello.c”中包含了“hello.h”,其源文件如下所示。
/* hello.h */
#ifndef_HELLO_H_
#define_HELLO_H_
typedef unsigned long val32_t;
#endif
/* hello.c */
#include <stdio.h>
#include <stdlib.h>
#include "hello.h"
int main(int argc, char *argv[])
{
val32_t I = 5;
printf("hello,embedded world%d\n", i);
}
A. 预处理阶段
GCC的选项“-E”可以使编译器在预处理结束时就停止编译,选项“-o”是指定GCC输出的结果,其命令格式为如下所示。
Gcc –E –o [目标文件] [编译文件]
我们已经知道,后缀名为“.i”的文件是经过预处理的C原始程序。要注意,“hello.h”文件是不能进行编译的,因此,使编译器在预处理后停止的命令如下所示。
[root@localhost gcc]# gcc –E –o hello.i hello.c
在此处,选项‘-o’是指目标文件,而‘.i’文件为已经过预处理的C原始程序。以下列出了hello.i文件的部分内容。
#2"hello.c"2
#1"hello.h"1
typedef unsigned long val32_t;
#3"hello.c"2
int main()
{
val32_t i=5;
printf("hello,embedded world%d\n",i);
}
由此可见,GCC确实进行了预处理,它把“hello.h”的内容插入到hello.i文件中了。
B. 编译阶段
编译器在预处理结束之后,就进入编译阶段,GCC在编译阶段首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,就开始把代码翻译成汇编语言,GCC的选项“-S”能使编译器在进行完汇编之前就停止。我们已经知道,“.s”是汇编语言原始程序,因此,此处的目标文件就可设为“.s”类型。
[root@localhost gcc]# gcc –S –o hello.s hello.i
以下列出了hello.s的内容,可见GCC已经将其转化为汇编了,感兴趣的话可以分析一下这一行简单的C语言小程序用汇编代码是如何实现的。
.file"hello.c"
.section.rodata
.LC0:
.string"hello,embedded world%d\n"
.text
.globl main
.type main,@function
main:
pushl%ebp
movl%esp,%ebp
subl$8,%esp
andl$-16,%esp
movl$0,%eax
addl$15,%eax
addl$15,%eax
shrl$4,%eax
sall$4,%eax
subl%eax,%esp
movl$5,-4(%ebp)
subl$8,%esp
pushl-4(%ebp)
pushl$.LC0
call printf
addl$16,%esp
leave
ret
.size main,.-main
.section.note.GNU-stack,"",@progbits
..ident"GCC:(GNU)4.0.0 20050519(Red Hat 4.0.0-8)"
我们可以看到,这一小段C语言的程序在汇编中已经复杂很多了,这也是C语言作为所谓中级语言的优势所在。
C. 汇编阶段
汇编阶段是把编译阶段生成的“.s”文件生成目标文件,读者在此使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。如下所示。
[root@localhost gcc]# gcc –c hello.s –o hello.o
D. 链接阶段
在成功编译之后,就进入了链接阶段。在这里涉及一个重要的概念:函数库。
问题:在这个程序中并没有定义“printf”的函数实现,在预编译中包含进的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf”函数的呢?
答案:
系统把这些函数实现都已经被放入名为libc.so.6的库文件中去了,在没有特别指定时,GCC会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。
完成了链接之后,GCC就可以生成可执行文件,其命令如下所示:
[root@localhost gcc]# gcc hello.o –o hello
运行该可执行文件,出现正确的结果。
[root@localhost gcc]# ./hello
hello,embedded world 5
相关文章:

jquery兼容IE和火狐下focus()事件
<input type"text" id"my" name"my" /> <script type"text/javascript">$("#my").focus(); </script> 上面的代码在IE下是没有任何问题的,但是不兼容FF,在FF没有反应解决办法:兼容写法 IE和FF下focus()事…

Access-Control-Allow-Origin这个header这个头不能设置通配符域名
这个header属性,要么设置为*,即任何域名来源都行,要么就只能设置为一个或多个,确定的域名,不能使用通配符域名转载于:https://www.cnblogs.com/abcbuzhiming/p/6478910.html

MySQL Xtrabackup备份和恢复
简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点:(1)备份过程快速、可靠;(2)备份过程不会打断正在执行的事务;(3)能够基…
吐血整理:手拿几个大厂offer的秘密武器!
怎样才能拿到大厂的offer?没有掌握绝对的技术,那么就要不断的学习。如何拿下阿里等大厂的offer呢,今天分享一个秘密武器,资深架构师整理的Java核心知识点,面试时面试官必问的知识点,篇章包括了很多知识点&a…

.NET中获取电脑名,IP地址,当前用户
在.NET中获取一台电脑名,IP地址及当前用户名是非常简单,以下是我常用的几种方法,如果大家还有其它好的方法,可以回复一起整理: 1. 在ASP.NET中专用属性: 获取服务器电脑名: Page.Server.ManchineName 获取用户信息:…

SpringMVC注解整理
2019独角兽企业重金招聘Python工程师标准>>> 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包)。 <context:component-scan base-package"cn.test"/> Configuration把一个类作为一个IoC容器,它的某个方法头上如果…
Facebook是如何做搜索的?
作者 | 一块小蛋糕来源 | NewBeeNLP今天要和大家分享的论文是来自Facebook的『Embedding based Retrieval in Facebook Search』。不得不说,F家的文章还是一如既往浓浓的工业风,这篇论文从工程角度讲解了一个召回的全流程,不管是做语义信息检…

JavaScript[对象.属性]集锦
作者: 蓝色理想 SCRIPT 标记? 用于包含JavaScript代码.? 属性? LANGUAGE 定义脚本语言? SRC 定义一个URL用以指定以.JS结尾的文件? windows对象? 每个HTML文档的顶层对象.? 属性? frames[] 子桢数组.每个子桢数组按源文档中定义的顺序存放.? feames…

c++ hook 钩子的使用介绍
一、基本概念: 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截…

小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道
一:小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序,也做了一些东西,随后便有了以下的一些总结了,现在说说如何使用小程序一次性上传多个本地相片。 问题描述 最近做项目的时候要实现一个上传相片的功能&#x…

测试项目案例思路
近期帮公司培训部设计测试方向教学案例,原型为我们部门开发的某问卷系统,详情如下: 《**问卷系统》计划授课小时总数为85小时,预计实际授课要根据学生的掌握情况,建议增加5小时,请将此因素考虑到案例使用时…
赠书 | Python人脸五官姿态检测
作者 | 李秋键 出品 | AI科技大本营近几个月来由于疫情的影响使得网络授课得到了快速的发展,人工智能作为最有潜力的发展行业,同样可以应用于网络授课的监督。比如通过检测人脸姿态,眼睛是否张开,鼻子嘴巴等特征,来达到…

明白了这十个故事,你也就参悟了人生
1、断箭 不相信自己的意志,永远也做不成将军。 春秋战国时代,一位父亲和他的儿子出征打仗。父亲已做了将军,儿子还只是马前卒。又一阵号角吹响,战鼓雷鸣了,父亲庄严地托起一个箭囊,其中插着一只箭。…

java中的几种对象(PO,VO,DAO,BO,POJO)
一、PO :(persistant object ),持久对象 可以看成是与数据库中的表相映射的java对象。使用Hibernate来生成PO是不错的选择。二、VO :(value object) ,值对象通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对…

jquery文件上传控件 Uploadify
基于jquery的文件上传控件,支持ajax无刷新上传,多个文件同时上传,上传进行进度显示,删除已上传文件。 要求使用jquery1.4或以上版本,flash player 9.0.24以上。 有两个版本,一个用flash,一个是html5。html5…
AI 还原康乾盛世三代皇帝的样貌,简直太太太好玩了!
作者 | Jack Cui出品 | AI科技大本营一位 B 站 up 主「Jack Cui」使用 AI 技术,还原了康熙、雍正、乾隆的历史样貌。看看富态的雍正!!算法实现人工智能技术,可以实现很多有趣而又有意义的事情。 利用 StyleGAN 算法,可…

男人一生中要做的事
作者:未知 请作者速与本人联系揽住母亲的肩头: 每个人都是最棒的,父体的千万个细胞中最强壮的一个才能跑到最前面与来自母体的细胞结合。这时,有二分之一的机会会诞生一个男人。儿子,无疑是父亲所有理想的最好载体&am…

【BZOJ2157】旅游
2157: 旅游 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1460 Solved: 656[Submit][Status][Discuss]Description Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到…

PHP面向对象精要
1 使用extends实现继承以及重载、魔术方法的含义 class B extends A 声明的时候B里可以没有A里的方法 调用的时候$bnew B(); $b->A里的方法(); $b->A里的属性1; $b->B里的方法(); $b->B里的方法(); 如果$anew A(); 可以 $a->A里的方法(); $a->A里…
码农新机会!2019-2020行业调查报告出炉,这个领域程序员缺口很大!
近日,CSDN发布了《2019-2020中国开发者调查报告》,本报告从2004年开始针对一年一度的CSDN开发者大调查数据分析结果形成,是迄今为止覆盖国内各类开发者人群数量最多、辐射地域、行业分布最广的调查活动。笔者从本次调查中,挑选出一…

线性代数与矩阵论 定理 1.5.6 拉格朗日插值公式
给定域$\mathbf{F}$中$n1$个不同的数$\alpha_1,\alpha_2,\cdots,\alpha_{n1}$,以及域$\mathbf{F}$中另外$n1$个数$\beta_1,\beta_2,\cdots,\beta_{n1}$,则唯一存在域$\mathbf{F}$中一个次数不超过$n$的多项式$f(x)$,使得$f(\alpha_j)\beta_j,1\leq j\leq n1$,其中 \begin{equat…

Android的ToolBar
ToolBar比ActionBar更加可控,自由。因此,Google 逐渐使用ToolBar来代替ActionBar。 使用ToolBar 1.要引入appCompat_v7支持 2.主题设置为NoActionBar 在style.xml文件中 <style name"MyAppTheme" parent"Theme.AppCompat.Light.NoActi…

利用.NET的XML序列化解决系统配置问题
作者:未知 请作者速与本人联系 出自: http://blog.csdn.net/ycl111/在Web系统开发中,我们经常需要读取和设置一些系统配置项,常见的例如数据库连接字符串、上传路径等等。在最初的ASP系统中,比较常用的方法是将值保存…
告别CNN?一张图等于16x16个字,计算机视觉也用上Transformer了
编译 | 凯隐出品 | AI科技大本营(ID:rgznai100)Transformer是由谷歌于2017年提出的具有里程碑意义的模型,同时也是语言AI革命的关键技术。在此之前的SOTA模型都是以循环神经网络为基础(RNN, LSTM等)。从本质上来讲&…

mysql left join,right join,inner join用法分析
2019独角兽企业重金招聘Python工程师标准>>> 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录如下: bID bName 1 2006032401 2 2006032402 3 2006032403 4 200603240…

如果BarTender出现卸载不干净的问题如何处理
自从BarTender 2016出了之后,好多小伙伴都想试试新功能咋样,这就意味着首先要卸载电脑上旧版BarTender。然而就是这个操作,难倒了好一批人,他们表示BarTender卸载卸不干净,不仅旧版的用不起来了,新版BarTen…

iometer硬盘测试工具附教程
教程地址http://servers.pconline.com.cn/skills/0711/1145597.html转载于:https://blog.51cto.com/cywin7/1081456
Python炫技操作:模块重载的五种方法
作者 | 写代码的明哥来源 | Python编程时光环境准备新建一个 foo 文件夹,其下包含一个 bar.py 文件$ tree foofoo└── bar.py 0 directories, 1 filebar.py 的内容非常简单,只写了个 print 语句print("successful to be imported")只要 bar.…

使用Powershell管理Linux 下的 SQL Server
使用Powershell管理Linux 下的 SQL Server我们上一篇文章介绍了在Centos 7.3下安装及配置 SQL Server,今天我们主要介绍的是如何在Windows下使用Powershell来管理Linux下的SQL Server,其实说到Powershell大家都已经很熟悉了,Powershell不止是…
这么多年,终于有人讲清楚Transformer了
作者 | Jay Alammar译者 | 香槟超新星,责编 | 夕颜来源 | CSDN(ID:CSDNnews)注意力机制是一种在现代深度学习模型中无处不在的方法,它有助于提高神经机器翻译应用程序性能的概念。在本文中,我们将介绍Transformer这种模…