建立ARM Linux GCC交叉编译环境
crosstool 和ezx-cross的区别,ezx-crosstool是将crosstool精简后加上浮点运算,以及ezx平台的其他一些补丁,适用于ezx平台。
在编译ezx-crosstool时,可能出现PATH_MAX not defined,之类的错误,删除printf语句下面的PATH_MAX即可。
虽然网上的教程和工具已经很多了,但是安装的时间还是超出了我的估计。
现在写出完整的建立过程。中间借鉴了很多人的经验,复制粘贴了他们的教程。。感谢。。
终端可以设置程序关闭时不自动关闭。。。我浪费了很多时间才发现的,这样才能看见错误。
一.电脑补丁和安装
1.sudo apt-get install Bison flex build-essential patch libncurese5-dev
2.降低gcc版本
(1)第一种方法:直接在终端输入安装gcc-4.1
sudo apt-get install gcc-4.1
(2)第二种方法:下载下列软件包:
gcc-4.1_4.1.2-23Ubuntu3_i386.deb
gcc-4.1-base_4.1.2-23ubuntu3_i386.deb
cpp-4.1_4.1.2-23ubuntu3_i386.deb
然后sudo dpkg –i *.deb
安装就可以了
sudo rm /usr/bin/gcc (删除GCC,它只是个到gcc-4.3.2的软链接文件)
sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc (建立GCC到gcc-4.1的软链接)
3、修改sh版本
如果运行
ls -la /bin/sh
看到链接的是 dash ,则请运行以下命令
sudo dpkg-reconfigure dash
选择 no 以删除 dash
二.软件准备
1.下载crosstool-0.43.tar.gz,这个是最重要的。
6个软件,这6个软件版本不是规定的,可以更新。下好了是为了安装快速,否则crosstool会自动下载,耽误时间。
glibc-2.3.6.tar.gz
linux-2.6.26.5.tar.gz
crosstool-0.43.tar.gz
binutils-2.15.tar.gz
glibc-linuxthreads-2.3.3.tar.gz
linux-libc-headers-2.6.12.0.tar.bz2
2 .修改demo-arm-softfloat.sh
$vim demo-arm-softfloat.sh
修改下面两句
TARBALLS_DIR=/home/linux/downloads(你下载下面那6个软件的存放目录)
RESULT_TOP=/home/linux/crosstools(生成工具链目录)
3.修改 gcc-3.4.5-glibc-2.3.6.dat,注意文件名字和你下载的软件包对应,除去后缀名。
$ vim gcc-3.4.5-glibc-2.3.6.dat
修改内容为:
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.26.5
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
终端运行demo-arm-softfloat.sh(半小时左右)
此时可能出现的错误:
(1)编译到glibc的时候,在配置的时候会检测gcc的版本,configure 脚本认为gcc-4.3.2版本太老(其实是因为当时gcc还没有这么高的版本,只要不是3.2到4.1之间的版本,都认为too old),不能编译。
这是可以解决的,方法就是修改glibc-2.3.2根目录下的configure 文件中的第1275行:
test -n "$CC" && break
done
if test -z "$CC"; then
ac_verc_fail=yes
else
# Found it, now check the version.
echo "$as_me:$LINENO: checking version of $CC" >&5
echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version /([egcygnustpi-]*[0-9.]*/).*$//1/p'`
case $ac_prog_version in
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
3.[2-9]*|4.[0- 3]*)
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
(2)编译gcc-3.3.6的时候,出现以下错误:
/usr/include/bits/fcntl2.h:51: error: call to '__open_missing_mode' declared with attribute error: open with O_CREAT in second argument needs 3 arguments
在gcc-3.3.6/gcc/collect2.c中的第1575行改为:
redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT, 0777 );
glibc-2.3.2/login/tst-grantpt.c也有一个类似错误,第44行:
fd = open (file, O_RDWR | O_CREAT, 0777 );
(3)*** buffer overflow detected ***: arm-9tdmi-linux-gnu-ar terminated
没办法,只能放弃gcc-4.3.2。
(4)In file included from version.c:33:
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:2:1: missing terminating " character
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:3:1: missing terminating " character
解决办法:
sudo mv /bin/sh /bin/sh.old
sudo ln -sf bash /bin/sh
(5)configure: error: no termcap library found
用新立得安装libncurses5-dev(或是apt-get install libncurses5-dev)即可。
如果这时候还没看见done,我也没办法了。。。