john_sagitta 发表于 2004-10-20 14:38:10

制作xscale_linux_be交叉编译工具步骤

HOWTO build arm-linux toolchain for ARM/XSCALE
----------------------------------------------

These instructions document how to build an arm-linux tool chain
that contains both little-endian and big-endian target libraries.


1. Packages used:

    binutils-2.14.tar.gz
    gcc-3.3.2.tar.gz
    glibc-2.2.5.tar.gz
    glibc-linuxthreads-2.2.5.tar.gz

2. binutils-2.14

   tar xvzf binutils-2.14.tar.gz
   cd binutils-2.14
   mkdir xscale_linux_be
   cd xscale_linux_be
   ../configure --target=armbe-linux --prefix=/opt/xscale_linux_be --with-lib-path=/opt/xscale_linux_be/armbe-linux/lib --program-prefix=xscale_linux_be-

   make
   make install
   chmod 777 /opt/xscale_linux_be


3. gcc-3.3.2 -- bootstrap gcc

   tar xvzf gcc-3.3.2.tar.gz
   cd gcc-3.3.2
   cp $(ATTACHED t-linux file) gcc/config/arm/
   perl -pi -e 's/GCC_FOR_TARGET = \$\$r\/gcc\/xgcc /GCC_FOR_TARGET = \$\$r\/gcc\/xgcc -mbig-endian /g' Makefile.in
   cd gcc
   perl -pi -e 's/GCC_FOR_TARGET = \.\/xgcc /GCC_FOR_TARGET = \.\/xgcc -mbig-endian /g' Makefile.in
   cd config/arm
   perl -pi -e 's/^# MULTILIB_OPTIONS   = mlittle-endian\/mbig-endian/MULTILIB_OPTIONS   += mlittle-endian\/mbig-endian/' t-arm-elf
   perl -pi -e 's/^# MULTILIB_DIRNAMES    = le be/MULTILIB_DIRNAMES    += le be/' t-arm-elf
   perl -pi -e 's/^# MULTILIB_MATCHES   = mbig-endian=mbe mlittle-endian=ml/MULTILIB_MATCHES   += mbig-endian=mbe mlittle-endian=ml/' t-arm-elf


   export PATH=/opt/xscale_linux_be/bin:/opt/xscale_linux_be/armbe-linux/include:$PATH

   mkdir xscale_linux_be
   cd xscale_linux_be
   ../configure --program-prefix=xscale_linux_be- --prefix=/opt/xscale_linux_be --target=armbe-linux --disable-shared --disable-threads --with-headers=/home/john_ho/ixp422/src/snapgear/linux-2.4.x/include --with-gnu-as --with-gnu-ld --enable-multilib --enable-languages=c
   
   perl -pi -e 's/^program_transform_cross_name = s,\^,\$\(target-alias\)-,/program_transform_cross_name = s,\^,xscale_linux_be-,/g' gcc/Makefile
   make
   make install


