博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

随风...

我欲上青天 看沧海桑田.
piaoyizu.cublog.cn
创建工具链的过程
0. 配置linux-2.6.11

make menuconfig ARCH=arm
选择的xscale是ixp2800, 板子是ixdp2800
make ARCH=arm后
copy include里的目录三个目录asm-arm asm-generic linux 到$HOME/xscale/include/

cp -dR include/linux $HOME/xscale/include
cp -dR include/asm-arm $HOME/xscale/include
cp -dR include/asm-generic $HOME/xscale/include
ln -s asm-arm asm


创建目录
xscale-linux-elf

创立连接ln -s $HOME/xscale/include $HOME/xscale/include/xscale-linux-elf/

1. binutils-2.16

./configure --target=arm-xscale-linux --prefix=$HOME/xscale

在PATH路径中加入$HOME/xscale/bin $HOME/xscale/arm-xscale-linux/bin
(注意环境变量改变了,需要退出重进)


2. gcc-4.0.0

a) 对文件 gcc-4.0.0/gcc/config/arm/t-linux修改

b) 必须要创建一个新的编译目录,否则会出问题。
(我还把arm-xscale-linux-开头的文件都改成了以 xscale-linux-elf开头。)

mkdir mkbin
cd mkbin
../configure --target=xscale-linux-elf --prefix=$HOME/xscale --enable-languages=c

--with-local-prefix=$HOME/xscale/xscale-linux-elf --without-headers --with-newlib --disable-shared

--disable-threads

在过程中,如如下
……
checking for xscale-linux-elf-ar... (cached) xscale-linux-elf-ar
checking for xscale-linux-elf-as... (cached)xscale-linux-elf-as
checking for xscale-linux-elf-dlltool... no
checking for xscale-linux-elf-ld... (cached) xscale-linux-elf-ld
checking for xscale-linux-elf-nm... (cached) xscale-linux-elf-nm
checking for xscale-linux-elf-ranlib... (cached) xscale-linux-elf-ranlib
checking for xscale-linux-elf-windres... no
checking whether to enable maintainer-specific portions of Makefiles... no
checking if symbolic links between directories work... (cached) yes
……
如果没有,在编译过程中会出现有汇编不认识,过不去。
如果最后还是发现过不去,就看看是不是原来的影响。(其中有一次,我是把原来环境的ld,as改名,接着执行make就过去了)

为后面的做准备。
(把生成的crt1.o拷到$HOME/xscale/lib/gcc/xscale-linux-elf/4.0.0
gcc/config/arm/unknown-elf.h中的crt0.o修改成crt1.o,如下:
#define STARTFILE_SPEC " crt1%O%s crti%O%s crtbegin%O%s"
重新编译了一下, mkbin/gcc/specs拷到$HOME/xscale/lib/gcc/xscale-linux-elf/4.0.0, mkbin是我的编译目录。)

3。glibc-2.3.5

编译过程中,会出现一些问题,我把fpu ntpl “ntpl db”删除了;XScale里没有fpu(浮点运算单元)。
关于ntpl db 和ntpl有patch,我不知道能否用,大家可以试试。


configure不认 xscale, 我选用了--host=arm-linux --build=i686-pc-linux 下面是命令行:


CC=$HOME/xscale/bin/xscale-linux-elf-gcc

AR=$HOME/xscale/bin/xscale-linux-elf-ar AS=$HOME/xscale/bin/xscale-linux-elf-as

RANLIB=$HOME/xscale/bin/xscale-linux-elf-ranlib LD=$HOME/xscale/bin/xscale-linux-elf-ld

../configure --host=arm-linux --build=i686-pc-linux --prefix=$HOME/xscale/

--enable-add-ons --with-headers=$HOME/xscale/include --disable-shared


问题说明

在编译过程中会出现一些问题,但都能使用google查找到补丁,自已选择下吧。

其中-lgcc_eh问题,针对补丁有多个,我用的是下面这个

