这个过程如下(参考 http://www.ibm.com/developerworks/cn/linux/l-embcmpl/)
1. 下载源文件、补丁和建立编译的目录
2.立内核头文件
3. 建立二进制工具(binutils)
4. 建立初始编译器(bootstrap gcc)
5. 建立c库(glibc)
6. 建立全套编译器(full gcc)
我的电脑是装的Ubuntu 10.04 ,不是虚拟机。想建立交叉编译环境,首先你的电脑中得有编译环境,就是那些常见的,例如GCC等。这个我就不写了,网上也是多得是,太常见了。
然后,我们要下载建立所需要的文件。这是列表:
源代码文件及其版本与下载地址:(参考 http://blog.sina.com.cn/s/blog_61803fb80100eaku.html)
binutils-2.19.1.tar.bz2 http://ftp.gnu.org/gnu/binutils/
gcc-4.3.3.tar.bz2 http://ftp.gnu.org/gnu/gcc/gcc-4.3.3
glibc-2.11.tar.bz2 http://ftp.gnu.org/gnu/glibc/
glibc-ports-2.11.tar.bz2 http://ftp.gnu.org/gnu/glibc/
gmp-4.2.4.tar.bz2 http://ftp.gnu.org/pub/gnu/gmp/
linux-2.6.30.1.tar.bz2 http://ftp.kernel.org/pub/linux/kernel/v2.6/
mpfr-2.4.1.tar.bz2 http://www.mpfr.org/mpfr-2.4.1/
建立目录文件
/home/dengnice/
mkdir embedded.
mkdir build-tools kernel tools
设置环境变量
首先终端下的命令:dengnice@dengnice-laptop:~$ vi ~/.bashrc 然后将下面的环境变量加入到.bashrc文件中。
输出环境变量方便我们编译:(这样当你logout或换了控制台时,就不用老是export这些变量了 。)
$export PRJROOT=/home/liang/embedded
$export TARGET=arm-linux
$export PREFIX=$PRJROOT/tools
$export TARGET_PREFIX=$PREFIX/$TARGET $export PATH=$PREFIX/bin:$PATH
把下载的软件包分别放在build-tools kernel tools下解压。
1. dengnice@dengnice-laptop:~/embedded/build-tools/ tar -jxvf glibc-2.11.tar.bz2 可以通过glibc下的config.sub脚本来知道,你的TARGET变量是否被支持,例如:
dengnice@dengnice-laptop:~/embedded/build-tools/glibc-2.11.1/scripts$ ./config.sub arm-linux (我的环境中config.sub在这个目录下)。
解决问题和细节错误:
1.安装ncurses,sudo apt-get install libncurses5-dev
2.make menuconfig后内核中只有version.h,没有autoconf.h,解决方法:退回到linux-2.6.30.1目录下,命令:make autoconf.h,若没有version.h,则make version.h 。
3.在我们编译并安装 gcc 前,我们先要改一个文件 $PRJROOT/gcc/config/arm/t-linux,把TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC这一行改为TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h。(路径不对-应该改为$PRJROOT/gcc-4.3.3/gcc/config/arm/t-linux)
4.然后,将gmp-4.2.4改名gmp和mpfr-2.4.1改名mpfr放入gcc-4.3.3文件夹中。将glibc-ports-2.11改名为ports放入glibc-2.11中
未解决问题:
1. binutils是一些二进制工具的集合,其中包含了我们常用到的as和ld。看一下我们 $PREFIX/bin 下的生成的文件,没有arm-linux-gasp,arm-linux-ld,arm-linux-as,没有ls ld是大问题。。。
好像是gcc版本过高,texinfo跟不上了。sudo apt-get install texinfo。然后
$cd build-binutils
$../binutils-2.10.1/configure --target=$TARGET --prefix=$PREFIX
还是出现问题,看error:ldlang.c文件中有错误。直接根据错误修改ldlang.c文件,每个人的错误可能不一样,根据自己的情况来修改。害我下载了两遍源代码,结果错误都一样。
然后在输入上面的命令,结果OK。
后来出现下面的错误,在没能解决,不过后来看到网上,10.04版本的ubuntu gcc和binutils版本都太高,最好降低。
checking for .protected and .hidden assembler directive... yes
checking whether __attribute__((visibility())) is supported... no
configure: error: compiler support for visibility attribute is required
再次重新根据ubuntu10.04来编译的时候,弄到一半,老师忽然说不用自己编译环境的,自带的有工具链,就没有在弄下去。不过还是有些注意事项:(参考网站:http://czp1013.blog.163.com/blog/static/28370175200891902428430/)
1.在上面的问解决问题中提到了texinfo,不过4.11以上的版本有bug,换成texinfo-4.8解决,还有10.04以上版本的ld,as版本太高,编译binutils的时候会提示too old,安装binutils-2.19即可。gcc-4.3.3也有点高,最好降到4.1左右。
差不多就这么多要注意的把,下面的还没执行,今天忽然说要装Fedora,先把Fedora搞明白去~~