建立ARM Linux GCC交叉编译环境

zhjn0 2011-09-25

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,我也没办法了。。。

相关推荐