转载:2008-05-21 玩转工具链 -> 宣告失败

 根据昨天的计划,开始重新编译最新版的binutils、arm-linux-gcc和glibc。
一个很严重的问题是——我的磁盘空间不足了。直接使用Windows分区不是个好主意——那样会造成所有文件都变成777属性,看起来很不舒服;用loop设备的方法会好一点。创建loop设备并挂载文件系统的方法:
  1. 先挂载上Windows分区,然后cd到此分区的某个目录
  2. dd if=/dev/zero of=./gccdisk bs=1k count=1M,创建1G的空白文件
    mkfs.ext3 -i 40000 ./gccdisk,在这个文件中创建ext3文件系统
  3. sudo mount -o loop ./gccdisk /sunny/gccdisk,挂载loop文件系统。
  4. 根据需要用ln -s创建符号连接
编译还需要lex和yacc的支持,Ubuntu源里没有, 这个帖子说sudo apt-get install flex bison,果然安装上了。


正式开始编译!
$ 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
Generating arch/arm/vmlinux.lds——终于通过了编译阶段,到了ld;错误更多了,都是undefined reference……

http://yoursunny.com/study/IS222/w2.htm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值