--- glibc-2.3.4/Makeconfig 2004-12-15 19:51:47.000000000 +0100
+++ glibc-2.3.4-new/Makeconfig 2005-03-27 15:47:19.000000000 +0200
@@ -514,12 +514,12 @@
libunwind = -lunwind
endif
ifneq ($(have-as-needed),yes)
- libgcc_eh := -lgcc_eh $(libunwind)
+ libgcc_eh := $(libunwind)
else
libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) $(libunwind) -Wl,--no-as-needed
endif
gnulib := -lgcc $(libgcc_eh)
-static-gnulib := -lgcc -lgcc_eh $(libunwind)
+static-gnulib := -lgcc $(libunwind)
libc.so-gnulib := -lgcc
endif
ifeq ($(elf),yes)


共享库问题
用了--disable-shared,否则会出现_begin找不到,好像xscale-linux-elf-gcc不支持,加了

xscale-linux-elf-gcc -shared不起作用。大侠可以指点一下。


4.编译gcc-4.0.0

把gcc/arm/t-linux改回去,

最后要编译gcc,这时gcc是由我们刚生成的glibc和本地的gcc环境所共同生成,即--with-gnu-as --with-gnu-ld
除了生成xscale-linux-elf-gcc等可执行文件,还生成一些库文件。

我个人认为生成库文件所用的编译环境就应该是交叉环境了,所以在编译时还是出了点错误。这时就要求交叉
编绎环境能够运转。
我这时发现需要crt0.o,在libstdc++中检查,有个错误,
checking for main in -lm
error: Link tests are not allowed after GCC_NO_EXECUTABLES.这说明交叉编绎环境不能够运转。这时你可以


编个小程序试试。
如果google这个错误,会发现有许多人碰到,很多人没有何解决这个问题。
我主要做的事如下:
把生成的crt1.o拷到$HOME/xscale/lib/gcc/xscale-linux-elf/4.0.0

gcc/config/arm/unknown-elf.h中的crt0.o修改成crt1.o,如下:
#define STARTFILE_SPEC " crt1%O%s crti%O%s crtbegin%O%s"
重新编译了一下, mkbin/gcc/specs拷到$HOME/xscale/lib/gcc/xscale-linux-elf/4.0.0, mkbin是我的编译目录。

可以在第2步就把这个事做了。



但我在编译过程中,还是有错误,主要是大头,小头问题,缺省下两个都编译,但库文件目录都一样,
在编译过程中,一定会有一个编不过去。我没有找出只编一个的开关,所以只有让它继续错了。

总结说明:
这两天也弄头大了,但总体上的来说,有下面的体会:
1。google上找找是不是有相同的问题,以及解决办法。
2。编译过程中,路径是否设对了,以及注意原来的编译环境的影响。
我在编译gcc时,开始是路径是主机的ld, as,但到了最后,发现还需要第2步binutils生成的ld, as(要在PATH路径中),我不得不把主机的ld,as改名。 最后在编译glibc时,还要把gcc改名,因为glibc不认xscale。
最后我干脆把新生成的放到PATH路径最前面。

3。注意分析错误的原因,出错有可能是bug ,需要patch。有一些错误是由于配置的原因,有时需要主机的gcc,ld,as,有时需要生成目标机指令的gcc,ld,as,如果在配置时选错了,就会出一些问题。


我只是编译了一个小头的,
大头的可以在google上可以找到如何修改。修改的包括gcc和glibc编译,大家可以参考的网站:
我在gcc-4.0.0中用XScale-arm-elf,主要原因是这个几乎不出错,就通过了。在glibc中,却只支持arm-*,不认xscale。由于改了名,所以在编译中也有一些问题,但这些都是和编译环境相关,我通过改名也过去了。
但现在还没有环境测试,说明我编译的没有问题,可以用。


整个过程,并不是非常标准,因为我也是一步步经过很多的挫折才做到那个地方,
,上面的只是一些我认为重要的记录,以及加上自己所想,所写的并不一定抓到点子上。
但所有的地方,我认为有疑问的地方都做了测试。


http://arm.nihilisme.ca/
http://www.linux-france.org/~dmentre/doc/en/
http://lists.arm.linux.org.uk/pipermail/linux-arm

 原文地址 http://1231.com
发表于: 2008-04-05,修改于: 2008-04-05 23:49,已浏览335次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:0.00987