构建嵌入式交叉编译工具链

来源:互联网 发布:淘宝店美妆图片素材 编辑:程序博客网 时间:2024/05/18 13:29


所谓交叉编译环境,就是在普通的 PC 机编译生成能在目标机(如 ARM )上运行的软件。在 GNU 对工具链的定义中,整个交叉编译工具链 应该是 GCC + binutils + glibc 。其中 GCC 又包括了预编译器 cpp 、 C 编译器 gcc 、汇编器 as 和链接器 ld 。

交叉编译工具链的获得方式:


( 1 )从网上下载已经构建好的交叉编译工具链,比如 ARM 的交叉编译工具链可以从 ftp://ftp.arm.linux.org.uk/pub/linux/arm/toochain/ 下载。注意这些已经做好了的交叉编译工具链往往规定了安装的路径(因为在编译时就制定了路径 --prefix ),可以查看一下 README 文档,通常的路径是“ /usr/local/arm/x.x.x ”,这时需要将工具包解压到这个路径下。


( 2 )使用 crosstool 自己构建,下面以构建 ARM 交叉编译工具链为例,说明构建步骤。


1.  下载 crosstool-0.43.tar.gz

【 crosstool-0.43.tar.gz 】 http://kegel.com/crosstool/crosstool-0.43.tar.gz

 

2.  配置 crosstool-0.43
[leo@ crosstool]$ tar zxvf crosstool-0.43.tar.gz

[leo@ crosstool]$ cd crosstool-0.43

[leo @ crosstool-0.43]$ vi demo-arm.sh

修改下面几行,即设置 tarball 的路径、编译结果顶层路径以及需要编译的 gcc 版本。

TARBALLS_DIR=$HOME/Downloads

RESULT_TOP=$HOME/crosstool/arm

eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest


[leo @ crosstool-0.43]$ vi gcc-4.0.0-glibc-2.3.2.dat

BINUTILS_DIR=binutils-2.16.1

GCC_DIR=gcc-4.0.0

GLIBC_DIR=glibc-2.3.2

LINUX_DIR=linux-2.6.15.4

LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0

GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2

GCC_CORE_DIR=gcc-3.3.6

将以上所需的 tarball 放到 $(TARBALLS_DIR) 目录下面。

[leo @ crosstool-0.43]$ vi arm.dat

KERNELCONFIG=`pwd`/arm.config

TARGET=arm-linux

TARGET_CFLAGS="-O"


[leo @ crosstool-0.43]$ ./demo-arm.sh

系统开始编译, 所有使用到的文件 ( 如果没有预先存放在 $(TARBALLS_DIR) 目录下面 ) ,则会在编译的时候自动下载。编译的时间可能需要几个小时。

TARBALLS_DIR :是下载的工具源码压缩包的存放目录。

RESULT_TOP  :是要生成的工具链的存放目录,要有写权限的目录,不然无法编译。


3. 所需工具源码压缩包的下载地址

【 binutils-2.16.1.tar.bz2 】 http://ftp.gnu.org/gnu/binutils/

【 gcc-4.0.0.tar.bz2 】 http://ftp.gnu.org/gnu/gcc/gcc-4.0.0/

【 glibc-2.3.2.tar.bz2 】 http://ftp.gnu.org/gnu/glibc/

【 linux-2.6.15.4.tar.bz2 】 http://ftp.kernel.org/pub/linux/kernel/v2.6/

【 glibc-linuxthreads-2.3.2.tar.bz2 】 http://ftp.gnu.org/gnu/glibc/

【 gcc-3.3.6.tar.bz2 】 http://ftp.gnu.org/gnu/gcc/gcc-3.3.6/

【 gdb-6.5.tar.bz2 】 http://ftp.gnu.org/gnu/gdb/

以上就是编译交叉编译工具所用到的源文件组合,这个组合可以成功编译,关于那些组合可以成功编译可以参照 http://kegel.com/crosstool/crosstool-0.43/buildlogs/ 表格。

 

4. 在 UBUNTU 下编译出现的错误

( 0 )需要安装 bison 和 flex

sudo apt-get install bison flex


( 1 )编译过程中出现一个问题,说是 gcc 版本太旧,其实是 gcc 版本太新了,解决如下:

先查看当前 gcc 的版本 gcc –version ,比如我当前的 gcc 版本 gcc-4.4

sudo apt-get install gcc-3.4

sudo rm /usr/bin/gcc

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

注意编译完成以后要恢复成原来的版本 , 如下:

sudo rm /usr/bin/gcc

ln -s   /usr/bin/gcc-4.3   /usr/bin/gcc

注意:在较新的 UBUNTU 中, sudo apt-get install gcc-3.4 会出现 E: Couldn’t find package gcc-3.4 ,此时需要手动到 http://packages.ubuntu.com/ 去下载较旧版本的安装包,并自行处理包的依赖关系。


( 2 )出现如: build-glibc/csu/version-info.h:1:1:  missing terminating " character

系统在编译生成 version.o 时候发现 version-info.h 文件有错误,解决如下:

解压 glibc-2.3.2.tar.bz2

找到 glibc-2.3.2/csu 目录下的 Makefile 按如下修改:

文件末尾有 2 处 echo

echo "/"Compiled on a $$os $$version system" /

      "on`date +%Y-%m-%d`.//n/"" ;; /
改为:

echo "/"Compiled on a $$os $$version system" /

      "on `date +%Y-%m-%d`.////n/"" ;; /

echo "/"Available extensions://n/""; /

改为:

echo "/"Available extensions: ////n/""     /

保存并重新压缩为 glibc-2.3.2.tar.bz2 覆盖原来 $(TARBALLS_DIR) 目录下的 glibc-2.3.2.tar.bz2 ,转到 crosstool-0.43 目录下从新执行。

原创粉丝点击