用crosstool工具构建交叉编译链

http://blog.csdn.net/taiheng05/article/details/5747887

0. 前期工作

在编译过程中可能出现的问题,先写在前面,以免编译失败后重新来过。下面假定 yourname 为你的实际用户名。

1 )在进行制作之前,必须确保系统里已经安装了 bison,flex build-essential 工具。如果没有安装的话,在终端下执行如下代码:

sudo apt-get install bison flex build-essential

2 gcc 版本过旧问题,实则因为较新

configure: error:

*** These critical programs are missing or too old: gcc

*** Check the INSTALL file for required versions.

原因: gcc 版本过新

有两种解决方法:

A. 删除旧版本( ubuntu8.04 的默认 gcc 版本为 4.2.4 ),下载新版本

$ sudo apt-get remove gcc

$ sudo apt-get install gcc-3.4

B. 不用卸载旧版本,直接下载新版本(本人采用此法,下载的版本为比较稳定的 3.4 ),然后删除旧的连接文件,建立新的连接文件

$ sudo apt-get install gcc-3.4

$ sudo rm /usr/bin/gcc

$ sudo ln -s /usr/bin/gcc-3.4 /usr/bin/gcc

如果你想再使用原版本的话,只需使用同样的方法:

$ sudo rm /usr/bin/gcc

$ sudo ln -s /usr/bin/gcc-4.2.4 /usr/bin/gcc

附:查看当前 gcc 版本的命令

$ gcc v

3 bash: ./arm.sh: Permission denied

权限问题,因为 arm.sh 为本人自己创建,右击该文件,将其属性- > 权限- > 下方- > 执行- > 允许以程序执行文件一栏勾上即可。

 

1. 准备资源文件

1 )下载脚本工具集 crosstool-0.43.tar.gz /home/yourname 目录下并解压

http://kegel.com/crosstool/#download

2 )另建立一文件夹 /home/yourname/sources 存放以下源码

linux-2.6.10.tar.gz

binutils-2.15.tar.bz2

gcc-3.3.6.tar.gz

glibc-2.3.2.tar.gz

glibc-linuxthreads-2.3.2.tar.gz

linux-libc-headers-2.6.12.0.tar.bz2

http://www.kernel.org/

http://www.kernel.org/pub/tools/crosstool/files/src/

 

2. 建立脚本文件

建立自己的编译脚本,起名为 arm.sh ,可以 copy 与之类似的 demo-arm.sh(在/home/yourname/crosstool-0.43里面) 的部分内容进行修改即可。(之前曾因没建立自己的脚本文 件,直接修改 demo-arm.sh 文件而导致编译出错, demo.sh 不用改动)

编译成功后,当我准备再次打开该文件时,发现它会立即又重新进行编译,时间很久,大概半点钟到一点钟,因而将其直接关闭。

而打开 demo.h 时其内容也与原先不同。

并且原先因编译失败而存放在其他临时文件夹内的相应文件内容也全部改变。

以下为修改后编译前的 arm.sh 文件代码(只标出需要改动部分):

TARBALLS_DIR /home/yourname/sources # 定义工具链源码所存放位置

RESULT_TOP=/home/yourname/arm_tools/crosstool # 定义工具链的安装目录

 

3. 建立配置文件

修改后的 arm.dat 文件内容如下:

KERNELCONFIG='pwd'/arm.config # 内核的配置

TARGET=arm-linux # 编译生成的工具链名称,需改动部分

TARGET_CFLAGS="-O" # 编译选项

修改后的 gcc-3.3.6-glibc-2.3.2.dat 文件内容如下:

LINUX_DIR=linux-2.6.10

( 各选项版本号要对应好你的源文件 )

 

4. 执行脚本

$ cd crosstool-0.43

$ ./arm.sh

编译成功后会在 /home/yourname/arm_tools/crosstool/gcc-3.3.6-glibc-2.3.2/arm.linux/bin 下生成新的交叉 编译工具,共 14 项,以下就不一一列举了。

 

5. 添加环境变量

改变权限

yourname@yourname-desktop:~$ sudo chown yourname /etc

[sudo] password for yourname:

整个文件夹的权限都会改变

换回原来权限

yourname@yourname-desktop:~$ sudo chown root /etc

仅改变 bash.bashrc 的权限(不用验证密码,因为在通过验证后 5 分钟内不用再次验证)

yourname@yourname-desktop:~$ sudo chown yourname /etc/bash.bashrc

bash.bashrc 文件的最后添加下面一行

export PATH=/home/yourname/arm_tools/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin:$PATH

测试是否添加成功的方法,输入 echo $PATH , 若输出以上信息说明添加成功。

 

6. 测试

写了一个 hello.c 的测试程序,输入

~$ arm-linux-gcc -o hello hello.c

发现 bash: arm-linux-gcc :找不到命令

解决措施:重启系统就行。(待观)

后发现此法不妥,于是重新编译一次,结果成功了(成功的话在 /home/yourname/arm_tools/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin 文件下会出现总共 22 个新的交叉编译工具,包括 arm-linux-gcc 等,之前出现的错误 bash: arm-linux-gcc :找不到命令就是因为当时编译过程中不完整,有的没有编译 好,导致残缺不全)

(或者直接输入 arm-linux-gcc -v ,而出现其版本等信息也可说明该链编译成功)

 

编译好了以后就可以下载到目标机进行测试了,当然也可以先在 PC 机上测试正误。用 gcc hello.c –o hello 就可以生成在 PC 机上可以运行程序了,在运行 ./hello 可以发现终端显示 hello! 字样。用 arm-linux-gcc 编译的程序( arm-linux-gcc hello.c –o hello ( arm-linux-gcc -o hello hello.c , 两种都行)在 PC 机上是不能运行的,运行后给出错误报告: bash: ./hello :无法执行二进制文件。说明经过交叉编译环境编译出的文件 是硬件可执行的二进制代码文件。

posted @ 2012-07-02 17:02  董雨  阅读(530)  评论(0编辑  收藏  举报