制作
ARM-linux交叉编译工具For
xscaleBig-Endian<br><br> <br>HOWTO build arm-linux toolchain for ARM/XSCALE<br>----------------------------------------------<br>These instruc
tions document how to build an arm-linux tool chain<br>that contains big-endian target libraries.<br><br>1. Packages used:<br>binutils-2.14.tar.gz<br>gcc-3.3.2.tar.gz<br>glibc-2.2.5.tar.gz<br>glibc-linuxthreads-2.2.5.tar.gz <br>2. binutils-2.14<br>tar xv*** binutils-2.14.tar.gz<br>cd binutils-2.14<br>mkdir xscale_linux_be<br>cd xscale_linux_be<br>../configure --target=armbe-linux --prefix=/opt/xscale_linux_be --with-lib-path=/opt/xscale_linux_be/armbe-linux/lib --program-prefix=xscale_linux_be-<br>make<br>make install<br>chmod 777 /opt/xscale_linux_be<br>3. gcc-3.3.2 -- bootstrap gcc<br>tar xv*** gcc-3.3.2.tar.gz<br>cd gcc-3.3.2<br>cp $(ATTACHED t-linux file) gcc/config/arm/<br>perl -pi -e 's/GCC_FOR_TARGET = \$\$r\/gcc\/xgcc /GCC_FOR_TARGET = \$\$r\/gcc\/xgcc -mbig-endian /g' Makefile.in<br>cd gcc<br>perl -pi -e 's/GCC_FOR_TARGET = \.\/xgcc /GCC_FOR_TARGET = \.\/xgcc -mbig-endian /g' Makefile.in<br>cd config/arm<br>perl -pi -e 's/^# MULTILIB_OPTIONS = mlittle-endian\/mbig-endian/MULTILIB_OPTIONS += mlittle-endian\/mbig-endian/' t-arm-elf<br>perl -pi -e 's/^# MULTILIB_DIRNAMES = le be/MULTILIB_DIRNAMES += le be/' t-arm-elf<br>perl -pi -e 's/^# MULTILIB_MATCHES = mbig-endian=mbe mlittle-endian=ml/MULTILIB_MATCHES += mbig-endian=mbe mlittle-endian=ml/' t-arm-elf<br><br>export PATH=/opt/xscale_linux_be/bin:/opt/xscale_linux_be/armbe-linux/include:$PATH<br>mkdir xscale_linux_be<br>cd xscale_linux_be<br>../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<br><br>perl -pi -e 's/^program_transform_cross_name = s \^ \$\(target-alias\)- /program_transform_cross_name = s \^ xscale_linux_be- /g' gcc/Makefile<br>make<br>make install<br>4. glibc-2.2.5 (big-endian)<br>tar xv*** glibc-2.2.5.tar.gz<br>cd glibc-2.2.5<br>tar xv*** glibc-linuxthreads-2.2.5.tar.gz<br>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<br>perl -pi -e 's/weak_alias \(__old_sys_nerr/\/\/ $&/' sysdeps/unix/sysv/linux/arm/errlist.c<br>perl -pi -e 's/weak_alias \(__old_sys_nerr/\/\/ $&/' sysdeps/unix/sysv/linux/errlist.c<br><br>cd sysdeps/arm<br>patch -p0 < ../../Patch.armbe-strlen-fix<br>vi linuxthreads/sysdeps/pthread/pthread.h<br>- change line 163 __thread -> "__thr"<br>- change line 591 __thread -> "__thr"<br>vi linuxthreads/internals.h<br>- change line 555 __thread -> "__thr"<br>vi linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h<br>- change line 36 __thread -> "__thr"<br>vi stdio-common/s
printf.c<br>- line 30 change to "sprintf(char *s const char *format ...)"<br>vi stdio-common/sscanf.c<br>- line 30 change to "sscanf(const char *s const char *format ...)"<br>vi sysdeps/unix/sysv/linux/arm/sysdep.h<br>- line 134 remove "a1" from clobber list<br>vi sysdeps/arm/dl-machine.h<br>- add '\n\' to end of all macro asm lines (there is a _lot_ of them)<br>vi config.make.in<br>- change "slibdir=@...@" to "slibdir=@libdir@"<br><br>vi sysdeps/unix/sysv/linux/arm/ioperm.c<br>- add include file to avoid compile error of BUS_ISA not defined.<br>mkdir xscale_linux_be<br>cd xscale_linux_be<br>export CC="xscale_linux_be-gcc -mbig-endian -finline-limit=10000"<br>export AR="xscale_linux_be-ar"<br>export RANLIB="xscale_linux_be-ranlib"<br>export LD="xscale-linux_be-ld -mbig-endian"<br>../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<br>make<br>make install<br>6. gcc-3.3.2 (c++ etc) full version<br>tar xv*** gcc-3.3.2.tar.gz<br>cd gcc-3.3.2<br>cp $(ATTACHED t-linux file) gcc/config/arm/<br>vi gcc/config/arm/t-linux <br>- remove all "-Dinhibit_libc" occruances<br><br>perl -pi -e 's/GCC_FOR_TARGET = \$\$r\/gcc\/xgcc /GCC_FOR_TARGET = \$\$r\/gcc\/xgcc -mbig-endian /g' Makefile.in<br>cd gcc<br>perl -pi -e 's/GCC_FOR_TARGET = \.\/xgcc /GCC_FOR_TARGET = \.\/xgcc -mbig-endian /g' Makefile.in<br>cd config/arm<br>perl -pi -e 's/^# MULTILIB_OPTIONS = mlittle-endian\/mbig-endian/MULTILIB_OPTIONS += mlittle-endian\/mbig-endian/' t-arm-elf<br>perl -pi -e 's/^# MULTILIB_DIRNAMES = le be/MULTILIB_DIRNAMES += le be/' t-arm-elf<br>perl -pi -e 's/^# MULTILIB_MATCHES = mbig-endian=mbe mlittle-endian=ml/MULTILIB_MATCHES += mbig-endian=mbe mlittle-endian=ml/' t-arm-elf<br>export PATH=/opt/xscale_linux_be/bin:/opt/xscale_linux_be/armbe-linux/include:$PATH<br>mkdir xscale_linux_be<br>cd xscale_linux_be<br>../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++<br>perl -pi -e 's/int namelen/unsigned int namelen/' ../libjava/java/net/natInetAddress.cc<br>[ For big-endian ]<br>perl -pi -e 's/^CC_FOR_TARGET = \$\$r\/gcc\/xgcc/CC_FOR_TARGET = \$\$r\/gcc\/xgcc -mbig-endian /' Makefile<br>perl -pi -e 's/\$\$r\/gcc\/ -nostdinc\+\+ /\$\$r\/gcc\/ -nostdinc++ -mbig-endian /' Makefile<br>cd gcc<br>perl -pi -e 's/libstdc\+\+ /libstdc\+\+ -mbig-endian /' Makefile<br>make LDFLAGS="-mbig-endian"<br>make install<br><br>7. gdb-5.1.1<br>bzip2 -cd gdb-5.1.1.tar.bz2 | tar xvf -<br>cd gdb-5.1.1<br>mkdir xscale_linux_be<br>cd xscale_linux_be<br>../configure --prefix=/opt/xscale_linux_be --program-prefix=xscale_linux_be- --target=armbe-linux<br>make<br>make install<br>8. cd /<br>tar cv*** /opt/xscale_linux_be-toolchain-200
40511.tar.gz /opt/xscale_linux_be <br>------------------------------------------------------------------------------<br>APPENDIX A -- mod
IFied t-linux for gcc-3.3.2<br>------------------------------------------------------------------------------<br># Just for these we omit the frame pointer since it makes such a big<br># difference. It is then pointless adding
debugging.<br>TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix<br>LIBGCC2_DEBUG_CFLAGS = -g0<br># Don't build enquire<br>ENQUIRE=<br>LIB1ASMSRC = arm/lib1funcs.asm<br>LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx<br># MULTILIB_OPTIONS = mhard-float/msoft-float<br># MULTILIB_DIRNAMES = hard-float soft-float<br>MULTILIB_OPTIONS = mlittle-endian/mbig-endian<br>MULTILIB_DIRNAMES = le be<br># If you want to build both APCS variants as multilib options this is how<br># to do it.<br># MULTILIB_OPTIONS += mapcs-32/mapcs-26<br># MULTILIB_DIRNAMES += apcs-32 apcs-26<br>EXTRA_MULTILIB_PARTS = crtbegin.o crtbeginS.o crtend.o crtendS.o crti.o crtn.o<br>LIBGCC = stmp-multilib<br>INSTALL_LIBGCC = install-multilib<br>T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h<br># Assemble startup files.<br>$(T)crti.o: $(srcdir)/config/arm/crti.asm $(GCC_PASSES)<br>$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \<br>-c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/arm/crti.asm<br>$(T)crtn.o: $(srcdir)/config/arm/crtn.asm $(GCC_PASSES)<br>$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \<br>-c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/arm/crtn.asm<br>------------------------------------------------------------------------------<br>------------------------------------------------------------------------------<br>APPENDIX B -- Patch.armbe-strlen-fix for glibc-2.2.5<br>------------------------------------------------------------------------------<br>--- strlen.S.orig 2003-06-30 14:55:04.000000000 +0200<br>+++ strlen.S 2003-06-30 14:58:16.000000000 +0200<br>@@ -53 11 53 20 @@<br>ldrne r2 [r1] $4 @ and we continue to the next word<br>bne Laligned @<br>Llastword: @ drop through to here once we find a<br>+#ifdef __ARMEB__<br>+ tst r2 $0xff000000 @ word that has a zero byte in it<br>+ addne r0 r0 $1 @<br>+ tstne r2 $0x00ff0000 @ and add up to 3 bytes on to it<br>+ addne r0 r0 $1 @<br>+ tstne r2 $0x0000ff00 @ (if first three all non-zero 4 addne r0 r0 $1 @ must be zero)<br>+#else<br>tst r2 $0x000000ff @ word that has a zero byte in it<br>addne r0 r0 $1 @<br>tstne r2 $0x0000ff00 @ and add up to 3 bytes on to it<br>addne r0 r0 $1 @<br>tstne r2 $0x00ff0000 @ (if first three all non-zero 4 addne r0 r0 $1 @ must be zero)<br>+#endif<br>RETINSTR(mov pc lr)<br>END(strlen)<br><br> 本文可能所用到的IC型号: <strong>SN74ALS569AN</strong> <strong>BUZ104</strong> <strong>ADM3202AN</strong> <strong>MC10H174FNR2</strong> <strong>MC74HC393FL1</strong> <strong>UC3901N</strong> <strong>XC4006E-2PQ160C</strong> <strong>XC3042-100TQ100C</strong> <strong>XC2V500-5FG456C</strong>
<p align="right"><font class="Apple-style-span" color="#000066"><br></font></p>
0