实验一 Linux交叉编译平台实验
一、实验目的
1、理解交叉编译的概念
2、掌握在Linux下建立交叉编译平台的方法
3、掌握使用交叉编译平台编译源代码
二、实验内容
1、自动安装交叉编译平台
2、手动安装交叉编译平台
三、实验设备
1、硬件:
DM2410实验系统;
PC机;
2、软件:
RedHat Linux9.0;
自动安装包:
cross-armv4l-binutils-2.10-3mz.i386.rpm
cross-armv4l-kernel-headers-2.4.5_rmk7_np2-1mz.i386.rpm
cross-armv4l-gcc-2.95.2-5mz.i386.rpm
cross-armv4l-glibc-2.2.1-2mz.i386.rpm
cross-armv4l-gcc-c++-2.95.2-5mz.i386.rpm
cross-armv4l-libfloat-1.0-3mz.i386.rpm
cross-armv4l-zlib-1.1.3-5mz.i386.rpm
cross-armv4l-jpeg-6b-2mz.i386.rpm
cross-armv4l-jpeg-devel-6b-2mz.i386.rpm
cross-armv4l-gdb-5.2.1-1mz.i686.rpm
源码包:
binutils-2.11.
gcc-2.95.
linux下gcc编译的四个步骤glibc-2.2.
glibc-linuxthreads-2.2.
linux-2.4.
patch-2.
patch-2.4.9-ac9-rmk1.bz2
diff-2.
四、预备知识
1、熟悉Linux操作系统,命令及Linux KDE图形界面;
五、基础知识
什么是交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86
体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
一个经常会被问到的问题就是,“既然我们已经有了主机编译器,那为什么还要交叉编译呢?”其实答案很简单,没办法啊!有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
另一个经常会被问到的问题就是:“既然可以交叉编译,那还要主机编译干吗?”其实答案也很简单,交叉编译是不得已而为之!与主机编译相比,交叉编译受的限制更多,虽然在理论上我们可以做任何形式的交叉编译,但事实上,由于受到专利、版权、技术的限制,并不总是能够进行交叉编译,尤其是在业余条件下!举例来说,我们至今无法生成惠普公司专有的som格式的可执行文件,因此我们根本无法做目的平台为HPPA-HPUX的交叉编译。
在做实际工作之前,我想我们应该先掌握一些关于交叉编译的基本知识,其实说白了也就是理解一些我们经常会碰到的英文单词;
Host:主机平台。
Target:目的平台。
Perfix:交叉编译器的安装位置。
xxx-xxxx-xxxxx:平台描述。
我们在主机平台上开发程序,并在这个平台上运行交叉编译器,编译我们的程序;而由交叉编译器生成的程序将在目的平台上运行。这里值得说明得是平台描述,象arm-linux、i386-pc-linux2.4.3这样的字符串我们经常会看到,其实它是用来描述平台的,它有完整格式、缩减格式和别名之分。完整格式
是: CPU-制造厂商-操作系统,如sparc-sun-sunos4.1.4,说明平台所使用的CPU是sparc,制造厂商是sun,上面运行的操作系统是SunOS,版本是4.1.4。当然,我们都不愿记这么长的东西,因此可以使用短格式,短格式中有选择地去处了制造厂商、软件版本等信息,因此我们同样可以用sparc-sunos或sparc-sunos-sunos4来描述这个平台。如果觉得这个还是太麻烦,那就可以使用别名,sun4m就可以很简单地描述这个平台。需要注意的是,并不是所有的平台都有别名,也不是所有的短格式都可以正确地描述平台。
交叉编译是嵌入式开发过程中的一项重要技术,它的主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成,一般把前者称为目标机,后者称为主机。采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到高性能的主机中进行。
linux下的交叉编译环境重要包括以下几个部分:
•针对目标系统的编译器gcc
•针对目标系统的二进制工具binutils
•目标系统的标准c库glibc
•目标系统的linux内核头文件
六、实验步骤
自动安装交叉编译平台和手动安装交叉编译平台二者只要选择安装一个平台就可以实现交叉编译功能,完成后面的实验。但在使用中基于效率的原则我们建议采用自动安装交叉编译平台。
1、自动安装交叉编译平台
表1-1 DM2410 Linux RPM 安装包介绍
Cross-armv4l-binutils-2.10-3mz.i386.rpm GNU 二进制工具(汇编器、连接器和各种目标
文件分析工具)包
Cross-armv4l-kernel-headers-2.4.5_rmk7_np2-1mz.i386.rpm Linux kernel 的头文件,它们定义了创建大部分标准程序时所需的结构和常量,重新编译内
也需要这些头文件。
Cross-armv4l-gcc-2.95.2-10mz.i386 GNU 编译器的C 语言支持包,它并不包含标
准C 库
Cross-armv4l-glibc-2.2.1s-3mz.i386.rpm最重要的共享库包,包含标准C 库和数学库等Cross-armv4l-gcc-c++-2.95.2-10mz.i386.rpm GNC 编译C++语言支持包,包含了标准C++静
态库和头文件
Cross-armv4l-libfloat-1.0-3mz.i386.rpm浮点支持共享库包,当gcc 使用–msoft-float 选
项时需要用到该库
Cross-armv4l-zlib-1.1.3-5mz.i386.rpm 提供了在存储压缩和解压函数
Cross-armv4l-jpeg-6b-2mz.i386.rpm 操作JPEG 图象文件时用到的库
Cross-armv4l-jpeg-devel-6b-2mz.i386.rpm 开发JPEG 相关程序时用到的库和头文件Linuette_sdk_arm-1.arch.rpm Linux源码包,针对arm结构
Linuette_sdk_x86-1.arch.rpm Linuxx 源码包,针对x86结构注意:请不要随便改变安装顺序,因为工具链存在着一定的关联性,安装顺序的改变有可能导致后面的RPM包无法安装或者报错.
步骤1、启动Linux进入字符界面,以root用户登录,挂载光盘,并进入光盘中“BSP/Linux/RPM”目录。
#mount –t iso9660 /dev/cdrom /mnt/cdrom
#cd /mnt/cdrom/BSP/Linux/RPM
步骤2、执行操作将RPM包释放到指定位置有两种方法,一种是在命令行下输入指定的指令,另一种方法是采用脚本文件方式进行安装。
方法一:采用命令行方式进行安装的步骤如下:(注意当前目录必须是RPM文件所在目录)
rpm -ivh cross-armv4l-binutils-2.10-3mz.i386.rpm
rpm -ivh cross-armv4l-kernel-headers-2.4.5_rmk7_np2-1mz.i386.rpm
rpm -ivh cross-armv4l-gcc-2.95.2-5mz.i386.rpm
rpm -ivh cross-armv4l-glibc-2.2.1-2mz.i386.rpm
rpm -ivh cross-armv4l-gcc-c++-2.95.2-5mz.i386.rpm
rpm -ivh cross-armv4l-libfloat-1.0-3mz.i386.rpm
rpm -ivh cross-armv4l-zlib-1.1.3-5mz.i386.rpm
rpm -ivh cross-armv4l-jpeg-6b-2mz.i386.rpm
rpm -ivh cross-armv4l-jpeg-devel-6b-2mz.i386.rpm
rpm -ivh cross-armv4l-gdb-5.2.1-1mz.i686.rpm
方法二:采用脚本文件的方式进行安装,方法如下:
在BSP\Linux\RPM目录下运行我们提供的脚本文件install。
#./install
脚本文件install的内容如下:
#!/bin/sh
rpm -ivh cross-armv4l-binutils-2.10-3mz.i386.rpm
rpm -ivh cross-armv4l-kernel-headers-2.4.5_rmk7_np2-1mz.i386.rpm
rpm -ivh cross-armv4l-gcc-2.95.2-5mz.i386.rpm
rpm -ivh cross-armv4l-glibc-2.2.1-2mz.i386.rpm
rpm -ivh cross-armv4l-gcc-c++-2.95.2-5mz.i386.rpm
rpm -ivh cross-armv4l-libfloat-1.0-3mz.i386.rpm
rpm -ivh cross-armv4l-zlib-1.1.3-5mz.i386.rpm
rpm -ivh cross-armv4l-jpeg-6b-2mz.i386.rpm
rpm -ivh cross-armv4l-jpeg-devel-6b-2mz.i386.rpm
rpm -ivh cross-armv4l-gdb-5.2.1-1mz.i686.rpm
我们可以自己编辑类似的脚本文件,(如果你在Windows下制作的脚本文件,在文件存储时应特别注意文件格式,非Linux的文件格式可能导致脚本文件无法运行。)由于光盘的文件系统是只读文件系统,所以我们一般都在/root/目录中编辑install脚本文件。
#cd /root
#vi install
输入脚本文件的内容后,关闭编辑的文件,改变文件的属性
chmod a+x install
进入RPM安装文件所在目录,执行安装脚本
如果我们使用提供的安装光盘,可以将光盘挂载到/mnt/cdrom节点下,后面的执行步骤就是:
#cd /mnt/cdrom/BSP/Linux/RPMS
# /root/install
步骤3、安装完毕,可以查看/opt/目录相关的安装编译器可执行文件和库等。为了在每次开机后可以把编译器的路径放入环境变量,您还需要编辑/etc/profile文件,如下:# Path manipulation
if [ `id -u` = 0 ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
pathmunge /opt/host/armv4l/bin ;arm交叉编译器所在的路径
fi
保存退出,重新登陆,这样就可以使用arm的交叉编译器编译您的程序了。
小窍门★:删除已经安装的RPM包
删除已经安装的RPM包也有两种方法,一种是在命令行方式下输入命令,
#rpm –qa | grep cross :显示已经安装的交叉编译环境
rpm -e cross-armv4l-gdb-5.2.1-1mz
rpm -e cross-armv4l-jpeg-devel-6b-2mz
rpm -e cross-armv4l-jpeg-6b-2mz
rpm -e cross-armv4l-zlib-1.1.3-5mz
rpm -e cross-armv4l-libfloat-1.0-3mz
rpm -e cross-armv4l-gcc-c++-2.95.2-5mz
rpm -e cross-armv4l-glibc-2.2.1-2mz
rpm -e cross-armv4l-gcc-2.95.2-5mz
rpm -e cross-armv4l-kernel-headers-2.4.5_rmk7_np2-1mz
rpm -e cross-armv4l-binutils-2.10-3mz
删除相关的RPM 工具链时应该注意顺序,包之间存在相互依赖关系。
第二种方式就是在我们提供的光盘RPM文件所在目录下执行删除脚本uninstall。如果需要自己编辑uninstall脚本,方法类似于install脚本的编辑方式。
./uninstall
2、手动安装交叉编译平台
小提示★:我们一般不赞同用户自己手动编译交叉编译平台,因为这样非常消耗时间并且正确率很低,但是在某些特殊的情况下自己编译交叉编译平台又是必须的,所以我们在下面的文档中给大家提供了一个例子,作为一个参考。
一般来说,GNU 提供的被用来开发Linux 的工具链,包括以下内容:
g cc 编译器:可以用来编译GNC C,C++程序
G NU 二进制工具(binutils):包括汇编器、连接器和一些用来分析目标文件的程序
G NU C 库
安装该工具链的步骤一般如下:
二进制工具(binutils)Æ头文件连接(header file link)Æ C 编译器(gcc) Æ库(glib)Æ C++编译器(gcc)
约定★:我们用来在建立交叉编译环境的时候在后面在使用这个编译环境的用户都是Student. 在用户目录下针对交叉编译环境建立的目录结构:
图1-1 工作目录结构
步骤1、启动linux,使用用户名Student登陆系统,建立工作目录。
# mkdir CrossARM // 建立CrossARM目录
#cd CrossARM
#mkdir SourceDir // 建立SourceDir目录
#mkdir BuildDir // 建立BuildDir目录
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论