织梦CMS - 轻松建站从此开始!

罗索

构建ARM Linux交叉编译工具链--Crosstool

落鹤生 发布于 2010-04-06 21:42 点击:次 
在同一个体系平台上开发程序属于本地编译,在不同的体系平台上开发其他平台的程序,这时就需要利用交叉编译工具链,属于交叉编译。而现在我正是在i386 平台上开发arm体系的程序,这时就需要交叉编译工具了。
TAG:

       在同一个体系平台上开发程序属于本地编译,在不同的体系平台上开发其他平台的程序,这时就需要利用交叉编译工具链,属于交叉编译。而现在我正是在i386平台上开发arm体系的程序,这时就需要交叉编译工具了。

       通常构建交叉工具链有3种方法。

方法一  分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用方法二或方法三构建交叉工具链。

方法二  通过Crosstool脚本工具来实现一次编译生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。

方法三  直接通过网上(ftp.arm.kernel.org.uk)下载已经制作好的交叉编译工具链。该方法的优点不用多说,当然是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名的错误,建议读者慎用此方法。

在这里我指介绍第二种方法,即使用Crosstool工具构建构建ARM Linux交叉编译工具链。那现在就具体讲讲吧。

Crosstool是一组脚本工具集,可构建和测试不同版本的gcc和glibc,用于那些支持glibc的体系结构。它也是一个开源项目,下载地址是http://kegel.com/crosstool。用Crosstool构建交叉工具链要比上述的分步编译容易得多,并且也方便许多,对于仅仅为了工作需要构建交叉编译工具链的读者建议使用此方法。用Crosstool工具构建所需资源如表所示。

表  所需资源

安装包

下载地址

crosstool-0.43.tar.gz

http://kegel.com/crosstool

linux-2.6.8.tar.gz

ftp.kernel.org

binutils-2.15.tar.bz2

ftp.gnu.org

gcc-3.3.6.tar.gz

ftp.gnu.org

glibc-2.3.2.tar.gz

ftp.gnu.org

glibc-linuxthreads-2.3.2.tar.gz

ftp.gnu.org

linux-libc-headers-2.6.12.0.tar.bz2

ftp.gnu.org

1.准备资源文件

首先从网上下载所需资源文件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(其实在这里只要下载一个

crosstool-0.43.tar.gz就可以了,因为这个工具很智能的,在之后的构建是会自动下载所需要的工具的)。然后将这些工具包文件放在新建的/home/vigi/downloads目录下,最后在/home/vigi目录下解压crosstool-0.43.tar.gz,命令如下:

# tar –xvzf crosstool-0.43.tar.gz

接着需要建立自己的编译脚本,起名为vigi-arm.sh,为了简化编写vigi-arm.sh,寻找一个最接近的脚本文件demo-arm.sh作为模板,然后将该脚本的内容复制到vigi-arm.sh,修改vigi-arm.sh脚本,具体操作如下:

修改后的vigi-arm.sh脚本内容如下:

#!/bin/sh

set -ex

TARBALLS_DIR=$HOME$/downloads   # 定义工具链源码所存放位置。

RESULT_TOP=/opt/crosstool            # 定义工具链的安装目录

export TARBALLS_DIR RESULT_TOP

GCC_LANGUAGES="c,c++"                # 定义支持C, C++语言

export GCC_LANGUAGES

# 创建/opt/crosstool目录

mkdir -p $RESULT_TOP

# 编译工具链,该过程需要数小时完成。

eval 'cat arm.dat gcc-3.3.6-glibc-2.3.2.dat'  sh all.sh --notest

echo Done.

3.建立配置文件

在vigi-arm.sh脚本文件中需要注意arm.dat和gcc-3.3.6-glibc-2.3.2.dat两个文件,这两个文件是作为Crosstool的编译的配置文件。其中arm.dat文件内容如下,主要用于定义配置文件、定义生成编译工具链的名称以及定义编译选项等。

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

TARGET=arm-linux                # 编译生成的工具链名称

TARGET_CFLAGS="-O"                # 编译选项

gcc-3.3.6-glibc-2.3.2.dat文件内容如下,该文件主要定义编译过程中所需要的库以及它定义的版本,如果在编译过程中发现有些库不存在时,Crosstool会自动在相关网站上下载,该工具在这点上相对比较智能,也非常有用。

BINUTILS_DIR=binutils-2.15

GCC_DIR=gcc-3.3.6

GLIBC_DIR=glibc-2.3.2

GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2

LINUX_DIR=linux-2.6.10

LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0

4.执行脚本

将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉编译工具。具体执行命令如下:

# cd crosstool-0.43

# ./vigi-arm.sh 

经过数小时的漫长编译之后,会在/opt/crosstool目录下生成新的交叉编译工具,其中包括以下内容:

arm-linux-addr2line arm-linux-g++        arm-linux-ld         arm-linux-size

arm-linux-ar         arm-linux-gcc        arm-linux-nm         arm-linux-strings

arm-linux-as         arm-linux-gcc-3.3.6 arm-linux-objcopy   arm-linux-strip

arm-linux-c++        arm-linux-gccbug    arm-linux-objdump   fix-embedded-paths

arm-linux-c++filt   arm-linux-gcov       arm-linux-ranlib

arm-linux-cpp        arm-linux-gprof      arm-linux-readelf

安装之后的结果

5.添加环境变量

然后将生成的编译工具链路径添加到环境变量PATH上去,添加的方法是在系统/etc/ bashrc文件的最后添加下面一行,如图2.2所示。

图2.2  用Vi编辑器在bashrc文件中添加环境变量

export PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.2/arm-linux/bin:$PATH 

设置完环境变量,也就意味着交叉编译工具链已经构建完成。之后就可以测试了,在这儿就不在提了。

值得一提的是,由于在这个 过程中需要上网,而我的linux是装在VMware上的,所以在这里上网的设置在前面的几篇文章中我已经写过了,大家可以去看看。还就就是,这些操作最好在非root用户下。

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9016.html]
本文出处:网络博客 作者:秩名
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容