4. glibc-2.2.5 (big-endian)

   tar xvzf glibc-2.2.5.tar.gz
   cd glibc-2.2.5
   tar xvzf glibc-linuxthreads-2.2.5.tar.gz

   perl -pi -e 's/i386/arm*)\n\tlibc_cv_gcc_unwind_find_fde=yes\n\tarch_minimum_kernel=2.0.10\n\t;;\n   i386/' sysdeps/unix/sysv/linux/configure
   perl -pi -e 's/weak_alias \(__old_sys_nerr/\/\/ $&/' sysdeps/unix/sysv/linux/arm/errlist.c
   perl -pi -e 's/weak_alias \(__old_sys_nerr/\/\/ $&/' sysdeps/unix/sysv/linux/errlist.c
   
   cd sysdeps/arm
   patch -p0 < ../../Patch.armbe-strlen-fix

   vi linuxthreads/sysdeps/pthread/pthread.h
      - change line 163, "__thread" -> "__thr"
      - change line 591, "__thread" -> "__thr"
   vi linuxthreads/internals.h
      - change line 555, "__thread" -> "__thr"
   vi linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h
      - change line 36, "__thread" -> "__thr"
   vi stdio-common/sprintf.c
      - line 30, change to "sprintf(char *s, const char *format, ...)"
   vi stdio-common/sscanf.c
      - line 30, change to "sscanf(const char *s, const char *format, ...)"
   vi sysdeps/unix/sysv/linux/arm/sysdep.h
      - line 134, remove "a1" from clobber list
   vi sysdeps/arm/dl-machine.h
      - add '\n\' to end of all macro asm lines (there is a _lot_ of them)

   vi config.make.in
      - change "slibdir=@...@" to "slibdir=@libdir@"
      
   vi sysdeps/unix/sysv/linux/arm/ioperm.c
      - add include file <linux/input.h> to avoid compile error of BUS_ISA not defined.

   mkdir xscale_linux_be
   cd xscale_linux_be
   export CC="xscale_linux_be-gcc -mbig-endian -finline-limit=10000"
   export AR="xscale_linux_be-ar"
   export RANLIB="xscale_linux_be-ranlib"
   export LD="xscale-linux_be-ld -mbig-endian"
   ../configure armbe-linux --target=armbe-linux --prefix=/opt/xscale_linux_be/armbe-linux --build=i686-pc-linux-gnu --with-headers=/opt/xscale_linux_be/armbe-linux/sys-include --enable-add-ons=linuxthreads --enable-shared
   make
   make install

6. gcc-3.3.2 (c++, etc) full version

   tar xvzf gcc-3.3.2.tar.gz
   cd gcc-3.3.2

   cp $(ATTACHED t-linux file) gcc/config/arm/
   vi gcc/config/arm/t-linux
      - remove all "-Dinhibit_libc" occruances
      
   perl -pi -e 's/GCC_FOR_TARGET = \$\$r\/gcc\/xgcc /GCC_FOR_TARGET = \$\$r\/gcc\/xgcc -mbig-endian /g' Makefile.in
   cd gcc
   perl -pi -e 's/GCC_FOR_TARGET = \.\/xgcc /GCC_FOR_TARGET = \.\/xgcc -mbig-endian /g' Makefile.in
   cd config/arm
   perl -pi -e 's/^# MULTILIB_OPTIONS   = mlittle-endian\/mbig-endian/MULTILIB_OPTIONS   += mlittle-endian\/mbig-endian/' t-arm-elf
   perl -pi -e 's/^# MULTILIB_DIRNAMES    = le be/MULTILIB_DIRNAMES    += le be/' t-arm-elf
   perl -pi -e 's/^# MULTILIB_MATCHES   = mbig-endian=mbe mlittle-endian=ml/MULTILIB_MATCHES   += mbig-endian=mbe mlittle-endian=ml/' t-arm-elf

   export PATH=/opt/xscale_linux_be/bin:/opt/xscale_linux_be/armbe-linux/include:$PATH

   mkdir xscale_linux_be
   cd xscale_linux_be
   ../configure --program-prefix=xscale_linux_be- --prefix=/opt/xscale_linux_be --target=armbe-linux --enable-multilib --with-headers=/opt/xscale_linux_be/armbe-linux/include --enable-languages=c,c++
   perl -pi -e 's/int namelen/unsigned int namelen/' ../libjava/java/net/natInetAddress.cc
   [ For big-endian ]
   perl -pi -e 's/^CC_FOR_TARGET = \$\$r\/gcc\/xgcc/CC_FOR_TARGET = \$\$r\/gcc\/xgcc -mbig-endian /' Makefile
   perl -pi -e 's/\$\$r\/gcc\/ -nostdinc\+\+ /\$\$r\/gcc\/ -nostdinc++ -mbig-endian /' Makefile
   cd gcc
   perl -pi -e 's/libstdc\+\+ /libstdc\+\+ -mbig-endian /' Makefile

   make LDFLAGS="-mbig-endian"
   make install
   
