根据昨天的计划,开始重新编译最新版的binutils、arm-linux-gcc和glibc。
一个很严重的问题是——我的磁盘空间不足了。直接使用Windows分区不是个好主意——那样会造成所有文件都变成777属性,看起来很不舒服;用loop设备的方法会好一点。创建loop设备并挂载文件系统的方法:
正式开始编译!
$ export TARGET=arm-linux
$ export PREFIX=/sunny/gccdisk
$ export TARGET_PREFIX=/sunny/gccdisk/arm-linux
跳过了kernel的menuconfig,因为已经做过了;准备好内核头文件
$ cd linux-2.6.25
$ mkdir -p $TARGET_PREFIX/include
$ cp -r include/linux/ $TARGET_PREFIX/include
$ cp -r include/asm-arm/ $TARGET_PREFIX/include/asm
$ cp -r include/asm-generic/ $TARGET_PREFIX/include
开始编译binutils
$ tar -xzf binutils-2.9.1.tar.gz
$ cd ../binutils-2.9.1
$ ./configure --target=$TARGET --prefix=$PREFIX
出现错误:*** BFD does not support target arm-unknown-linux-gnu.
打开bfd/config.bfd一看,对arm只支持这些格式: arm-*-riscix*、arm-*-pe*、arm-*-aout、arm-*-coff,退而求其次,换a.out吧
$ export TARGET=arm-linux-aout
$ export TARGET_PREFIX=/sunny/gccdisk/arm-linux-aout
$ mv $PREFIX/arm-linux $PREFIX/arm-linux-aout
$ ./configure --target=$TARGET --prefix=$PREFIX
creating Makefile成功
$ make
提示libiberty/strerror.c有错,与Ubuntu的头文件定义不一致;在#ifdef NEED_sys_errlist前把这个名称#undef掉,然后#else里的sys_errlist类型改成和Ubuntu头文件一致
$ make
提示libiberty/cplus-dem.c有错,malloc,参考/usr/include/malloc.h改成void *malloc (size_t __size);通过。
$ make
没看到错误提示,估计是成功了
$ make install
打开/sunny/gccdisk一看,出现了很多可执行文件,成功
$ cd ..
开始编译gcc
$ mkdir $PREFIX/gcc-4.3.0
$ ln -l $PREFIX/gcc-4.3.0 gcc-4.3.0
上面两步纯粹为了解决磁盘空间不足问题,不是必须步骤
$ tar -xjf gcc-core-4.3.0.tar.bz2
$ tar -xjf gcc-g++-4.3.0.tar.bz2
如果磁盘足够,可以直接使用gcc-4.3.0.tar.bz2;我不需要java、ada之类的,所以就只要C和C++就行了
由于C++编译器依赖于glibc,现在只能先编译C编译器
$ cd gcc-4.3.0
$ ./configure --target=$TARGET --prefix=$PREFIX --without-headers --with-newlib --enable-languages=c
还缺东西:Building GCC requires GMP 4.1+ and MPFR 2.3.0+.
$ sudo apt-get install libmpfr-dev
mpfr的网站打不开,在谷歌快照里看到了“debian package”,Ubuntu的源里也有这个package
$ ./configure --target=$TARGET --prefix=$PREFIX --without-headers --with-newlib --enable-languages=c
$ make
这个郁闷了:*** Configuration arm-linux-aout not supported;返回arm-linux目标吧
$ export TARGET=arm-linux
$ export TARGET_PREFIX=/sunny/gccdisk/arm-linux
$ ln -s $PREFIX/arm-linux-aout $TARGET_PREFIX
$ ./configure --target=$TARGET --prefix=$PREFIX --without-headers --with-newlib --enable-languages=c
$ make
10分钟后——checking for suffix of object files... configure: error: cannot compute suffix of object files: cannot compile
仔细看看那本Building Embedded Linux System.chm,原来是make目标错了
$ make all-gcc
$ make install-gcc
迅速成功,/sunny/gccdisk/bin出现了可爱的gcc
$ cd ..
下一步是glibc
$ mkdir $PREFIX/glibc-2.7
$ ln -s $PREFIX/glibc-2.7 glibc-2.7
$ tar -xjf glibc-2.7.tar.gz
$ mkdir build
$ cd build
$ CC=$PREFIX/arm-linux/bin/gcc ../configure --host=$TARGET --prefix=$PREFIX --enable-add-ons --with-headers=$TARGET_PREFIX/include
好像不行:checking sysdep dirs... configure: error: The arm is not supported.
看到sysdeps/目录里确实没有arm目录
继续搜索,了解到需要glibc-ports-2.7
$ cd ..
$ wget http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2
$ tar -xjf glibc-ports-2.7
$ CC=$PREFIX/arm-linux/bin/gcc ../configure --host=$TARGET --prefix=$PREFIX --enable-add-ons=../glibc-ports-2.7 --with-headers=$TARGET_PREFIX/include
编译失败,config.log里说ccl找不到;我在$PREFIX/libexec/gcc/arm-linux/4.3.0找到了ccl这个文件,加入path里
$ PATH=$PREFIX/libexec/gcc/arm-linux/4.3.0:$PATH CC=$PREFIX/arm-linux/bin/gcc AR=$PREFIX/bin/arm-linux-aout-ar RANLIB=$PREFIX/bin/arm-linux-aout-ranlib AS=$PREFIX/bin/arm-linux-aout-as LD=$PREFIX/bin/arm-linux-aout-ld ../configure --host=$TARGET --prefix=$PREFIX --enable-add-ons=../glibc-ports-2.7 --with-headers=$TARGET_PREFIX/include
还是失败,config.log说Error: too many memory references for `mov',看起来是x86汇编……
$ cd ../..
暂时没有解决方案,试试uClibc吧
$ export CROSS=$PREFIX/bin/arm-linux-
$ ln -s $CROSS'aout-ar' $CROSS'ar'
$ ln -s $CROSS'aout-as' $CROSS'as'
$ ln -s $CROSS'aout-ld' $CROSS'ld'
$ ln -s $CROSS'aout-objcopy' $CROSS'objcopy'
$ ln -s $CROSS'aout-objdump' $CROSS'objdump'
$ ln -s $CROSS'aout-ranlib' $CROSS'ranlib'
$ ln -s $CROSS'aout-strip' $CROSS'strip'
先用符号链接统一一下“arm-linux-aout”与“arm-linux”的区别(binutils留下的怪事~)
$ tar -xjf uClibc-0.9.29.tar.bz2
$ cd uClibc-0.9.29
$ make CROSS=$CROSS defconfig
$ make CROSS=$CROSS menuconfig
修改arm、arm920t、little endian、kernel header location、cross等
$ make
提示错误:Error: Unknown pseudo-op: `.section'
看起来还是我的编译器有问题!!!!!
体验了编译工具链之后,到这里无法继续。 这个网页指 出:“Linux 2.6.14 compiles with the 3.4.1 tool chain. It failed with 3.3.2.”,也就是说最新版本的编译器有时候就是会出奇怪问题——特别是我把elf、aout混合使用,天知道会发生什么……
下载了一个 别人编译好的编译器
修改kernel、BusyBox等的Makefile,指向新的编译器。make clean、make。
但是——shell还是不理我,呜呜呜……
(另外发现,用下载来的新编译器产生的helloworld,file命令还是看到for GNU/Linux 2.4.3)
时间不多了,我决定尝试另一个版本: linux-2.4.36.4。
首先修改顶层Makefile的ARCH、CROSS_COMPILE;居然不支持make defconfig,且make menuconfig会出错……只好老老实实make config,后面也可以vi .config修改少量配置。
make dep也会出错,arch/arm/Makefile里的-mshort-load-bytes删掉即可。
$ make
http://yoursunny.com/study/IS222/w2.htm
一个很严重的问题是——我的磁盘空间不足了。直接使用Windows分区不是个好主意——那样会造成所有文件都变成777属性,看起来很不舒服;用loop设备的方法会好一点。创建loop设备并挂载文件系统的方法:
- 先挂载上Windows分区,然后cd到此分区的某个目录
- dd if=/dev/zero of=./gccdisk bs=1k count=1M,创建1G的空白文件
mkfs.ext3 -i 40000 ./gccdisk,在这个文件中创建ext3文件系统 - sudo mount -o loop ./gccdisk /sunny/gccdisk,挂载loop文件系统。
- 根据需要用ln -s创建符号连接
正式开始编译!
$ export TARGET=arm-linux
$ export PREFIX=/sunny/gccdisk
$ export TARGET_PREFIX=/sunny/gccdisk/arm-linux
跳过了kernel的menuconfig,因为已经做过了;准备好内核头文件
$ cd linux-2.6.25
$ mkdir -p $TARGET_PREFIX/include
$ cp -r include/linux/ $TARGET_PREFIX/include
$ cp -r include/asm-arm/ $TARGET_PREFIX/include/asm
$ cp -r include/asm-generic/ $TARGET_PREFIX/include
开始编译binutils
$ tar -xzf binutils-2.9.1.tar.gz
$ cd ../binutils-2.9.1
$ ./configure --target=$TARGET --prefix=$PREFIX
出现错误:*** BFD does not support target arm-unknown-linux-gnu.
打开bfd/config.bfd一看,对arm只支持这些格式: arm-*-riscix*、arm-*-pe*、arm-*-aout、arm-*-coff,退而求其次,换a.out吧
$ export TARGET=arm-linux-aout
$ export TARGET_PREFIX=/sunny/gccdisk/arm-linux-aout
$ mv $PREFIX/arm-linux $PREFIX/arm-linux-aout
$ ./configure --target=$TARGET --prefix=$PREFIX
creating Makefile成功
$ make
提示libiberty/strerror.c有错,与Ubuntu的头文件定义不一致;在#ifdef NEED_sys_errlist前把这个名称#undef掉,然后#else里的sys_errlist类型改成和Ubuntu头文件一致
$ make
提示libiberty/cplus-dem.c有错,malloc,参考/usr/include/malloc.h改成void *malloc (size_t __size);通过。
$ make
没看到错误提示,估计是成功了
$ make install
打开/sunny/gccdisk一看,出现了很多可执行文件,成功
$ cd ..
开始编译gcc
$ mkdir $PREFIX/gcc-4.3.0
$ ln -l $PREFIX/gcc-4.3.0 gcc-4.3.0
上面两步纯粹为了解决磁盘空间不足问题,不是必须步骤
$ tar -xjf gcc-core-4.3.0.tar.bz2
$ tar -xjf gcc-g++-4.3.0.tar.bz2
如果磁盘足够,可以直接使用gcc-4.3.0.tar.bz2;我不需要java、ada之类的,所以就只要C和C++就行了
由于C++编译器依赖于glibc,现在只能先编译C编译器
$ cd gcc-4.3.0
$ ./configure --target=$TARGET --prefix=$PREFIX --without-headers --with-newlib --enable-languages=c
还缺东西:Building GCC requires GMP 4.1+ and MPFR 2.3.0+.
$ sudo apt-get install libmpfr-dev
mpfr的网站打不开,在谷歌快照里看到了“debian package”,Ubuntu的源里也有这个package
$ ./configure --target=$TARGET --prefix=$PREFIX --without-headers --with-newlib --enable-languages=c
$ make
这个郁闷了:*** Configuration arm-linux-aout not supported;返回arm-linux目标吧
$ export TARGET=arm-linux
$ export TARGET_PREFIX=/sunny/gccdisk/arm-linux
$ ln -s $PREFIX/arm-linux-aout $TARGET_PREFIX
$ ./configure --target=$TARGET --prefix=$PREFIX --without-headers --with-newlib --enable-languages=c
$ make
10分钟后——checking for suffix of object files... configure: error: cannot compute suffix of object files: cannot compile
仔细看看那本Building Embedded Linux System.chm,原来是make目标错了
$ make all-gcc
$ make install-gcc
迅速成功,/sunny/gccdisk/bin出现了可爱的gcc
$ cd ..
下一步是glibc
$ mkdir $PREFIX/glibc-2.7
$ ln -s $PREFIX/glibc-2.7 glibc-2.7
$ tar -xjf glibc-2.7.tar.gz
$ mkdir build
$ cd build
$ CC=$PREFIX/arm-linux/bin/gcc ../configure --host=$TARGET --prefix=$PREFIX --enable-add-ons --with-headers=$TARGET_PREFIX/include
好像不行:checking sysdep dirs... configure: error: The arm is not supported.
看到sysdeps/目录里确实没有arm目录
继续搜索,了解到需要glibc-ports-2.7
$ cd ..
$ wget http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2
$ tar -xjf glibc-ports-2.7
$ CC=$PREFIX/arm-linux/bin/gcc ../configure --host=$TARGET --prefix=$PREFIX --enable-add-ons=../glibc-ports-2.7 --with-headers=$TARGET_PREFIX/include
编译失败,config.log里说ccl找不到;我在$PREFIX/libexec/gcc/arm-linux/4.3.0找到了ccl这个文件,加入path里
$ PATH=$PREFIX/libexec/gcc/arm-linux/4.3.0:$PATH CC=$PREFIX/arm-linux/bin/gcc AR=$PREFIX/bin/arm-linux-aout-ar RANLIB=$PREFIX/bin/arm-linux-aout-ranlib AS=$PREFIX/bin/arm-linux-aout-as LD=$PREFIX/bin/arm-linux-aout-ld ../configure --host=$TARGET --prefix=$PREFIX --enable-add-ons=../glibc-ports-2.7 --with-headers=$TARGET_PREFIX/include
还是失败,config.log说Error: too many memory references for `mov',看起来是x86汇编……
$ cd ../..
暂时没有解决方案,试试uClibc吧
$ export CROSS=$PREFIX/bin/arm-linux-
$ ln -s $CROSS'aout-ar' $CROSS'ar'
$ ln -s $CROSS'aout-as' $CROSS'as'
$ ln -s $CROSS'aout-ld' $CROSS'ld'
$ ln -s $CROSS'aout-objcopy' $CROSS'objcopy'
$ ln -s $CROSS'aout-objdump' $CROSS'objdump'
$ ln -s $CROSS'aout-ranlib' $CROSS'ranlib'
$ ln -s $CROSS'aout-strip' $CROSS'strip'
先用符号链接统一一下“arm-linux-aout”与“arm-linux”的区别(binutils留下的怪事~)
$ tar -xjf uClibc-0.9.29.tar.bz2
$ cd uClibc-0.9.29
$ make CROSS=$CROSS defconfig
$ make CROSS=$CROSS menuconfig
修改arm、arm920t、little endian、kernel header location、cross等
$ make
提示错误:Error: Unknown pseudo-op: `.section'
看起来还是我的编译器有问题!!!!!
体验了编译工具链之后,到这里无法继续。 这个网页指 出:“Linux 2.6.14 compiles with the 3.4.1 tool chain. It failed with 3.3.2.”,也就是说最新版本的编译器有时候就是会出奇怪问题——特别是我把elf、aout混合使用,天知道会发生什么……
下载了一个 别人编译好的编译器
修改kernel、BusyBox等的Makefile,指向新的编译器。make clean、make。
但是——shell还是不理我,呜呜呜……
(另外发现,用下载来的新编译器产生的helloworld,file命令还是看到for GNU/Linux 2.4.3)
时间不多了,我决定尝试另一个版本: linux-2.4.36.4。
首先修改顶层Makefile的ARCH、CROSS_COMPILE;居然不支持make defconfig,且make menuconfig会出错……只好老老实实make config,后面也可以vi .config修改少量配置。
make dep也会出错,arch/arm/Makefile里的-mshort-load-bytes删掉即可。
$ make
- blkpg.c:252: error: asm-specifier for variable `__r1' conflicts with asm clobber list
rd.c:306: error: asm-specifier for variable `__r1' conflicts with asm clobber list
loop.c:903: error: asm-specifier for variable `__r1' conflicts with asm clobber list
不是64位,BLKGETSIZE64一般也不会用到,注释掉 - /sunny/linux-2.4.36.4/include/asm/keyboard.h:68:31: asm/arch/keyboard.h: No such file or directory
SkyEye虚拟开发板上不需要键盘,所以touch include/asm/arch/keyboard.h创建一个空文件 - filemap.c:1948: error: asm-specifier for variable `__r1' conflicts with asm clobber list
这次是sys_sendfile64函数,怎么又是64位的东西? - core.c:176: error: `MACH_TYPE_AT91RM9200' undeclared here (not in a function)
别处都是MACH_TYPE_AT91RM9200DK,这儿却丢了DK二字,在include/asm/mach-types.h定义一下吧 - cc1: error: invalid option `no-fpu'
arch/arm/Makefile,删去-mno-fpu
http://yoursunny.com/study/IS222/w2.htm