首先我要先吐槽一下这本《嵌入式Linux应用开发》蛋疼无比的书。尼玛。里面的东西也太旧了把。都能成古董了!!!!所以书里面教的交叉编译工具链的建立方法已经早已不适应(当然你直接用书上建好的请忽略本文)。因此花了四天时间研究了一下交叉编译工具链搭建。
本次基于Ubuntu12.04.4(32位的也就是i386)+croostool-ng-1.9.3
已S3C2440为例。该处理器属于ARMv4t版本。ARM920T系列。
话不多说进入正题。
作者:强势控局
时间:2014.03.26
croostool-ng下载地址 http://crosstool-ng.org/
#第一步
由于Linux的软件有很大的相关性。因此需要装一些相关软件
sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch cvs cvsd gawk aria2 curl subversion gawk
注意 ! 在CVSD的安装下会提示输入路径。按照提示上的/usr………………填写就OK了。
#第二步
# 建立安装目录,所有的文件都在这个下面
mkdir /work/crosstool
# 切换目录
cd /work/crosstool
# 下载 crosstool-ng-1.9.3 到 crosstool 目录
http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.9.3.tar.bz2
# 解压到当前目录
tar xjf crosstool-ng-1.9.3.tar.bz2
# 建立一些待会儿会用到的相关目录,到时到这个目录下面去 build
mkdir crosstool-build
# crosstool-ng-1.9.3 安装到这个下面,
mkdir crosstool-install
# 下载的交叉编译器等软件包都放在这个下面,crosstool-ng-1.9.3 build 的时候,所需要的包的路径指向这个文件夹
mkdir src
# 交叉编译工具安装到这个目录下,最后要把它加入 PATH
mkdir tools
# 进入到解压的目录
cd crosstool-ng-1.9.3
# 这里要用绝对路径!
./configure --prefix=/work/crosstool/crosstool-instal 这里填的是安装路径了。l
make
make install
export PATH="${PATH}:/work/crosstool/crosstool-install/bin"
# 之后就可以用 ct-ng 命令了
第三步
# ct-ng help # 查看帮助
# ct-ng list-samples # 看看支持那些 samples
# ct-ng show-arm-unknown-linux-gnueabi #显示具体的一个 sample 所要求的包,显示如下
# OS : linux-2.6.33.7
# Companion libs : gmp-4.3.2 mpfr-2.4.2 libelf-0.8.13
# binutils : binutils-2.19.1
# C compiler : gcc-4.3.2 (C,C++,Fortran,Java)
# C library : glibc-2.9
# Tools : dmalloc-5.5.2 duma-2_5_15 gdb-6.8 ltrace-0.5.3 strace-4.5.19
然后下载 这些文件直接到官网下载时间比较长,网络资源比较散我把它们打包放到百度网盘里了,分享链接为
http://pan.baidu.com/s/1nItbC
解压的时候需要安装7zip解压包。具体指令问度娘~。
文件如下图
也可以自己去下载,下载链接如下速度较慢:(下载到 src 目录下!)
# linux-2.6.33.7
https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.7.tar.bz2
# gmp-4.3.2
http://ftp.gnu.org/gnu/gmp/gmp-4.3.2.tar.bz2
# mpfr-2.4.2
http://ftp.gnu.org/gnu/mpfr/mpfr-2.4.2.tar.bz2
# libelf-0.8.13
http://www.mr511.de/software/libelf-0.8.13.tar.gz
# binutils-2.19.1
http://ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.bz2
# gcc-4.3.2
http://ftp.gnu.org/gnu/gcc/gcc-4.3.2/gcc-4.3.2.tar.bz2
# glibc-2.9
http://ftp.gnu.org/gnu/glibc/glibc-2.9.tar.bz2
# dmalloc-5.5.2
ftp://ftp.uwsg.indiana.edu/linux/gentoo/distfiles/dmalloc-5.5.2.tgz
# duma-2_5_15
http://gnome-build-stage-5.googlecode.com/files/duma_2_5_15.tar.gz
# gdb-6.8
http://mirrors.usc.edu/pub/gnu/gdb/gdb-6.8.tar.bz2
# ltrace-0.5.3
http://ftp.debian.org/debian/pool/main/l/ltrace/ltrace_0.5.3.orig.tar.gz
# strace-4.5.19
# 除了上面的文件如果不安装以下文件建立的时候还是会提示要下载。所以一并下载了。
# expat-2.0.1.tar.gz
http://downloads.sourceforge.net/expat/expat-2.0.1.tar.gz
# glibc-ports-2.9.tar.bz2
http://ftp.gnu.org/gnu/libc/glibc-ports-2.9.tar.bz2
# ncurses-5.7.tar.gz
http://ftp.gnu.org/gnu/ncurses/ncurses-5.7.tar.gz
#http://wenku.baidu.com/view/89e98ec45fbfc77da269b10e.html 也列出了一些包,这里也装上
# ecj-latest.jar
http://www.mirrorservice.org/sites/sourceware.org/pub/java/ecj-latest.jar
# sstrip.c
https://dev.openwrt.org/export/20154/trunk/tools/sstrip/src/sstrip.c
第四步
# 切换目录
cd crosstool-build/
# 拷贝配置文件到 crosstool-build 目录
cp ../crosstool-ng-1.9.3/samples/arm-unknown-linux-gnueabi/* .
# 修改文件名
mv crosstool.config .config
# 运行命令
ct-ng menuconfig
# 出现一个对话框, (后面有图有真相)
# Paths and misc options ---> 选择
# ××× Paths *** 选择 刚刚下载的包的存放路径
# (/work/crosstool/src) Local tarballs directory
# 选择要把工具安装在哪个目录下
# (/work/crosstool/tools) Prefix directory
# *** BUild hehavior *** 设置并行数目为 2 个,提高软件编译的速度。
# (2) Number of parralle jobs
# Target Options --->
这里根据具体CPU型号所属关系设置。芯片手册都有的。
# (armv4t) Architecture level
# (arm9tdmi) Emit assembly for CPU
# (arm920t) Tune for CPU
# C compiler --->
# *** Additional supported lanuages: *** 取消 Fortran 和 Java
# [*] C++
# [] Fortran
# [] Java
# 最后保存 Save and Alternate Configuration File
# 保存文件名仍为 .config
# 退出
各设置如下面的图:
# 编译前,要将刚刚下载好的包放在 刚刚指定的 src 目录下
# 可以用 cat .config 查看刚刚保存的配置
# 然后 在当前目录输入 ct-ng build
# ct-ng build
#耗时有点多。刚才忘记把信息导出来了。不能截图了。凑合看看吧。
可以去泡个咖啡。打个LOL之后在来看看编译完了没有。我编译时花了一个多小时。
# 编译结果如下 只剩这一段尾巴了。不要介意啊。
[EXTRA] Building strace
[EXTRA] Installing strace
[INFO ] Installing strace: done in 17.20s (at 54:43)
[INFO ] =================================================================
[INFO ] Cleaning-up the toolchain's directory
[INFO ] Stripping all toolchain executables
[EXTRA] Installing the populate helper
[EXTRA] Installing a cross-ldd helper
[EXTRA] Creating toolchain aliases
[EXTRA] Removing access to the build system tools
[INFO ] Cleaning-up the toolchain's directory: done in 2.47s (at 54:45)
[INFO ] Build completed at 20130820.162558
[INFO ] (elapsed: 54:45.35)
[INFO ] Finishing installation (may take a few seconds)...
# 编译完后,添加环境变量
vim /etc/envirnment 在第一句末尾添加。:/work/crosstool/tools/bin 保存退出。
#执行一下命令。
export PATH="${PATH}:/work/crosstool/tools/bin"
第五步
在 tools/bin 目录下 创建符号链接,就可以用 arm-linux-gcc 等命令了
sudo ln -s arm-unknown-linux-gnueabi-g++ arm-linux-g++
sudo ln -s arm-unknown-linux-gnueabi-objcopy arm-linux-objcopy
sudo ln -s arm-unknown-linux-gnueabi-gcc arm-linux-gcc
sudo ln -s arm-unknown-linux-gnueabi-objdump arm-linux-objdump
sudo ln -s arm-unknown-linux-gnueabi-gcc-4.3.2 arm-linux-gcc-4.3.2
sudo ln -s arm-unknown-linux-gnueabi-populate arm-linux-populate
sudo ln -s arm-unknown-linux-gnueabi-addr2line arm-linux-addr2line
sudo ln -s arm-unknown-linux-gnueabi-gccbug arm-linux-gccbug
sudo ln -s arm-unknown-linux-gnueabi-ranlib arm-linux-ranlib
sudo ln -s arm-unknown-linux-gnueabi-ar arm-linux-ar
sudo ln -s arm-unknown-linux-gnueabi-gcov arm-linux-gcov
sudo ln -s arm-unknown-linux-gnueabi-readelf arm-linux-readelf
sudo ln -s arm-unknown-linux-gnueabi-as arm-linux-as
sudo ln -s arm-unknown-linux-gnueabi-gdb arm-linux-gdb
sudo ln -s arm-unknown-linux-gnueabi-run arm-linux-run
sudo ln -s arm-unknown-linux-gnueabi-c++ arm-linux-c++
sudo ln -s arm-unknown-linux-gnueabi-gdbtui arm-linux-gdbtui
sudo ln -s arm-unknown-linux-gnueabi-size arm-linux-size
sudo ln -s arm-unknown-linux-gnueabi-cc arm-linux-cc
sudo ln -s arm-unknown-linux-gnueabi-gprof arm-linux-gprof
sudo ln -s arm-unknown-linux-gnueabi-strings arm-linux-strings
sudo ln -s arm-unknown-linux-gnueabi-c++filt arm-linux-c++filt
sudo ln -s arm-unknown-linux-gnueabi-ld arm-linux-ld
sudo ln -s arm-unknown-linux-gnueabi-strip arm-linux-strip
sudo ln -s arm-unknown-linux-gnueabi-cpp arm-linux-cpp
sudo ln -s arm-unknown-linux-gnueabi-ldd arm-linux-ldd
sudo ln -s arm-unknown-linux-gnueabi-ct-ng.config arm-linux-ct-ng.config
sudo ln -s arm-unknown-linux-gnueabi-nm arm-linux-nm
最后# 测试刚刚安装的编译链,编写一个 Hello world 程序,存为 hello.c
arm-linux-gcc -o hello hello.c
# 编译好后,使用 file test 查看文件信息。!!!注意,该文件不能在linux上运行!!!
file hello
至此。交叉编译环境已经完成了。