7. gdb-5.1.1

   bzip2 -cd gdb-5.1.1.tar.bz2 | tar xvf -
   cd gdb-5.1.1
   mkdir xscale_linux_be
   cd xscale_linux_be
   ../configure --prefix=/opt/xscale_linux_be --program-prefix=xscale_linux_be- --target=armbe-linux
   make
   make install

8. cd /
   tar cvzf /opt/xscale_linux_be-toolchain-20040511.tar.gz /opt/xscale_linux_be

------------------------------------------------------------------------------

APPENDIX A--modified t-linux for gcc-3.3.2

------------------------------------------------------------------------------
# Just for these, we omit the frame pointer since it makes such a big
# difference.It is then pointless adding debugging.
TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix
LIBGCC2_DEBUG_CFLAGS = -g0

# Don't build enquire
ENQUIRE=

LIB1ASMSRC = arm/lib1funcs.asm
LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx

# MULTILIB_OPTIONS = mhard-float/msoft-float
# MULTILIB_DIRNAMES = hard-float soft-float
MULTILIB_OPTIONS = mlittle-endian/mbig-endian
MULTILIB_DIRNAMES = le be

# If you want to build both APCS variants as multilib options this is how
# to do it.
# MULTILIB_OPTIONS += mapcs-32/mapcs-26
# MULTILIB_DIRNAMES += apcs-32 apcs-26

EXTRA_MULTILIB_PARTS = crtbegin.o crtbeginS.o crtend.o crtendS.o crti.o crtn.o

LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib
T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h

# Assemble startup files.
$(T)crti.o: $(srcdir)/config/arm/crti.asm $(GCC_PASSES)
        $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
          -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/arm/crti.asm

$(T)crtn.o: $(srcdir)/config/arm/crtn.asm $(GCC_PASSES)
        $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
          -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/arm/crtn.asm
------------------------------------------------------------------------------

------------------------------------------------------------------------------

APPENDIX B--Patch.armbe-strlen-fix for glibc-2.2.5

------------------------------------------------------------------------------
--- strlen.S.orig            2003-06-30 14:55:04.000000000 +0200
+++ strlen.S            2003-06-30 14:58:16.000000000 +0200
@@ -53,11 +53,20 @@
      ldrne   r2, , $4            @ and we continue to the next word
      bne   Laligned                @
Llastword:                           @ drop through to here once we find a
+#ifdef __ARMEB__
+       tst   r2, $0xff000000         @ word that has a zero byte in it
+       addne   r0, r0, $1            @
+       tstne   r2, $0x00ff0000         @ and add up to 3 bytes on to it
+       addne   r0, r0, $1            @
+       tstne   r2, $0x0000ff00         @ (if first three all non-zero, 4th
+       addne   r0, r0, $1            @must be zero)
+#else
      tst   r2, $0x000000ff         @ word that has a zero byte in it
      addne   r0, r0, $1            @
      tstne   r2, $0x0000ff00         @ and add up to 3 bytes on to it
      addne   r0, r0, $1            @
      tstne   r2, $0x00ff0000         @ (if first three all non-zero, 4th
      addne   r0, r0, $1            @must be zero)
+#endif
      RETINSTR(mov,pc,lr)
END(strlen)
------------------------------------------------------------------------------

jerry79 发表于 2004-10-20 22:23:40

谢谢楼主的帖子,真是雪中送炭啊!

john_sagitta 发表于 2004-10-21 10:19:13

呵呵,不客气,我也是刚找到这份文档,以后要好好保存了。

jackzheng2002 发表于 2004-10-21 12:15:44

鼓励,谢谢!!!
希望大家都能在这里得到帮助,确实能解决开发中遇到的一些技术问题,
这是这个论坛的初衷。。。

jerry79 发表于 2004-10-21 23:29:57

遇到了问题,请帮帮忙

