实验1 交叉编译工具链建立实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验1交叉编译工具链建立实验
1.1实验目的
∙熟悉Linux操作系统;
∙掌握交叉编译工具链的建立过程;
∙掌握通过gdb调试程序的方法;
∙掌握makefile文件的写法。
1.2实验设备
∙硬件:PC机;
∙软件:Windows操作系统、VMware虚拟机和Linux操作系统,或直接安装于硬盘的Linux操作系统,arm-linux-gcc安装文件。
1.3实验内容
∙安装Linux操作系统;
∙建立交叉编译工具链;
∙编写解决八皇后问题的程序。
1.4实验原理
1.4.1交叉编译工具链的简介
交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程式,例如我们试验中在Linux平台上编译出能运行在ARM为内核的CPU平台上的程式,编译得到的可执行文件是不能在Linux环境下运行的,必须放到ARM平台上才能运行。这种方法在异平台移植和嵌入式研发时非常有用的。
交叉编译工具链是由编译器、连接器和解释器组成的综合研发环境,交叉编译工具链主要由binutils、gcc和glibc三个部分组成。有时出于减小libc库大小的考虑,也能用别的C库来代替glibc,例如uClibc、dietlibc和newlib。
1.4.2交叉编译工具链部分组件的介绍
GCC属于GUN工具链中的编译开发工具,它可以把源程序编译为可执行文件。GCC是支持支持Ada语言、C++语言、Java语言、Objective C语言、Pascal语言、COBOL语言,以及支持函数式编程和逻辑编程的Mercury语言,等等的编译器。GCC是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。GCC主要包括:
∙cpp:GNU C编译器的预处理器
∙gcc:符合ISO标准的C编译器
∙g++:基本符合ISO标准的C++编译器
∙gcj:GCC的java前端
∙gnat:GCC的GNU ADA95的前端
binutils是一组二进制工具程序集合,是辅助GCC的主要软件,其中主要包括:
∙as:GNU汇编器
∙ld:GNU链接器
∙ar:创建归档文件,向库中添加/提取obj文件
∙nm:列出obj文件中的符号
∙objcopy:复制和转化obj文件
∙objdump:显示对象文件的信息
∙ranlib:根据归档文件中的内容建立索引
∙readelf:显示elf格式执行文件中的各种信息
∙size:显示object文件和执行文件各段的总大小
∙strings:显示文件中可以打印的字符
∙strip:去掉执行文件中多余的信息(如调试信息)
∙gprof:用来显示图表档案数据。
1.4.3Linux常用开发工具的介绍和使用
上面我们对交叉编译工具链做了概述,下面我们再给出linux下常用开发工具的介绍和使用。
1.vi(vim)
vi是linux下一种功能强大的,快速命令驱动的全屏幕编辑器,可以类比DOS的edit。vi有三种操作模式:一是命令模式(或称指令模式),在此模式下的按键当作指令来处理;一种是输入模式(或称插入模式),此模式的按键作为真正的输入;另外一种是底行模式,在该模式下,光标位于屏幕的底行。用户可以进行文件保存或退出操作,也可以设置编译环境,如寻找字符串、列出行号等。初始启动vi时处于命令模式。表1.1中列出了vi(vim)常用的命令。
r修改光标所在处的字符
x删除光标处的一个字符
dd删除光标所在的整行内容
:5d删除第五行
o在光标所在行下增加一行并进入输入模式
u撤销最后一个更改操作
yy复制当前行
p粘贴当前行
rm替换当前字符为m,替换后仍处于命令模式下
表1.1vi(vim)常用命令
vi的命令有很多,我们需要经常使用来熟悉这些命令,当你得心应手的时候你会发现vi 相比其他文本编辑器有很多优点,是一个非常高效的文本编辑器。
2.arm-linux-gcc
我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段:(1)预处理(Pre-Processing)(2)编译(Compiling)(3)汇编(Assembling)(4)链接(Linking)Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。
下面以文件example.c文件为例来说明它的命令用法:
(1)arm-linux-gcc-o example example.c
不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。-o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out。
(2)arm-linux-gcc-c-o example.o example.c
-c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件。去掉指定输出选项“-o example.o”自动输出为example.o,所以在这里-o加不加都可以。
(3)arm-linux-gcc-S-o example.s example.c
-S参数将对源程序example.c进行预处理、编译,生成example.s文件。-o选项同上。
(4)arm-linux-gcc-E-o example.i example.c
-E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上),就是将#include,#define等进行文件插入及宏扩展等操作。
(5)arm-linux-gcc-v-o example example.c
加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。
(6)arm-linux-gcc-g-o example example.c
-g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。
(7)arm-linux-gcc-Wall-o example example.c