- $ mkdir /home/lee/arm
- $ mkdir /home/lee/arm/downloads
下载诸多文件包:
- crosstool-0.43.tar.gz
- linux-2.6.15.tar.gz
- binutils-2.16.tar.gz
- gcc-4.1.0.tar.gz
- glibc-2.3.2.tar.gz
- glibc-linuxthreads-2.3.2.tar.gz
- linux-libc-header-2.6.12.0.tar.bz2
- tar -zxvf crosstool-0.43.tar.gz
一.建立脚本文件
因为本次交叉编译是为了在arm9架构的处理器s3c2440开发板上用,我们要创建的是针对于arm9tdmi架构的arm-linux-gcc,应用crosstool提供的模板:demo-arm9tdmi.sh。首先要修改:
- $ cd crosstool-0.43
- $ gedit demo-arm9tdmi.sh
- TARBALLS_DIR=$HOME/arm/downloads
- RESULT_TOP=/opt/crosstool
- ...
- eval 'cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat' sh all.sh -notest
- ...
二.建立配置文件
demo-arm9tdmi.sh脚本文件会访问demo-arm9tdmi.dat和gcc-4.1.0-glibc-2.3.2.dat两个文件,这两个文件是crosstool编译的配置文件。
demo-arm9tdmi.dat文件用于定义内核配置,定义生成工具链的名称(如arm-linux-gcc),以及编译选项,我们只修改生成工具链名称,其他默认。如下:
- TARGET=arm-linux-
- # /arm/downloads/gcc-4.1.0-glibc-2.3.2.dat
- BINUTILS_DIR=binutils-2.16.1
- GCC_CORE_DIR=gcc-3.3.6
- GCC_DIR=gcc-4.1.0
- GLIBC_DIR=glibc-2.3.2
- LINUX_DIR=linux-2.6.15
- LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
- GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
- GDB_DIR=gdb-6.5
三.执行脚本
在执行脚本前发生了小插曲,系统中的gcc是gcc-4.4版本的,太过于新以至于编译过程中提示gcc版本太旧(无语,linux的自由带给普通开发者的是无穷的变数与不确定;不统一的版本,各种的不一致不协调。这本身就是一种巨大的障碍,自由之祸)。后参考网上教程编译安装了gcc-3.3.6,注意编译好gcc-3.3.6后,一定要和系统里gcc建立链接,我采取了把原来链接(gcc和gcc-4.4链接一起)删除,然后建立新的链接:
- $ rm /usr/bin/gcc
- $ ln -s /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin/gcc gcc
- $ cd $HOME/arm/crosstool-0.43
- $ ./demo-arm9tdmi.sh
最后将工具链所在路径添加到环境变量PATH中去,以方便在终端环境下直接调用相应工具。方法是用root打开/etc/bash.bashrc文件,在最后一行添加:
- export PATH=/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin:$PATH
在整个编译过程中,发现了太多的不确定的东西,在编译过程中会出现各种文件确实和编译错误。原因一方面是因为某些文件本身存在bug(如gdb-6.5的一行代码在gcc-4.1下根本编译不过去),另一方面是因为linux的不断变化不断更新,致使很多文件都“不配套“。这些东西确实很让人气馁。
作此小结,继续努力。
2012.1.7 by lee
reference:
<<嵌入式linux系统开发教程>> 贺丹丹 清华大学出版社
网络上诸多帖子,不一一列举。