按照楼主的方法,我试着建立,但是遇到了一些问题,请帮帮忙,谢谢!
1、帖子中“3. gcc-3.3.2 -- bootstrap gcc” ,其中“bootstrap gcc”是什么意思呢?在第六项中,“6. gcc-3.3.2 (c++, etc) full version ”和第三项有什么区别,为什么同样的gcc,却要configure两次呢?
2、在做第三项时,我执行到“perl -pi -e 's/^program_transform_cross_name = s,\^,\$\(target-alias\)-,/program_transform_cross_name = s,\^,xscale_linux_be-,/g' gcc/Makefile ”,出现错误,提示“Can't open gcc/Makefile: No such file or directory.”,后来我把“g' gcc/Makefile”改成“g' Makefile”或者“g' ../Makefile.in”,则可以通过,因为这时我在目录xscale_linux_be中,相关的目录结构是:gcc-3.3.2/gcc/xscale_linux_be。在gcc的目录下面有Makefile.in这个文件,是不是就是需要这个呢?但是,做完这步后,执行make命令,却提示错误“Makefile:673: *** 遗漏分隔符 。 停止。”,请问这是怎么回事啊,除了上一条语句,我完全是按照帖子中的要求去做的。
3、第四项,“4. glibc-2.2.5 (big-endian)”,是否指这个glibc是对于big-endian的CPU呢,可是我的是X86的台式机啊,好像CPU应该是little-endian吧,是否little-endian就不需要glibc呢?帖子好像缺了第五项。
4、第七项中的“xscale_linux_be-toolchain-20040511.tar.gz ”,请问楼主是从哪里下载的呢?我在snapgear的主页上面没有找到这个文件,只有arm-linux-tools-20031127.tar.gz 这个开发包。
以上一些问题,请楼主有时间帮忙解答一下,谢谢了!
期待回复!

john_sagitta 发表于 2004-10-22 09:28:04

一般制作交叉编译工具需要配置和编译两次gcc,第一次编译的gcc称为bootstrap gcc,这是一个不完整的gcc,主要用于编译接下去的libc库,而编译外libc库之后会再次配置编译gcc,这时称为full version的gcc。

那句perl语句的作用是把gcc/Makefile文件中的program_transform_cross_name改为xscale_linux_be-,这样做你编译出来的交叉编译工具名字就应该是xscale_linux_be-gcc,xscale_linux_be-g++。。。而如果不做替换的话,编译出来的交叉编译工具前缀是armbe-linux-gcc。。。至于替换那一个文件,应该是gcc-3.3.2/gcc/Makefile,或者gcc-3.3.2/xscale_linux_be/gcc/Makefile其中之一吧,我也记不清了,你可以试试看,然后更新这份文档。

第四项编译glibc,这份glibc是给你的target使用的,而不是你的host主机,你的host主机是x86平台,但是你的开发板是xscale big-edian的,开发板上运行的程序需要这个libc。

第七项,完成交叉编译工具制作后,在/opt/xscale_linux_be目录下包含了所有的工作成果,这时候我用tar命令打包,生成xscale_linux_be-toolchain-20040511.tar.gz,所以这个包是我自己产生的。你在完成了1~6步以后在/opt/xscale_linux_be目录下也会有所有的工具。

jerry79 发表于 2004-10-23 16:39:32

谢谢john,那个perl语句的问题,是我自己弄错了目录,文中所写的语句应该是正确的。不过中间需要添加几个步骤(下面的两条注释语句中间的部分):
export PATH=/opt/xscale_linux_be/bin:/opt/xscale_linux_be/armbe-linux/include:$PATH
//在这里要退出当前目录,当前目录是gcc-3.3.2/gcc/config/arm
cd..
cd..
cd..
//需要在gcc-3.3.2z这个目录下面来建立xscale_linux_be目录
mkdir xscale_linux_be
cd xscale_linux_be

jerry79 发表于 2004-10-23 16:45:32

