交叉编译器是一种可以在平台A上为另一种平台B编译程序的编译器。其中,运行交叉编译器的平台A称为宿主机,交叉编译生成的目标文件的运行平台B称为目标机。交叉编译器的编译过程称为交叉编译。
一个完整的arm-linux交叉编译器包括arm-linux-gcc、glibc、binutils等组件。其中,arm-linux-gcc是为ARM平台编译C程序的编译器;glibc是嵌入式C程序所需的基本函数库;binutils包含一组二进制工具。所以交叉编译器又称为交叉编译工具链。
由于交叉编译器中每个组件都有各自的版本,所以可以使用不同版本的组件来制作交叉编译器。但是,组件之间会因版本不匹配的问题产生错误。为了避免这种麻烦,建议直接使用制作好的arm-linux交叉编译器。
建立嵌入式linux的基础是建立基于ARM平台的交叉编译工具链。通常构建交叉工具链有3种方法:
方法一 分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。
方法二 通过Crosstool脚本工具来实现一次编译生成交叉编译工具链。
方法三 直接从网上()下载已经制作好的交叉编译工具链。
1、准备资源文件
下载crosstool-0.43.tar.gz。
下载地址:http://kegel.com/crosstool/crosstool-0.43.tar.gz
内核linux-2.6.24.tar.gz 下载地址:
其他资源是:binutils-2.16.1.tar.gz、gcc-3.3.6.tar.bz2、gdb-6.5.tar.bz2、glibc-linuxthreads-2.3.2.tar.gz、linux-libc-headers-2.6.12.0.tar.bz2、gcc-4.1.1.tar.bz2、glibc-2.3.2.tar.gz、linux-2.6.24.tar.gz。下载地址为:ftp.gnu.org
用户目录为david,将crosstool-0.43.tar.gz在/home/david目录下解压,使用root用户登录,解压命令如下:
# cd /home/david/crosstool-0.43
# tar –xvzf crosstool-0.43.tar.gz
将其他资源放在/home/david/downloads目录下。
# cd /home/david/crosstool-0.43
# cp demo-arm.sh arm.sh
# vi arm.sh
修改后的arm.sh脚本内容如下:
#!/bin/sh
# This script has one line for each known working toolchain
# for this architecture. Uncomment the one you want.
# Generated by generate-demo.pl from buildlogs/all.dats.txt
set -ex
TARBALLS_DIR=/home/david/downloads
RESULT_TOP=/home/david/crosstool
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES
# Really, you should do the mkdir before running this,
# and chown /opt/crosstool to yourself so you don't need to run as root.
mkdir -p $RESULT_TOP
#eval `cat arm.dat gcc-2.95.3-glibc-2.1.3.dat` sh all.sh --notest
#eval `cat arm.dat gcc-2.95.3-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-2.95.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.3.6-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.1.0-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest --gdb
echo Done.
其中RESULT_TOP=/home/david/crosstool是为了编译时的操作全在david用户的权限范围内。如果写的是/opt/crosstool,david用户就没有权限进行操作,也就不能编译成功了。
3、建立配置文件
arm.dat文件主要用于定义配置文件、定义生成编译工具链的明晨以及定义
编译选项等。命令如下:
# cd /home/david/crosstool-0.43
# vi arm.dat
修改后arm.dat内容如下:
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux
TARGET_CFLAGS="-O"
gcc-4.1.1-glibc-2.3.2.dat文件主要定义编译过程中所需要的库以及它定义的版本。命令如下:
# cd /home/david/crosstool-0.43
# vi gcc-4.1.1-glibc-2.3.2.dat
修改后gcc-4.1.1-glibc-2.3.2.dat内容如下:
BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.1
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.24
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5
5、执行脚本
在/home/david目录下新建一个crosstool目录,并将crosstool和crosstool-0.43目录的权限设置为当前用户和同组用户可读可写可执行,为了简便,可设置为777。然后切换为david用户后执行脚本文件arm.sh。命令如下:777 crosstool
# chmod 777 crosstool$ ./arm.sh
你可以出去喝杯咖啡或者看部电影,大约两小时后在/home/david/crosstool目录下生成新的交叉编译工具。
6、添加环境变量
使用命令sudo su切换到root用户,在系统/etc目录下的profile