制作交叉编译工具链
编写可以在ARM上运行的程序需要使用arm-linux-gcc交叉编译工具。因此,需要制作一套交叉编译器工具链,使用它,可以让代码运行在ARM平台上。
制作arm-linux交叉编译工具链一般通过crosstool工具或者crosstool-NG,前者使用方便,但是制作会受到一些限制,使用crosstool最多只能编译gcc4.1.1、glibc2.x的版本,无法编译版本高于2.6.29的linux内核。crosstool-NG有更好的定制性,并且一直保持着更新,对新版本的编译工具链的支持比较好,当然也带来了一些麻烦,它并不是下载下来就可以使用的,必须先配置安装。
主要介绍gcc-3.4.5、glibc-2.3.6版本的交叉编译工具链的制作,即制作gcc-3.4.5-glibc-2.3.6交叉编译工具
基于crosstool-ng制作交叉编译工具链
创建交叉编译工具链所在的目录:mkdir /home/zxc/ARM9_S3C2440
cd RM9_S3C2440
mkdir crosstool_ng#建立crosstool-ng软件的安装目录
下载crosstool-ng-1.12.4.tar,并将该压缩文件复制到samba服务器中去!
准备crosstool-ng的安装环境:在编译前需要检查编译环境,必备工具包:bison、flex、texinfo、automake、libtool、cvs、patch、ncurses、curl、gcj、g++、svn、gawk、cvsd。
将Ubuntu系统联网,输入命令:
Sudo apt-get install bison flex texinfo automake libtool cvs patch curl gcj subversion gawk cvsd gperf
其中:
bison和flex是用来生成语法和词法分析器;
texinfo和man类似,用来读取帮助文档;
automake是帮助生成Makefile的工具;
libtool帮助在编译过程中处理库的依赖关系,自动搜索路径;
cvs、cvsd和subversion是版本控制软件,用于编译过程中的源码下载;
curl通过给定的网络地址下载源码的工具;
gcj用于编译java源代码的工具;
patch是用于给源码打补丁的工具;
gawk是linux下用于文本处理和模式匹配的工具。
安装crosstool-ng
解压samba_share文件夹中的crosstool-ng-1.12.4.tar.bz2
cd samba_share
tar –xjvf crosstool-ng-1.12.4.tar.bz2
cd crosstool-ng-1.12.4
sudo ./configure --prefix=/home/zxc/ARM9_S3C2440/crosstool_ng,显示
执行sudo apt-get install awk
继续执行config命令:sudo ./configure --prefix=/home/zxc/ARM9_S3C2440/crosstool_ng
出现类似问题,解决方式类似!
注意:
进入安装目录/home/zxc/ARM9_S3C2440/crosstool_ng的lib/samples下,
选用arm-unknown-linux-gnueabi
配置编译的交叉编译工具链参数
(1)先建立一个编译目录
#mkdir /home/zxc/ARM9_S3C2440/crosstool_ng/ crosstool_ng_built
进入该目录,cd /home/zxc/ARM9_S3C2440/crosstool_ng/ crosstool_ng_built
然后执行命令:cp /home/zxc/ARM9_S3C2440/crosstool_ng/lib/ct-ng-1.12.4/samples/arm-unknown-linux-gnueabi/* .(注意最后一个“.”表示复制到当前目录)将arm-unknown-linux-gnueabi拷贝到/home/zxc/ARM9_S3C2440/crosstool_ng/ crosstool_ng_built目录下。然后会在crosstool_ng_built目录下出现crosstool.config和reported.by两个文件。
现在将文件crosstool.config的名字改为.config,命令如下:
cp crosstool.config .config(注意.config是隐藏文件,需要用ls –a命令才能查看。
然后在目录/home/zxc/ARM9_S3C2440/crosstool_ng/ crosstool_ng_built下执行ct-ng menuconfig
要设置环境变量或者软连接,命令如下:
sudo ln -s /home/zxc/ARM9_S3C2440/crosstool_ng/bin/ct-ng /usr/local/bin/ct-ng
然后执行ct-ng menuconfig
此时会弹出主菜单,如下图,此菜单主要用于交叉编译工具链的环境配置
进入“Paths and misc options”菜单,修改选项“Local tarballs directory”目录。
建立/home/zxc/ARM9_S3C2440/crosstool_ng_tarballs目录,将“Local tarballs directory”的目录改为/home/zxc/ARM9_S3C2440/crosstool_ng_tarballs
新建目录/home/zxc/ARM9_S3C2440/ct_ng_2440,这就是生成的交叉编译工具链存放的位置。
修改选项“Prefix directory”,
返回主菜单,修改“Target options”,这是重点要修改的地方。
进入“Target options”选项
修改:
(armv4t)Architecture level
(arm920t)Emit assembly for CPU
(arm920t)tune for CPU
Floating point()设置为软浮点,因为s3c2440没有硬件浮点。
返回主菜单,修改Toolchain options配置选项
修改(zxc)Tuple’s vendor string,这样产生的编译器前缀就是arm-zxc-linux-gnueabi-
修改(arm-linux)Tuple’s alias,给产生的交叉编译工具起个别名,设置别名,这样会给每个工具创建一个软连接
返回主菜单,修改“Operating System”配置选项,
指定编译器的目标系统是linux,版本为2.6.39.2
返回主菜单,修改“Binary utilities”配置选项
返回主菜单,修改C compiler配置选项,
返回主菜单,修改C-library配置选项,
返回主菜单,修改Debug facilities配置选项
保持默认值(这里全部都没选!)
返回主菜单,修改Companion library配置选项
这里,修改MPFR version(3.0.0)
做完上述配置工作后,选择退出,并选择yes保存。
编译交叉工具链
解决办法是:sudo apt-get install gcj-jdk
最终,排除万难,终于成功!
测试编译成功的交叉编译工具链
进入交叉编译工具链的安装目录/home/zxc/ARM9_S3C2440/ct_ng_2440,即之前配置的Prefix directory的目录
设置环境变量
验证交叉编译工具链是否可以使用,随便找个目录编辑一个C\C++代码,保存退出后,使用交叉编译工具链对该源文件进行编译,并生成可执行文件,这里生成的可执行文件是一种二进制文件,只能下载到开发板中去执行,并不能在Ubuntu系统中执行。
下面是编译主机上运行的gdb
手动下载源文件gdb-6.8a.tar.bz2,并通过samba服务器放入Ubuntu系统的/home/zxc/ARM9_S3C2440/ARM_gdb目录中。
新建gdb的安装目录:
root@zxcUbuntu:/home/zxc/ARM9_S3C2440# mkdir ARM_gdb
将载源文件gdb-6.8a.tar.bz2复制到/home/zxc/ARM9_S3C2440/ARM_gdb目录下。
root@zxcUbuntu:/home/zxc# cp /home/zxc/samba_share/gdb-6.8a.tar.bz2 /home/zxc/ARM9_S3C2440/ARM_gdb
解压文件:
root@zxcUbuntu:/home/zxc/ARM9_S3C2440/ARM_gdb#tar -xjvf gdb-6.8a.tar.bz2
root@zxcUbuntu:/home/zxc/ARM9_S3C2440/ARM_gdb#cd gdb-6.8
root@zxcUbuntu:/home/zxc/ARM9_S3C2440/ARM_gdb/gdb-6.8#./configure --target=arm-linux --enable-werror --prefix=/home/zxc/ARM9_S3C2440/ARM_gdb
root@zxcUbuntu:/home/zxc/ARM9_S3C2440/ARM_gdb/gdb-6.8#make make
root@zxcUbuntu:/home/zxc/ARM9_S3C2440/ARM_gdb/gdb-6.8#make install