不过还是有问题啊,请john帮忙看看。在第三步中,执行到make的时候,最后出现错误,我不能把全部的make信息贴上来,太多了,下面将最后几句贴上来:
make: Entering directory `/home/jerry/download/sw/arm/gcc-3.3.2/xscale_linux_be/libiberty/testsuite'
make: Nothing to be done for `all'.
make: Leaving directory `/home/jerry/download/sw/arm/gcc-3.3.2/xscale_linux_be/libiberty/testsuite'
make: Leaving directory `/home/jerry/download/sw/arm/gcc-3.3.2/xscale_linux_be/libiberty'
make: Entering directory `/home/jerry/download/sw/arm/gcc-3.3.2/xscale_linux_be/gcc'
Makefile:673: *** 遗漏分隔符 。 停止。
make: Leaving directory `/home/jerry/download/sw/arm/gcc-3.3.2/xscale_linux_be/gcc'
make: *** 错误 2
请问这是怎么回事呢?好像是指makefile这个文件有错误,遗漏分隔符。最后一句还有一个错误“错误2”,不知道是怎么回事,请帮帮忙!
谢谢!

john_sagitta 发表于 2004-10-24 10:02:44

很抱歉Jerry这个文挡还存在一些问题,我想有机会我还是重新做一遍,然后更新一下这份文挡.Makefile你可以用手动修改来纠正问题,那条perl语句的作用是替换program_transform_cross_name,所以你打开Makefile直接修改这个变量的定义就好了。

这个星期我会抽空更新这份文档.

jackzheng2002 发表于 2004-10-24 15:36:43

鼓励!!!
表扬。。。
希望能够多给大家帮助。。。

jerry79 发表于 2004-10-25 10:20:15

谢谢john,希望早日看到您的文档,给我们这些新手已帮助。我自己这两天也会在做尝试,有问题或者心得在向你请教。谢谢!

jerry79 发表于 2004-10-25 14:02:16

在xscale_linux_be/gcc目录下面,我打开Makefile文件,其中第673行是:
# Assemble startup files.
$(T)crti.o: $(srcdir)/config/arm/crti.asm $(GCC_PASSES)
//下面的一行就是第673行
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
-c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/arm/crti.asm

$(T)crtn.o: $(srcdir)/config/arm/crtn.asm $(GCC_PASSES)
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
-c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/arm/crtn.asm
我实在是看不出来这条语句有什么问题,即使手动在最后加上“.”符号,还是不行,不知道楼主有没有遇到过同样的问题。谢谢

john_sagitta 发表于 2004-10-27 08:42:21

请问$(GCC_FOR_TARGET)前面有tab么?如果不是TAB而是空格之类的,就会有报错说“遗漏分隔符” 。Makefile的一般格式为:
target: dependence
command.....
command.....

Command 前面必须为TAB键而不是其他。

jerry79 发表于 2004-10-27 11:25:55

谢谢john,我在前面加上TAB就可以编译通过了。太感谢了。不过,在编译的过程中,还遇到了其他的问题,清帮忙一下:
xgcc:: No such file or directory
xgcc: no input files
make: *** 错误 1
make: Leaving directory `/home/jerry/download/sw/arm-linux/gcc-3.3.2/xscale_linux_be/gcc'
make: *** 错误 2
make: Leaving directory `/home/jerry/download/sw/arm-linux/gcc-3.3.2/xscale_linux_be/gcc'
make: *** 错误 2
make: Leaving directory `/home/jerry/download/sw/arm-linux/gcc-3.3.2/xscale_linux_be/gcc'
make: *** 错误 2
这个xgcc的目录我在gcc-3.3.2和我自己生成的xscale_linux_be目录下面都没有找到这个xgcc目录,在前面的语句中:
perl -pi -e 's/GCC_FOR_TARGET = \$\$r\/gcc\/xgcc /GCC_FOR_TARGET = \$\$r\/gcc\/xgcc -mbig-endian /g' Makefile.in
这条语句中出现了xgcc这个目录,可是它并不存在啊?好后面几条perl语句也含有xgcc,请问这个目录在那里呢?谢谢!
不好意思,我的问题太多了,是在是比较菜的。谢谢了!

john_sagitta 发表于 2004-10-28 09:15:03

xgcc的问题我以前好像也碰到过,不过怎么解决的忘记了,这个星期天我休息,会去重新做一遍交叉编译工具,抱歉抱歉:)
页: [1] 2
查看完整版本: 制作xscale_linux_be交叉编译工具步骤