嵌入式操作系统实验一建立交叉编译环境文档格式.docx
《嵌入式操作系统实验一建立交叉编译环境文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式操作系统实验一建立交叉编译环境文档格式.docx(13页珍藏版)》请在冰点文库上搜索。
1、虚拟硬盘尽量分配大一些,之后再扩就比较麻烦。
2、共享文件夹不要有中文路径,不然挂载后看不到中文名称文件。
3、安装操作系统时,不能断网,需要下载各种资源,不然会异常。
详细内容2:
安装gcc-4.1替换操作系统中的gcc-4.4.5,用它编译交叉编译器gcc-3.4.5和库文件glibc-2.3.2、gdb-6.5。
为了完成这样的目标,我们需要安装与脚本相关的工具,需要修改crosstool中的配置文件arm.dat以指定编译的目标位arm-linux。
需要修改crosstool中的脚本文件,指定编译的源文件和目的文件夹(后来建立),指定配置文件为gcc-3.4.5-glibc-2.3.2.dat,在该配置文件中,指定了交叉编译器和调试器、C库的版本。
最后运行脚本,实现了对GCC工具包的安装,包括gcc预处理器、汇编器、编译器、链接器、调试器、反汇编工具等等。
整个实验中我们需要的资源是crosstool-0.43.tar、gdb-6.5.tar、linux-2.6.8.tar,将放置在共享文件夹的crosstool工具拷贝到主文件夹下并解压,将gbd和linux文件拷贝到crosstool文件夹,拷贝linux-2.6.8.tar是因为编译时需要内核文件。
实验步骤
实验准备:
在实验准备中,在安装完增强工具包(安装vmwaretools实现与XP文件共享)并重启之后,需要实现对共享文件夹的自动挂载,只需要修改etc目录中的配置文件rc.local,rc.local是很多linux系统管理员的偏爱,因为凡是需要随系统自动启动的服务、程序等,都可以放在里面。
$sudomkdir/mnt/share
$sudomount-tvboxsfembedded/mnt/shared
上面三句话实现了将共享文件夹embeded挂载到了share上。
gedit/etc/rc.local
将第2句命令添加在exit之前,实现了自动挂载功能。
一、搭建编译环境
1、安装于脚本运行相关及其他的工具bison、flex、build-essential、patch、libncurses5-dev。
$sudoapt-getinstallbisonflexbuild-essentialpatchlibncurses5-dev运行如下:
相关:
Linux下有一个SUDO命令,使得普通用户能够行使超级用户的部份权利,
在/etc/sudoers中设置了可执行sudo指令的用户。
若其XX的用户企图使用sudo,则会发出警告的邮件给管理员。
用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
apt-get一个下载的命令参数有install安装update更新remove移除check检查。
比如:
sudoapt-getinstallsamba-3.0-7下载并安装一个名字为samba-3.0-7的程序
在UNIX早期时代,编写一个编译器是一件非常耗时的工作。
人们为了简化开发过程,开发了Lex和YACC程序来解决第一个任务,根据用户描述的语言,生成能够解决问题的C/C++语言代码,供开发者使用。
将源代码文件分解为各种词汇(Lex);
找到这些词汇的组成方式(YACC);
GNU软件协会开发了Flex和BISON,其功能与LEX和YACC基本兼容,并且在Lex和YACC提供的功能的基础上进行了各种扩展。
FLex能够将输入数据流分类为各类词汇,为后来的语法分析做准备
Bison该文件本质上就是一个C语言的源代码,作用就是对输入文件进行语法分析。
GNUBison在Linux下的安装非常简单。
你可以去它的官方网站上下载安装包自行安装,ubuntu系统下更简单的方法同样是直接在命令行敲入命令实现。
Ubuntu缺省情况下,并没有提供C/C++的编译环境,因此还需要手动安装。
如果单独安装gcc以及g++比较麻烦,幸运的是,Ubuntu提供了一个build-essential软件包。
查看该软件包的依赖关系,可以看到以下内容:
$apt-cachedepends"
build-essential"
build-essential
Depends:
libc6-dev
<
libc-dev>
Depends:
gcc
g++
make
dpkg-dev
也就是说,安装了该软件包,编译c/c++所需要的软件包也都会被安装。
因此如果想在Ubuntu中编译c/c++程序,只需要安装build-essential软件包就可以了。
可以推测我们实验中的gcc-4.4.5就是在安装这个软件包时安装的。
用makemenuconfig配置linux内核,要安装libncurses5-dev套件。
2、更换sh
更换shell语言解释器
$sudomv/bin/sh/bin/sh.old//备份解释器
$sudoln-sfbash/bin/sh//更改软链接,规定使用bash对脚本进行解释
$echo$SHELL运行如下:
//显示环境变量的值
ln是linux中一个非常重要命令。
它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:
ln-s源文件目标文件。
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
我们输入gcc时,执行的就是它的链接。
用ls-l命令去察看,可以看到link的路径了。
Ubuntu默认使用dash,而不是bash,这是因为由于dash更小,运行更快,还与POSIX兼容而crosstool脚本运行需要用bash进行解释。
需要把Ubuntu默认的dash改为bash。
表现为/bin/sh软链接到了/bin/dash,而不是传统的/bin/bash。
echo$SHELL功能是显示获知环境变量$SHELL的值。
何谓环境变量?
在所处的环境中,那些供系统或应用程序取用而固定存在的一种特殊变量。
称之.环境变量可由系统预定或由您自行定义及修改,又称为整体变量.也就是说:
不管你身处何方,这些变量的值都跟着你的环境而存在。
常见的环境变量:
$SHELL使用哪一种shell
$TERM终端机的型态
$MAIL邮件收件位置
$PATH程序搜寻路径。
3、更换gcc
$gcc-v//查看当前的GCC版本信息显示如下:
gccversion4.4.5
我们需要用gcc-4.1版本来生成交叉编译器。
$sudoapt-getinstallgcc-4.1//获取并安装gcc-4.1
lsgcc*//使用通配符,显示usr/bin目录下与gcc有关的目录
Filegcc//file是检测文件类型的命令,显示当前的gcc指向gcc-4.4编译器
rmgcc//删除gcc命令
lsgcc*//看到,已经没有了gcc
ln-sgcc-4.1gcc//建立从gcc到gcc-4.1的链接
Lsgcc*//新的gcc
gcc-v/查看新的编译器版本信息,显示已经更换到了gcc-4.1
2、准备相关资源
$mkdir/home/ww/embedded//在主文件夹下建立一个文件夹
$cd/home/ww/embedded//进入该文件夹
$cp/mnt/shared/crosstool-0.43.tar.gz./将crosstool工具拷贝到这个文件夹并解压
$tar-xvzfcrosstool-0.43.tar.gz
$cdcrosstool-0.43
$cp/mnt/shared/gdb-6.5.tar.bz2./
$cp/mnt/shared/linux-2.6.8.tar.bz2.///进入工具文件夹,并把gdb和内核文件拷贝进来,以供脚本运行时使用。
3、修改配置文件
Crosstol工具要想在本机上顺利运行必须修改其配置文件,也就是做一下移植。
表现为修改编译的目标,告诉它源文件在哪,编译到什么地方,编译什么版本的gcc和C库函数。
1、修改arm.dat,指定编译目标为:
TARGET=arm-linux
geditarm.dat//使用gedit比使用vi要方便的多
2、修改demo-arm.sh。
指定源文件所在的位置和编译结果存放的位置
Geditdemo-arm.sh
在执行过程中创建这个文件夹会出现权限错误,需要用管理员权限创建目标文件夹,并修改文件属性,命令如下:
$sudomkdir/opt/crosstool//建立文件夹
$sudochmod777/opt/crosstool//修改读写属性
Ubuntu的许多操作是在终端中进行的在图形界面上,我们可以通过属性中的权限选项夹进行操作。
但是一旦文件的属性显示当前用户没有读写权力时,无法在图形界面上修改权限。
,通过sudo命令管理的文件是由root持有权限的,一般用户是无法改变的。
常用方法如下:
sudochmod600×
×
(只有所有者有读和写的权限)
sudochmod644×
(所有者有读和写的权限,组用户只有读的权限)
sudochmod700×
(只有所有者有读和写以及执行的权限)
sudochmod666×
(每个人都有读和写的权限)
sudochmod777×
(每个人都有读和写以及执行的权限)
3、修改要编译的gcc版本和库文件版本。
选用gcc-3.4.5-glibc-2.3.2,在最后一行前加上#表示注释。
geditgcc-3.4.5-glibc-2.3.2.dat查看要编译的gcc/glibc/gbd版本
4、开始编译
$cpdemo-arm.sharm.sh//备份脚本
$./arm.sh/开始运行脚本,编译。
过一段时间之后,查看安装了哪些工具:
$ls/opt/crosstool/gcc-3.4.5-glibc-2.3.2/arm-linux/bin
相当于手工安装了gcc、库文件、二进制开发包binutil、gbd等工具
5、配置环境变量
为了不使你每次使用交叉编译工具的时候都要输入绝对路径,你需要配置环境变量,将你的交叉编译工具存放的位置的路径增加到PATH变量中:
$vim~/.bashrc用VI编辑器打开bashrc文件
增加如下一行:
ExportPATH=${PATH}:
/opt/crosstool/gcc-3.4.5-glibc-2.3.2/arm-linux/bin
添加程序搜索路径。
类似于在编译环境中添加头文件路径一样,系统自动会在添加的路径中自动寻找目标。
刷新bashrc
$source~/.bashrc
6、编译程序,测试安装的正确性
1.编写hello.c
$arm-linux-gcchello.c//编译该源程序
可看到输出了ARM体系结构下的可执行文件,格式为ELF,当前的X86是没法办运行的,交叉编译,面向不同的处理器。
收获:
1、虚拟机的安装流程,共享文件夹的自动挂载,及添加自启动指令的方法。
2、学会了如何利用crosstool脚本安装交叉编译环境,课堂上讲了如何手工安装gcc/库文件/binutil开发包,加上嵌入式系统设计实验课上直接获取GUN工具链,基本掌握了三种建立交叉编译环境的方法。
3、Linux的基本指令如:
cdlscprmmkdirexittarfile连接指令ln超级用户指令sudo获取安装指令apt-getinstallmv更新系统指令sudoaptitudeupdate、获取变量值echo通配符的使用,cd+..tab、
4、设置环境变量的方法,可以大大方便开发,而且对指令的运行,有了更深的认识。
可以想象,cd/ls/cp等这些在usr/bin中的基本应用程序的路径已经添加在了PATH中。
这样用户在中断中输入的时候,内核可以找到这个程序并执行。
5、接触了两种不同的脚本命令解释器。
6、利用ln链接和环境变量都可以方便开发,但是降低了可读性,增加了理解难度
7、学会使用sudochmod修改文件夹的属性
8、VI指令:
i插入、dd删去一行,shift+zz保存并退出。
Delete删除字符。
9、对于编辑类的工作,gdit更好用
10、新建虚拟机就是新买了一台机器,其实就是在硬盘里多了两个文件夹,一个配置文件夹,一个虚拟机文件夹,删掉之后就什么都没了。
11、为什么使用交叉开发?
嵌入式系统多采用交叉编译的方式,在本机编译好的程序是不能在本机运行的,需要通过特定的手段(例如烧写,下载等)安装到目标系统上执行。
这种编译运行的方法比较繁琐,是受到实际条件限制的。
大多数的嵌入式系统目标板系统资源都很有限,无论是存储空间还是CPU处理能力,都很难达到编译程序的要求。
而且很多目标板是没有操作系统的,需要通过其他的机器编译操作系统和应用程序。
12、交叉开发又为什么选择LINUX?
按照直觉的想法,开发嵌入式linux程序主机当然用linux系统,没错,直觉是正确的。
只有每天使用linux,你才能不断的了解linux,才能成为一个优秀的嵌入式linux开发人员。
这是最重要的
windows上一个的问题是缺少GNU的工具链,虽然有的公司和开源社区发布了windows下的GNU工具链。
但他们往往更新较慢,而且也未必可靠。
cygwin提供了一个linux的模拟环境,在上面可以建立嵌入式linux工具链,但它依然更新较慢,可靠性依然可能是一个问题。
Linux环境下有完整的而强大GUN的开发工具链。