Ubuntu10.04安装配置笔记-使用crosstool建立交叉编译器
从上下载解压crosstool后,对demo-*.sh, gcc-*glibc-*.dat脚本进行配置,配置方法参照
配置好crosstool后,运行demo-*.sh脚本有可能得到如下错误:
rookiesean@rookiesan-laptop:~/workspace/crosstool-0.43$ ./demo-arm9tdmi.sh
……………….
……………….
applying patch /home/rookiesean/workspace/crosstool-0.43/patches/glibc-2.3.6/arm-ctl_bus_isa.patch
getandpatch.sh: 1: patch: not found
patch /home/rookiesean/workspace/crosstool-0.43/patches/glibc-2.3.6/arm-ctl_bus_isa.patch failed
安装patch以解决这一问题
rookiesean@rookiesan-laptop:~/workspace/crosstool-0.43$ sudo apt-get install patch
…………………………
…………………………
/home/rookiesean/workspace/crosstool-0.43/crosstool.sh: 110: bison: not found
crosstool: You don’t have bison installed
安装bison以解决这一问题。
rookiesean@rookiesan-laptop:~/workspace/crosstool-0.43$ sudo apt-get install bison
…………………………
…………………………
/home/rookiesean/workspace/crosstool-0.43/crosstool.sh: 111: flex: not found
crosstool: You don’t have flex installed
安装flex以解决这个问题
rookiesean@rookiesan-laptop:~/workspace/crosstool-0.43$ sudo apt-get install flex
………………………..
………………………..
configure: error:
*** These critical programs are missing or too old: as ld
*** Check the INSTALL file for required versions.
这里重点讲一下以上的错误。出现这种情况是因为Ubuntu默认所安装的binutils版本为binutils-2.20, 当binutils太新的时候,crosstool只好将它当成太老的版本,报告说too old; as ld. 于是我们需要重新编译安装一个老版本的binutils, 2.19或者2.18都可以被crosstool所识别,这里拿binutils-2.18举例。但还有一个问题,Ubuntu10.04默认安装的gcc版本是gcc-4.4.3,跟binutils-2.20一样,太高版本的gcc对语法要求更为严格,这样会导致binutils-2.18无法轻松的编译通过,于是我们需要编译安装一个老版本的gcc, 4.1的版本可以编译成功binutils-2.18。在Ubuntu10.04可以通过
rookiesean@rookiesan-laptop:~/workspace/crosstool-0.43$ sudo apt-get install gcc-4.1
安装gcc-4.1。安装完成后运行如下命令:
rookiesean@rookiesan-laptop:~/workspace/crosstool-0.43$ cd /usr/bin
rookiesean@rookiesan-laptop:/usr/bin$ sudo rm gcc
rookiesean@rookiesan-laptop:/usr/bin$ sudo ln -sf gcc-4.1 gcc
rookiesean@rookiesan-laptop:/usr/bin$ gcc -v
得到如下显示:
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v –enable-languages=c,c++ –prefix=/usr –enable-shared –with-system-zlib –libexecdir=/usr/lib –without-included-gettext –enable-threads=posix –enable-nls –with-gxx-include-dir=/usr/include/c++/4.1.3 –program-suffix=-4.1 –enable-__cxa_atexit –enable-clocale=gnu –enable-libstdcxx-debug –with-tune=generic –enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.1.3 20080704 (prerelease) (Ubuntu 4.1.2-27ubuntu1)
表明原先指向gcc-4.4的的符号链接已经被重新指向新安装的gcc-4.1,系统中默认的gcc版本为4.1。
下载binutils-2.18, 将其解压缩后,进入binutils顶层目录,运行
rookiesean@rookiesan-laptop:~/workspace/binutils-2.18$ ./configure –prefix=/home/rookiesean/temp/binutils –disable-nls
rookiesean@rookiesan-laptop:~/workspace/binutils-2.18$ make all
rookiesean@rookiesan-laptop:~/workspace/binutils-2.18$ make install
其中–prefix=/home/rookiesean/temp/binutils表示生成可执行文件的存放位置,可自定义。
编译成功后在/home/rookiesean/temp/binutils/bin/中就生成了ld as程序的可执行文件, 到/usr/bin目录下面将系统默认的ld和as替换成2.18版本的:
rookiesean@rookiesan-laptop:~/workspace/binutils-2.18$ cd /usr/bin
rookiesean@rookiesan-laptop:/usr/bin$ sudo rm as ld
rookiesean@rookiesan-laptop:/usr/bin$ sudo ln -sf /home/rookiesean/temp/binutils/bin/ld ld
rookiesean@rookiesan-laptop:/usr/bin$ sudo ln -sf /home/rookiesean/temp/binutils/bin/as as
rookiesean@rookiesan-laptop:/usr/bin$ ld -v; as -v
得到如下显示:
GNU ld (GNU Binutils) 2.18
GNU assembler version 2.18 (i686-pc-linux-gnu) using BFD version (GNU Binutils) 2.18
表示系统默认的binutils版本已经变换为2.18版本。
接下来,就可以运行demo-*.sh建立属于自己的交叉编译器了。
rookiesean@rookiesan-laptop:~/workspace/crosstool-0.43$ ./demo-arm9tdmi.sh
等一下,还有一个错误。。。-_-!
In file included from version.c:33:
/home/rookiesean/workspace/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-3.4.5-glibc-2.3.6/build-glibc/csu/version-info.h:2: error: missing terminating ” character
/home/rookiesean/workspace/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-3.4.5-glibc-2.3.6/build-glibc/csu/version-info.h:3: error: missing terminating ” character
version.c:40: error: syntax error before string constant
make[2]: *** [/home/rookiesean/workspace/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-3.4.5-glibc-2.3.6/build-glibc/csu/version.o] 错误 1
make[2]:正在离开目录 `/home/rookiesean/workspace/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-3.4.5-glibc-2.3.6/glibc-2.3.6/csu’
make[1]: *** [csu/subdir_lib] 错误 2
make[1]:正在离开目录 `/home/rookiesean/workspace/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-3.4.5-glibc-2.3.6/glibc-2.3.6′
make: *** [lib] 错误 2
老版本的glibc在/bin/sh为dash的时候会出现这个问题,一种解决方法是把/bin/sh重定向为bash,在创建完交叉编译器后可以将/bin/sh重新改回dash,运行如下面命令修改/bin/sh:
rookiesean@rookiesan-laptop:~/workspace/crosstool-0.43$ cd /bin
rookiesean@rookiesan-laptop:/bin$ sudo mv /bin/sh sh.old
rookiesean@rookiesan-laptop:/bin$ sudo ln -sf bash /bin/sh
rookiesean@rookiesan-laptop:/bin$ sh –version
得到如下显示:
GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
搞定,继续编译crosstool并使用自己的交叉编译器吧。